06-1 객체 지향 프로그래밍
▶ 객체란?
쉽게 말하면, 속성을 가지고 있는 무언가
어렵게 말하면, 속성(필드)과 기능(메소드)이 묶인 프로그램 단위.
처음 객체지향 프로그래밍을 배울 때 예시로 들었던 자동차를 생각하면 쉽다.
자동차의 색이라는 속성, 움직이는 기능이 있기 때문에 자동차를 객체로서 다룰 수 있는 것이다.
Q. 왜 자바에서는 필드 & 메소드라고 해요..? C++에서는 멤버 변수 & 멤버 함수 아니었음?
A. 두 표현 다 맞는데 아무래도 자바에서는 '필드', '메소드' 라는 단어를 쓰는 것 같음. 같은 의미이니 그냥 그러려니 하고 넘어가자!
▶ 객체 지향 프로그래밍이란?
완성품 객체를 모델링하기 위해 부품 객체들을 '조립'하는 것
cf. 잘 조립하는 방법
- 객체를 잘 설계해야함 (인터페이스, 추상 클래스 등)
- 객체들의 관계를 잘 연결해야 함 (접근 제어자, 상속 관계 등)
▶ 객체 사용 방법
(c++을 배웠던 나는 몸으로 기억하고 있는 것)
0. 클래스의 이름과 소스파일의 이름은 동일해야 함 → 이클립스가 자동으로 해줌
1. class를 선언하여 필드, 메소드 등을 설계
2. class 이름을 타입처럼 사용하여 객체(인스턴스) 선언 → new와 생성자를 이용
3. 객체에 dot 연산자(.)를 사용하여 필드, 메소드 사용
▶ 실행 클래스 vs 라이브러리 클래스
클래스에는 두가지 용도가 있다. 하나는 라이브러리 용도이고, 다른 하나는 실행 용도이다.
프로그램 전체에서 클래스가 100개라면 99개는 라이브러리 클래스, 1개가 실행용 클래스인데,
실행용 클래스에는 main 함수가 있다.
main 함수가 없는 나머지 클래스들은 라이브러리 클래스라고 생각하면 된다.
실행용 클래스에서 라이브러리 클래스를 import하여 사용한다.
(이클립스에서 새로운 클래스를 만들면, public static void main을 추가하는 옵션을 주는데,
이는 타이핑을 줄여주는 기능이자, '이 클래스를 실행용 클래스로 만들것인가?'에 대한 옵션이었다.)
▶ 하나의 파일에 여러 클래스를 선언한다면?
보통은 하나의 파일에 한개의 클래스만을 선언하지만 여러 클래스를 선언하는 것도 가능하긴 하다.
하지만 컴파일하면 결국 선언한 개수만큼의 바이트코드 파일(.class)이 생성된다.
즉, 소스 파일은 클래스를 담는 저장단위이고, 자바의 본질은 클래스라는 것도 여기서 확인할 수 있다.
자바는 결국 클래스들이 조립되어 돌아가는 프로그램이다.
👉🏻클래스들을 잘 조립하여 하나의 완성품을 만드는 이것이 객체지향 프로그램의 본질이기 때문이다.
cf. 이처럼 여러 클래스를 한 파일에서 선언하는 경우,
파일의 이름과 동일한 클래스에만 public 접근 제한자를 붙일 수 있다.
▶ 클래스 구성 요소
- 필드
- 생성자
- 메소드
* 일반적으로 클래스 안에서 위 순서대로 정의함
06-3 생성자
Intro.
자바에서 객체를 생성할 때애는 반드시 new + 생성자 이름 + ( )을 해줘야 한다.
또 클래스 내부에서 생성자를 선언하지 않더라도 기본 생성자가 자동으로 만들어지므로
모든 객체는 생성자를 거쳐 만들어지게 되어있다.
클래스 구성 요소 중 메소드, 필드에 비해 생성자를 등한시 여기는 경향이 있는데, (제가요..ㅠ)
객체 생성의 기본이 되는 만큼 열심히 공부해보자!
⭐ 생성자 기본 상식 ⭐
- 클래스와 이름이 동일해야 한다.
- 리턴 타입이 없다.
- 접근 제어자로 public이 오거나 아무것도 오지 않는다.
- 객체 생성 시 필드 초기화를 담당한다. (but, 모든 필드를 생성자에서만 초기화해야할 필요는 없음)
- 오버라이딩이 가능하다.
▶ 기본 생성자
클래스 내부에서 생성자 선언을 생략하면, 컴파일러가 자동으로 만들어주는 생성자.
소괄호와 중괄호 모두 비어있는 형태이다.
즉, 어떤 매개변수도 받지 않고 어떤 기능도 하지 않는다.
만약 클래스 내부에 생성자가 하나라도 있다면, 컴파일러는 기본 생성자를 만들지 않는다.
따라서 다른 생성자가 있는 상태에서 '컴파일러가 기본 생성자 만들어주겠지'하고 Car( ){ }을 선언하지 않고
Car dreamCar = new Car( );를 실행하면 오류가 발생한다.
=> 생성자를 하나라도 선언하면 기본 생성자는 만들어지지 않음
클래스가 public으로 선언되어있으면 기본 생성자에도 public이 붙는다.
Ex. public class Car { } 을 컴파일한 바이트코드 파일에는
public class Car { public Car( ) { } }으로 텅 빈 기본 생성자가 들어가있다.
▶ 필드 초기화
자바에서는 필드를 초기화하지 않으면 기본 값으로 필드가 초기화된다. ex. int -> 0 / String -> null
* 기본값으로 할당하는게 목적이라 해도, 명시적으로 표시해두는게 좋다!
필드 초기화는 ① 필드 선언 시 초기화 ② 생성자 내부에서 초기화 하는 방법이 있다.
②번의 경우, 외부에서 값을 받아 초기화해야 하는 경우 주로 사용한다.
필드 선언 시 초기화를 했더라도, 생성자 내부에서 한번 더 초기화하여 ①을 default 느낌으로 사용할 수도 있다.
이때 관례적으로 생성자의 매개변수 이름은 필드의 이름과 동일하게 하고, 필드의 경우 this. 를 붙여준다.
▶ 생산자 오버로딩 (Overloading)
cf. 오버로딩(overloading) : 한 클래스 안에 이름이 같은 메서드를 여러개 정의하는 것
cf. 오버라이딩(overriding) : 상속받은 메서드의 내용을 변경하는 것
생산자는 매개변수의 타입, 개수, 순서를 달리주어 오버로딩을 할 수 있다.
메서드 오버로딩 주의점 - 매개변수의 '이름'이 다르거나, '리턴타입'이 다르면 어떤 메소드를 사용해야 하는지 구분하지 못하므로 잘못된 오버로딩이다. (물론 생산자는 리턴타입이 없어서 후자는 해당사항 없음)
Ex. Car(int number){ }와 Car(int speed){ }는 잘못된 오버로딩이다.
public class Car {
String compay = "현대자동차";
String model;
String color;
int maxSpeed;
Car(){
}
Car(String model){
this.model = model;
}
Car(String model, String color){
this.model = model;
this.color = color;
}
Car(String model, String color, int maxSpeed){
this.model = model;
this.color = color;
this.color = color;
}
}
▶ 클래스 안의 다른 생성자 호출 - this( )
this는 인스턴스 자신을 가리키는 키워드로, this( )는 곧 Car( )을 의미한다.
이를 이용하면 생성자 오버로딩 시, 중복되는 코드를 단순화할 수 있다.
※ this( )는 반드시 생성자의 첫 줄에서 호출해야 한다.
this( ) 역시 오버로딩 된 생성자이므로, 매개변수의 타입과 개수로 어떤 생성자를 사용하고자 하는지를 명확히 해줘야 한다.
public class Car {
String compay = "현대자동차";
String model;
String color;
int maxSpeed;
Car(){
this("그랜저", "검은색", 200);
}
Car(String model){
this(model, "검은색", 200);
}
Car(String model, String color){
this(model, color, 200);
}
Car(String model, String color, int maxSpeed){
this.model = model;
this.color = color;
this.maxSpeed = maxSpeed;
}
}
'JAVA > 혼공자' 카테고리의 다른 글
[혼공자] Chapter. 07-1 상속 (1) | 2022.07.31 |
---|---|
[혼공자] Chapter 06-4~6 메소드, 인스턴스 멤버, 패키지와 접근 제한자 (2) | 2022.07.30 |
[혼공자] Chapter 05-3 열거 타입 (0) | 2022.07.26 |
[혼공자] Chapter 05-2 배열 (0) | 2022.07.23 |
[혼공자] Chapter 05-1 참조 타입과 변수 (1) | 2022.07.23 |