생성자(Constructor)
생성자란?
- 생성자는 인스턴스가 생성될 때 호출되는 '인스턴스 초기화(인스턴스변수들을 초기화하는 것) 메서드'
1. 생성자의 이름은 클래스의 이름과 같아야 함
2. 생성자는 리턴 값이 없음
- 생성자도 오버로딩이 가능하므로 하나의 클래스에 여러개의 생성자가 존재할 수 있음
- 연산자 new가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것이 아님!
클래스이름(타입 변수명, 타입 변수명, ... ) {
//인스턴스 생성 시 수행될 코드,
//주로 인스턴스 변수의 초기화 코드를 적음
}
Bus c = new Bus(); // Bus() --> 생성자!
기본 생성자(default constructor)
- 컴파일 할 때, 소스파일(*.java)의 클래스에 생성자가 하나도 정의되지 않은 경우 컴파일러는 자동적으로 기본 생성자를 추가하여 컴파일 함
- 매개변수가 있는 생성자를 선언해두었을 경우 인스턴스를 생성할 때도 매개변수를 넣어주어야 함
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
class Data1 {
int value;
}
class Data2 {
int value;
Data2(int x) { // 매개변수가 있는 생성자
value =x;
}
}
public class ConstructorTest {
public static void main(String[] args) {
Data1 d1 = new Data1(); // 생성자를 선언하지 않았으므로, 컴파일 시 자동으로 생성자가 선언됨
// Data2 d2 = new Data2(); // compile error 발생
Data2 d2 = new Data2(10); // OK
}
}
|
cs |
매개변수가 있는 생성자
- 생성자도 메서드처럼 매개변수를 선언하여 호출 시 값을 넘겨받아서 인스턴스의 초기화 작업에 사용할 수 있음
- 인스턴스를 생성한 다음에 인스턴스변수의 값을 변경하는 것보다 매개변수를 갖는 생성자를 사용하는 것이 코드를 보다 간결하고 직관적으로 만듦
생성자에서 다른 생성자 호출하기 - this(), this
- 아래 두 조건을 만족하면 생성자 간에도 서로 호출이 가능함
- 생성자의 이름으로 클래스이름 대신 this를 사용함
- 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능함
1
2
3
4
|
Car (String color) {
door = 5; // 첫번째줄
Car(color, "auto", 4); // 에러1. 생성자의 두 번째 줄에서 다른 생성자 호출
} // 에러2. this(color, "auto", 4);
|
cs |
- 생성자에서 다른 생성자를 첫 줄에서만 호출이 가능하도록 한 이유는 생성자 내에서 초기화 작업도중에 다른 생성자를 호출하게 되면, 호출된 다른 생성자 내에서도 멤버변수들의 값을 초기화를 할 것이므로 다른 생성자를 호출하기 이전의 초기화 작업이 무의미해질 수 있기 때문
예제6-25
- this는 참조변수로 인스턴스 자신을 가리킴
- static메서드에서는 인스턴스 멤버들을 사용할 수 없는 것처럼, this 역시 사용할 수 없음
>> static 메서드는 인스턴스를 생성하지 않고도 호출될 수 잇으므로 static 메서드가 호출된 시점에 인스턴스가 존재하지 않을 수도 있기 때문
this : 인스턴스 자신을 가리키는 참조변수, 인스턴스 주소가 저장되어 있음
모든 인스턴스메서드에 지역변수로 숨겨진 채로 존재함
this(), this(매개변수) : 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용
- 인스턴스를 생성할 때는 2가지 사항을 결정해야 함
· 클래스 : 어떤 클래스의 인스턴스를 생성할 것인가?
· 생성자 : 선택한 클래스의 어떤 생성자로 인스턴스를 생성할 것인가?
출처 : <자바의 정석>, 남궁 성
'JAVA > JAVA' 카테고리의 다른 글
[자바의 정석] 7-2. 오버라이딩(overriding) (0) | 2020.03.16 |
---|---|
[자바의 정석] 7-1 상속 (0) | 2020.03.12 |
[자바의 정석] 3-4 오버로딩(overloading) (0) | 2020.03.11 |
[자바의 정석] JVM의 메모리 구조 (0) | 2020.03.11 |
[자바의 정석] 6-1 객체지향언어 (0) | 2020.03.09 |