본문 바로가기

JAVA/JAVA

[자바의 정석] 3-5 생성자

생성자(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가지 사항을 결정해야 함
  · 클래스 : 어떤 클래스의 인스턴스를 생성할 것인가?
  · 생성자 : 선택한 클래스의 어떤 생성자로 인스턴스를 생성할 것인가?

 

 

출처 : <자바의 정석>, 남궁 성