※ 주의: 생성자 코드가 1개라도 작성되어 있다면, 컴파일러는 기본생성자가 없다고 하더라도 기본생성자를 자동으로 생성하지 않는다.
class Data_1 {
int value;
// Data_1() {} 기본 생성자를 자동으로 추가해줌
}
class Data_2 {
int value;
// Data_2() {} 기본 생성자를 넣어줘야함
Data_2(int x){
value = x;
}
}
class test {
public static void main(String[] args) {
Data_1 d1 = new Data1();
Data_2 d2 = new Data2(); // 컴파일 에러 발생
}
}
// The constructor Data_2() is undefined
// 첫번째 클래스는 생성자가 없어서 기본생성자를 자동으로 추가해주지만,
// 두번째 클래스는 생성자가 1개 있기 때문에 기본생성자가 추가해주지 않음. 그래서 직접 넣어야됨.
-> 따라서 기본생성자를 항상 넣어주는 습관이 필요하다
class Car {
String color; // 인스턴스 변수
String gearType;
int door;
Car() {} // 기본생성자
Car(String c, String g, int d) { // 매개변수가 있는 생성자
color = c;
gearType = g;
door = d;
}
}
Car c = new Car();
c.color = "white";
c.gearType = "auto";
c.door = 4;
// 생성자가 없다면 이렇게 인스턴스 변수를 초기화해야하지만
Car c = new Car("white", "auto", 4);
// 생성자를 만들면 간단하게 쓸 수 있다.
class Car {
String color;
String gearType;
int door;
Car() {
color = "white"; // 디폴트 값이 된다.
gearType = "auto";
door = 4;
}
Car(String c, String g, int d) {
color = c;
gearType = g;
door = d;
}
}
위에 있는 Car() 생성자와 아래에 있는 Car(String c, String g, int d) 생성자 간의 코드가 중복된다. 이 중복을 줄이기 위해 위에 있는 생성자에서 아래에 있는 생성자를 호출하도록 바꿔보자.
Car() {
//Car("white","auto",4);
this("white","auto",4);
}
this() 생성자를 사용해서 코드의 중복을 제거한 모습이다.
class MyMath2 {
long a, b; // 인스턴스 변수, this.a, this.b 이나 생략가능
MyMath2(int a, int b) { // 생성자
this.a = a; // this.a 인스턴스 변수, a 지역변수
this.b = b; // this.b 인스턴스 변수, b 지역변수
}
long add() { // 인스턴스 메서드
return a + b; // return this.a+ this.b;
}
static long add(long a, long b) { // 클래스 메서드(static 메서드)
return a + b; // this. 사용 불가
}
}
[자바의 정석 - 기초편]ch6-32~35 생성자, 기본 생성자
[자바의 정석 - 기초편] ch6-36,37 생성자 this(), 참조변수 this
[Java] 자바 - 생성자의 목적, 특징, 사용법 (Constructor)