반응형
이전에 배운 내용
[JAVA] 지역변수와 상수
이전에 배운 내용 [JAVA] 인스턴스 멤버와 클래스 멤버 [JAVA] 인스턴스 멤버와 클래스 멤버 이전에 배운 내용 [JAVA] 메서드 오버로딩 println( ); , 기본형 참조형 매개변수 [JAVA] 메서드 오버로딩 println
dev-story93.tistory.com
생성자란?
객체가 생성될 때 호출되며 객체를 초기화해준다.
생성자를 선언하고 호출은 어떻게 하는가?
public Car() {} // 선언
...
Car car = new Car(); // 호출
- 생성자는 반환 타입이 없고 이름은 클래스의 이름과 동일합니다.
- new 연산자에 의해 객체가 생성되면서 Car(); 즉, 생성자가 호출됩니다.
기본생성자
기본생성자는 생성자를 선언할 때 괄호( ) 안에 아무것도 넣지 않는 생성자이다.
모든 클래스는 반드시 생성자 하나가 존재한다.
클래스 내에 생성자를 선언하지 않더라도 컴파일러는 기본생성자를 자동으로 생성시켜 준다.(그러므로 우리는 기본생성자를 생략할 수 있다)
반대로 생성자가 선언되었다면 컴파일러는 기본생성자를 생성하지 않는다
public class Car {
public Car(String model) {} // 생성자 선언
// 생성자가 한개 이상 선언되었기 때문에 기본 생성자를 추가하지 않음.
}
기본생성자를 선언하지 않아 컴파일러에 의해 생성되었을 때 기본생성자는 해당클래스의 접근제어자(public... 등)를 따른다.
public class Car {
public Car() {} // 컴파일러가 추가시켜줌
}
class Car {
Car() {} // 컴파일러가 추가시켜줌
}
필드 초기화와 생성자 오버로딩
필드초기화
생성자는 객체를 초기화하는 역할을 수행한다
- 객체를 만들 때 인스턴스마다 다른 값을 가져야 한다면 생성자를 통해서 필드를 초기화할 수 있습니다.
- 예를 들어 만들어지는 자동차마다 모델, 색상, 가격이 다르다면 생성자를 사용하여 필드의 값을 초기화하는 것이 좋습니다.
- 반대로 인스턴스마다 동일한 데이터를 가지는 필드는 초기값을 대입하는 것이 좋습니다.
- 예를 들어 자동차가 만들어질 때마다 기어의 상태를 ‘P’로 고정해야 한다면 초기값을 직접 대입하는 것이 좋습니다.
- 주의할 점!
- 생성자를 통해 필드 값을 초기화하고 기본 생성자를 작성하지 않았는데 기본 생성자를 호출한다면?
public Car(String modelName, String colorName, double priceValue) {
model = modelName;
color = colorName;
price = priceValue;
}
...
Car car = new Car(); // 오류 발생
- 한 개 이상의 생성자가 존재하기 때문에 컴파일러가 자동으로 기본 생성자를 추가해주지 않기 때문에 기본 생성자가 존재하지 않아 오류가 발생합니다.
생성자 오버로딩
생성자를 통해 필드를 초기화할 때 오버로딩을 적용할 수 있습니다.
- 예를 들어 우리가 자동차를 생성할 때 모델, 색상, 가격이 다른 자동차를 여러 대 생성할 수도 있고 색상만 다른 자동차를 여러대 생성할 수도 있기 때문에 오버로딩을 사용하면 이를 효율적으로 처리할 수 있습니다.
- 주의할 점!
- 오버로딩을 할 때 개수, 타입, 순서가 동일한데 매개변수명만 다르게 하는 경우는 오버로딩 규칙에 위배되기 때문에 오류가 발생합니다!
public Car(String modelName, String colorName, double priceValue)
public Car(String colorName, String modelName, double priceValue)
- modelName과 colorName 매개변수의 위치가 다르기 때문에 가능할 것처럼 보이지만
- String, String, double : 매개변수의 개수, 타입, 순서가 동일하기 때문에 중복이 불가능
this와 this( )
this
객체, 인스턴스 자신을 표현하는 키워드
객체 내부 생성자 및 메서드에서 객체 내부 멤버에 접근하기 위해 사용될 수 있다.
public Car(String model, String color, double price) {
model = model;
color = color;
price = price;
}
- 만약 이처럼 생성자를 선언하는데 매개변수명과 객체의 필드명이 동일할 경우 오류가 발생하지는 않지만 생성자 블록 내부에서 해당 변수들은 객체의 필드가 아닌 가장 가까운 매개변수명을 가리키게 됨으로 자기 자신에게 값을 대입하는 상황이 되어 버립니다.
- 이럴 경우에 this 키워드를 사용하면 해결할 수 있습니다.
- 생성자를 사용할 때는 항상 this를 사용하라!!
public Car(String model, String color, double price) {
this.model = model;
this.color = color;
this.price = price;
}
- this 키워드를 통해 변수명에 해당하는 객체의 필드에 접근하여 받아온 매개변수의 매개값을 객체의 필드에 대입하여 저장할 수 있습니다.
- 또한 this는 인스턴스 자신을 뜻하기 때문에 객체의 메서드에서 리턴타입이 인스턴스 자신의 클래스 타입이라면 this를 사용하여 인스턴스 자신의 주소를 반환할 수도 있습니다.
Car returnInstance() {
return this;
}
this()
객체 즉, 인스턴스 자신의 생성자를 호출하는 키워드
- 객체 내부 생성자 및 메서드에서 해당 객체의 생성자를 호출하기 위해 사용될 수 있습니다.
- 생성자를 통해 객체의 필드를 초기화할 때 중복되는 코드를 줄여줄 수 있습니다.
public Car(String model) {
this.model = model;
this.color = "Blue";
this.price = 50000000;
}
public Car(String model, String color) {
this.model = model;
this.color = color;
this.price = 50000000;
}
public Car(String model, String color, double price) {
this.model = model;
this.color = color;
this.price = price;
}
- 이렇게 생성자를 선언한다고 했을 때 코드의 중복이 발생합니다.
- 이때 this() 키워드를 사용하면 코드의 중복을 제거할 수 있습니다.
public Car(String model) {
this(model, "Blue", 50000000);
}
public Car(String model, String color) {
this(model, color, 100000000);
}
public Car(String model, String color, double price) {
this.model = model;
this.color = color;
this.price = price;
}
//첫번째와 두번째 모두 어찌 되었건 세번째와 동일한 구성으로 가져야하니 this를 이용해 사용하면 코드중복을 줄일수있다.
- 주의할 점!!
- this() 키워드를 사용해서 다른 생성자를 호출할 때는 반드시 해당 생성자의 첫 줄에 작성되어야 합니다.
public Car(String model) {
System.out.println("model = " + model);
this(model, "Blue", 50000000);
}
- 이처럼 this() 키워드로 다른 생성자 호출 이전에 코드가 존재하면 오류가 발생한다.
다음은 접근 제어자에 대해 알아보자!
반응형
'언어(language) > 자바(Java)' 카테고리의 다른 글
| [JAVA] package와 import (2) | 2023.10.19 |
|---|---|
| [JAVA] 접근제어자 (0) | 2023.10.19 |
| [JAVA] 지역변수와 상수 (0) | 2023.10.19 |
| [JAVA] 인스턴스 멤버와 클래스 멤버 (2) | 2023.10.19 |
| [JAVA] 메서드 오버로딩 println( ); , 기본형 참조형 매개변수 (0) | 2023.10.19 |