인스턴스의 초기화
생성자란 인스턴스 초기화 메서드
연산자 new가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것이 아니다.
- 생성자의 이름은 클래스의 이름과 같아야 한다.
- 생성자는 리턴 값이 없다.
1
2
3
|
class Name{ //클래스이름과 생성자이름은 동일하다
Name(){ } //void 생략
}
|
cs |
생성자는 반환타입에 void를 붙이지 않아도 된다. 원래 void를 붙여야 하지만, 모든 생성자의 반환타입이 void이기 때문에 생략가능하게 한 것이다.
생성자 역시 오버로딩이 가능하다.
1
2
3
4
5
6
7
8
9
|
class Name{ //클래스이름과 생성자이름은 동일하다
int x;
int y;
Name(int a){ x = a; }
Name(int a, int b ){
x = a;
y = b;
}
}
|
cs |
생성자의 오버로딩에서 주의할 점은, 생성자를 작성하지 않았을 때는 컴파일러가 기본생성자 '생성자이름()' 를 추가하지만, 생성자를 작성하면 컴파일러가 기본생성자를 추가하지 않는다는 것이다. 컴파일러가 기본생성자를 추가하는 경우는 클래스 내에 생성자가 하나도 없을 때 뿐이다. 따라서 위의 클래스의 인스턴스를 Name n = new Name(); 으로 생성하려고 하면 에러가 발생한다. 따라서 생성자 작성시에는 반드시 직접 기본생성자를 작성해야 한다.
생성자에서 다른 생성자 호출 - this, this()
같은 클래스의 생성자는 서로를 호출할 수 있다. 생성자 간 호출 시 규칙은 다음과 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
// 생성자의 이름으로 클래스이름 대신 this를 사용한다.
// 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.
class Name{ //클래스이름과 생성자이름은 동일하다.
int x;
int y;
Name(){
this(0, 0); } Name(int a){ this(a, 0);
}
Name(int a, int b ){
x = a;
y = b;
}
}
|
cs |
|
한편, 이름이 같은 iv와 lv를 구분하기 위해서 iv의 앞에 참조변수 대신 this.를 붙인다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
// 생성자의 이름으로 클래스이름 대신 this를 사용한다.
// 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.
class Name{ //클래스이름과 생성자이름은 동일하다.
int x;
int y;
Name(){
this(0, 0);
}
Name(int a){
this(a, 0);
}
Name(int x, int y){
this.x = x; //iv와 lv가이름이 동일할 때
this.y = y; //iv에 this.를 붙여 구분한다.
}
}
|
cs |
이때 this. 는 인스턴스 자기 자신을 가리키는 참조변수이다.
'Java > Java의 정석 - 객체지향프로그래밍' 카테고리의 다른 글
상속(inheritance) (0) | 2022.02.05 |
---|---|
변수의 초기화 (0) | 2022.02.03 |
OOP - 오버로딩(overloading) (0) | 2022.02.03 |
클래스 메서드(static메서드)와 인스턴스 메서드 (0) | 2022.02.03 |
변수와 메서드 (0) | 2022.02.03 |