IT 개발노트
생성자 본문
1. 생성자
1.1 생성자(constructor)란?
- 인스턴스가 생성될 때마다 호출되는 '인스턴스 초기화 메서드'
(인스턴스 초기화 : 인스턴스 변수에 적절한 값을 저장하는 것)
- 인스턴스 변수의 초기화 또는 인스턴스 생성시 수행할 작업에 사용
- 몇가지 조건을 제외하고는 메서드와 같다.
- 모든 클래스에는 반드시 하나 이상의 생성자가 있어야 한다.
1.2 생성자의 조건
- 생성자의 이름은 클래스의 이름과 같아야 한다.
- 생성자는 리턴값이 없다. (하지만 void를 쓰지 않는다.)
클래스이름(타입 변수명, 타입 변수명,...) {
// 인스턴스 생성시 수행될 코드
// 주로 인스턴스 변수의 초기화 코드를 적는다.
}
class Card {
...
Card() { // 매개변수가 없는 생성자.
// 인스턴스 초기화 작업
}
Card(String kind, int number) { // 매개변수가 있는 생성자
// 인스턴스 초기화 작업
}
}
1.3 기본 생성자(default constructor)
- 기본 생성자란?
-> 매개변수가 없는 생성자
-> 클래스에 생성자가 하나도 없으면 컴파일러가 기본 생성자를 추가한다.
(생성자가 하나라도 있으면 컴파일러는 기본 생성자를 추가하지 않는다.)
클래스이름() { }
Card() { } // 컴파일러에 의해 추가된 Card클래스의 기본 생성자. 내용이 없다.
--> 모든 클래스에는 반드시 하나 이상의 생성자가 있어야 한다. (생성자가 없을 시 컴파일러가 기본 생성자를 추가해준다.)
class Data1 {
int value;
}
class Data2 {
int value;
Data2(int x) { // 매개변수가 있는 생성자
value = x;
}
}
class ConstructorTest {
public static void main(String[] args) {
Data1 d1 = new Data1();
Data2 d2 = new Data2(); // compile error발생
}
}
--> Data1의 경우 아무런 생성자도 정의하지 않았기 때문에 컴파일러가 기본생성자를 추가해주기 때문에 정상작동한다. 하지만 Data2의 경우 생성자를 정의했기 때문에 컴파일러가 기본생성자를 만들지 않아서 위와 같은 코드는 에러가 발생한다.
1.4 매개변수가 있는 생성자
1.5 생성자에서 다른 생성자 호출하기 - this()
- this() : 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용. 다른 생성자 호출은 생성자의 첫 문장에서만 가능
Car() {
door = 5;
this("white","auto",4);
}
--> 위에 코드는 door를 5로 초기화 했지만 this("white","auto",4);에 의해서 door가 4로 변경된다. 첫 문장에서 작업한 내용이 의미가 없어지기 때문에 다른 생성자 호출은 생성자의 첫 문장에서만 가능하다.
1.6 참조변수 this
- this : 인스턴스 자신을 가리키는 참조변수. 인스턴스의 주소가 저장되어있음. 모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재
class Car {
String color;
String gearType;
int door;
Car() {
// Car("white","auto",4);
this("white","auto",4);
}
Car(String c, String g, int d) {
color = c; // color는 인스턴스변수, c는 지역변수
gearType = g;
door = d;
}
Car(String color, String gearType, int door) {
this.color = color; // this.color는 인스턴스변수, color는 지역변수
this.gearType = gearType;
this.door = door;
}
}
--> 인스턴스변수와 지역변수를 구별하기 위해 참조변수 this사용
1.7 생성자를 이용한 인스턴스의 복사
- 인스턴스간의 차이는 인스턴스변수의 값 뿐 나머지는 동일하다.
- 생성자에서 참조변수를 매개변수로 받아서 인스턴스변수들의 값을 복사한다.
- 똑같은 속성값을 갖는 독립적인 인스턴스가 하나 더 만들어진다.
class Car {
String color;
String gearType;
int door;
Car() {
this("white","auto",4);
}
Car(String color, String gearType, int door) {
this.color = color;
this.gearType = gearType;
this.door = door;
}
Car(Car c) { // 인스턴스의 복사를 위한 생성자.
// color = c.color;
// gearType = c.gearType;
// door = c.door;
this(c.color, c.gearType, c.door);
}
}
class carTest {
public c1 = new Car();
Car c2 = new Car(c1); // Car(Car c)를 호출
}