자바의 정석의 내용을 정리하였습니다.
생성자는 메서드다.
생성자는 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'이다.
조건
코드 예
Card C = new Card();
뜻도 모르고 써왔던 Card(); → "클래스이름()" 이 바로 생성자였다.
인스턴스를 생성할 때는 반드시 클래스 내에 정의된 생성자 중 하나를 선택하여 지정해야한다.
매개변수가 있는 생성자
생성자도 메서드처럼 매개변수를 선언하여 호출 시 값을 넘겨받아 인스턴스 초기화에 사용할 수 있다.
인스턴스마다 각기 다른 값으로 초기화해주는 경우가 많아서 유용하게 쓰인다.
class Car {
String color; // 색상
String gearType; // 변속기의 종류 - auto, manual
int door; // 문의 개수
Car() {} // 생성자
Car(String c, String g, int d){ // 생성자
color = c;
gearType = g;
door = d;
}
}
매개변수가 있는 생성자를 활용하면 인스턴스 생성과 동시에 원하는 값으로 초기화하여 코드를 줄일 수 있다.
class CarTest {
public static void main(String[] args) {
Car c1 = new Car(); // 생성자, Car클래스를 인스턴스화 → c1에 담는다.
c1.color = "white"; // c1의 인스턴스에 접근
c1.gearType = "auto";
c1.door = 4;
Car c2 = Car("White","auto",4);
}
}
위 코드의 c1.color와 c2.color를 출력해보면 동일하다.
나머지 인스턴스 값도 마찬가지이다.
생성자간 호출 ( this(), this )
같은 클래스의 변수간 호출이 가능하듯,
생성자간 호출도 가능하다.
단, 두 가지 조건을 만족해야한다.
다음은 에러코드이다.
Car (String color){
door = 5; // 첫 째줄
Car(color, "auto", 4); // 에러1. 첫 째줄에서 호출해야함.
// 에러2. Car()가 아닌 this로 호출해야함.
}
다음은 올바른 코드이다.
. . .
Car(){
this("white","auto",4); // Car(String color, String gearType, int door)를 호출
}
Car (String color){
this(color, "auto", 4); // color 값 초기화
}
Car(String color, String gearType, int door){
this.color = color; // this가 가르키는 값(Car())을 color로 초기화
this.gearType = gearType; // this.color는 인스턴스 변수이고 color는 생성자의 매개변수이다. 서로 구별이 가능하다.
this.door = door;
}
생성자의 매개변수와 인스턴수변수의 이름이 일치하는 경우는 자주 발생한다.
이런 경우 this를 통해 구분하도록 한다.
생성자를 이용한 인스턴스 복사
코드로 확인하자
class Car {
String color;
String gearType;
int door;
Car() {
this("white",auto,4);
}
Car(Car c){ // 1! 인스턴스 복사를 위한 생성자
color = c.color;
gearType = c.gearType;
door = c.door;
}
}
주석 1!의 코드는 Car 클래스의 참조변수를 매개변수로 선언한 생성자이다.
매개변수로 넘겨진 참조변수가 지칭하는 Car인스턴스의 인스턴스 변수인 color, gearType, door의 값을 인스턴스 자신으로 복사한다.
위 코드의 1! 줄은 다시 한 번 아래와 같이 개선할 수 있다.
Car(Car c){
// Car(String color, String gearType, int door)
this(c.color, c.gearType, c.door);
}
객체지향적 코드를 위해서는 반드시 필요한 개념이다.
머리에 새겨넣자.
인스턴스를 생성할때는 다음의 2가지 사항을 결정해야한다.