반응형
생성자를 잘 활용하면 보다 간결하고 직관적인 객체지향적인 코드 작성이 가능하다
인스턴스가 생성될 때 호출되는 ‘인스턴스 초기화 메서드’
- 인스턴스 변수의 초기화 작업 혹은 인스턴스 생성 시에 실행되어야 하는 작업을 위해서 사용된다.
인스턴스를 생성할 때는 다음의 2가지 사항을 결정해야 한다.
- 클래스 - 어떤 클래스의 인스턴스를 생성할 것인가?
- 생성자 - 선택한 클래스의 어떤 생성자로 인스턴스를 생성할 것인가?
class Card {
//인스턴스 변수(개별 속성)
String kind; //무늬
int number; //숫자
//클래스 변수(공통 속성)
static int width = 100;
static int height = 250;
Card(String kind, int number){
this.kind = kind;
this.number = number;
}
}
Class 내에서 선언
- 생성자의 이름은 클래스의 이름과 같아야 한다.
- 생성자는 리턴값이 없다.
메서드 처럼 매개변수를 선어하여 호출하면 인스턴스 생성하는 동시에 원하는 값을 초기화 할 수 있다.
💡 new 연산자가 인스턴스를 생성한다. → 생성자가 인스턴스 생성하는 것이라고 착각하지 말기
생성자를 정의하지 않고도 인스턴스를 생성할 수 있던 이유는 생성자를 정의하지 않으면 컴파일러가 ‘클래스이름(){}’ 형태의 기본생성자(default constructor)를 제공한다.
- 클래스의 ‘접근 제어자(Access Modifier)’가 public인 경우에는 기본 생성자로 ‘public 클래스이름(){}’이 추가 된다.
💡 기본 생성자가 컴파일에 의해서 추가되는 경우는 클래스에 정의된 생성자가 하나도 없을 때 뿐이다.
생성자에서 다른 생성자 호출하기 - this()
같은 클래스의 멤버들 간에 서로 호출할 수 있는 것처럼 생성자 간에도 서로 호출이 가능하다. (조건이 붙는다.)
- 생성자의 이름으로 클래스이름 대신 this를 사용한다.
- 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.
Car(String color){
// Car(color,5,"auto"); Method call expected 에러 발생
this("color",5,"auto"); // 반드시 첫 줄에서만 호출이 가능하다.
this.door = 5;
}
Car(String color,int door,String type){ //생성자를 만들어줘야 호출이 가능함(당연한 말)
this.color = color;
this.door = door;
this.type = type;
}
생성자 내에서 다른 생성자를 첫 줄에서만 호출이 가능하도록 한 이유는?
생성자 내에서 초기화 작업도중에 다른 생성자를 호출하게 되면 호출한 다른 생성자 내에서 멤버 변수들의 값을 초기화를 할 것 이므로 다른 생성자를 호출하기 이전에 초기화 작업이 무의미해질 수 있기 때문이다.
- 생성자 호출을 통해서 Java내에서 기본값이 적용되는게 아니라 내가 원하는 기본값을 만들 수 있다.
객체 자신을 가르키는 참조변수 - this (‘this’는 참조변수로 인스턴스 자신을 가리킨다.)
- 참조변수를 통해 인스턴스의 멤버에 접근할 수 있는 것처럼 ‘this’로 자신의 인스턴스변수에 접근할 수 있다.
- 인스턴스멤버만 ‘this’를 사용할 수 있다.
- class매서드에서 인스턴스 멤버를 사용할 수 없는 것과 동일하게 다른곳에서 호출된 시점에 인스턴스가 존재하지 않을 수 있기 때문이다.
매개변수이름과 인스턴스 변수이름이 같을 경우 구별이 안된다.
- 인스턴스변수 앞에 this를 붙여서 구별을 해주어야 한다.
- color = color → 둘 다 지역변수로 간주된다.
생성자를 포함한 모든 인스턴스메서드에는 자신이 관련된 인스턴스를 가리키는 참조변수 ‘this’가 지역변수로 숨겨진 채로 존재한다.
- this: 인스턴스 자신을 가르키는 참조변수, 인스턴스의 주소가 저장되어 있다.
- 모든 인스턴스메서드에 지역변수로 숨겨진 채로 존재한다.
- this(), this(매개변수): 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용한다.
this와 this()는 비슷하게 생겼을 뿐 완전히 다르다.
this는 '참조변수' this()는 '생성자'이다.
반응형
'책 > Java의 정석' 카테고리의 다른 글
[java] 오버로딩 오버라이딩 (0) | 2023.02.04 |
---|---|
[java] 상속 (extends) (0) | 2023.02.04 |
[java] static (0) | 2023.02.03 |
[java] 변수의 초기화 (0) | 2023.02.03 |
[java] 선언위치에 따른 변수의 종류 (0) | 2023.02.03 |