Java Section 09 : 생성자
01 생성자의 특징
■ 생성자 : 객체를 생성할 때 호출되어 객체의 초기화를 담당하는 특별한 메서드
- 객체를 생성하고 초기화하려면 반드시 생성자를 호출해야 함.
- 생성자를 통해 객체를 초기화 한다는 것은 필드와 메서드를 호출하는 등 객체를 사용하기 위해 객체를 메모리에 올린다는 것이다.
- 생성자 역시 매개변수를 통해 값을 전달할 수 있다.
클래스명(매개변수1, 매개변수2...) {
}
- 일반 메서드와 달리 반환 타입이 없고 이름은 클래스 이름과 동일
□ 호출 위치 : 객체의 초기화를 담당하기 때문에 객체를 생성할 때만 호출 가능
□ 호출 방법 : new 키워드를 함께 사용
클래스명 객체명 = new 클래스명();
생성자를 통해 객체를 생성하는 방법은 다음과 같다.
■ 기본 생성자 : 생성자를 직접 선언하지 않으면 자바 컴파일러가 기본 생성자를 자동으로 제공해줌. 보통 생략되어 있음
- 자바의 모든 클래스에는 하나 이상의 생성자가 정의되어 있어야 함.
- 개발자가 직접 생성자를 선언하면, 기본 생성자는 제공해주지 않는다.
※ 생성자가 아니라, 클래스에서 필드를 선언하면서 멤버변수를 초기화해줄 수도 있지만, 객체의 값이 모두 달라야한다면 생성자를 통해 값을 전달하고 객체를 생성하는 것이 더 효율적이다.
02 생성자 오버로딩
■ 생성자 오버로딩 : 생성자를 여러 개 선언하는 것. 매개변수를 다르게 해서 다양한 상태로 생성자를 선언할 수 있다.
- 다양한 객체 생성 가능
- 생성자 매개변수의 자료형, 개수, 순서로 생성자를 구분하여 선언할 수 있음
- 매개변수의 개수가 같을 때도, 매개변수의 자료형을 달리하여 오버로딩 구현 가능
public class Book {
Book(String title, int page) { ... } ;
Book(String title, int series) { ... };
이 경우에는 오버로딩 불가능함.
03 this와 this()
1. this : "자기 자신 객체". 객체 자기 자신을 스스로 참조하는 데 사용하는 변수
- 변수를 최대한 구체적이고 명확하게 가리키기 위해 사용, 필드의 이름과 같은 매개변수를 사용할 경우 다음과 같은 상황 발생
Student(String name, int age, int studentID) {
name = name;
age = age;
studentID = studentID;
}
중괄호 안에서 사용하기 위해 선언된 지역변수가 클래스 필드보다 우선순위가 높아서, 대입 연산자를 기준으로 왼쪽/오른쪽 변수 모두 매개변수를 뜻하게 된다.
즉, 매개변수에 매개변수를 넣는 의미 없는 코드가 되는 것.
이를 방지하기 위해 매개변수와 필드를 구분하는 this 키워드를 사용하는 것이다.
2. this() : 같은 클래스 안에 있는 생성자 중 매개변수의 개수, 자료형, 순서에 맞는 다른 생성자를 호출하는 메서드. 생성자 내부에서만 사용 가능하다.
※ this()를 사용하지 않을 경우
...
Phone(String brand, int series) {
this.brand = brand;
this.series = series;
}
Phone(String brand, int series, String color) {
this.brand = brand;
this.series = series;
this.color = color;
}
...
중복되는 코드가 있음
※ this()를 사용할 경우
...
Phone(String brand, int series) {
this.brand = brand;
this.series = series;
}
Phone(String brand, int series, String color) {
this(brand, series);
this.color = color;
}
...
중복되는 코드를 줄일 수 있다.
다만 매개변수가 가장 많은 생성자를 먼저 만들어놓고 그걸 가져다 쓰는 편이 좋음!