java/객체지향

9. 생성자(constructor)

VanillaSky7 2023. 1. 16. 01:27

생성자(constructor)?


생성자(constructor)는 인스턴스가 생성되면서 호출되게 되는 인스턴스 초기화 메서드를 의미합니다. 여기서 인스턴스 초기화 메서드는

 

우리가 사용하고자 하는 로직을 블록으로 감싸서 정의하는 것을 의미합니다. (static이 붙으면 인스턴스 초기화가 아니겠지요?)

 

클래스명 참조변수명 = new 클래스명();

 

위 생성 방법처럼 우리가 그동안 인스턴스를 생성하면서 new 연산자 뒤에 무심코 쓰인 클래스명()은 사실 생성자 호출이었던 것입니다!

 


생성자(constructor) 특징


첫 번째, 생성자의 이름은 클래스의 이름과 일치합니다. 생성자 또한 메서드이고, 메서드라는 것은 아래 예제와 같이 오버로딩(overloading)

 

할 수 있음을 의미합니다. (매개변수가 없는 생성자와 매개변수를 가지는 생성자는 뒤에 언급됩니다!)

1
2
3
4
5
6
7
8
9
10
11
12
class Refrigerator2 {
    
    // 매개변수가 없는 생성자(기본 생성자)
    Refrigerator2() {
        
    }
    
    // 매개변수를 가지는 생성자
    Refrigerator2(int temperature, int width, int height) {
        
    }
}
cs

 

 

 

두 번째, 반환값(return값)이 존재하지 않습니다. 생성자의 로직을 한번 살펴보시면, 초기화 하는 역할 즉 값을 대입해주는 역할만을

 

수행하기 때문에 반환값이 존재하지 않습니다. 따라서 항상 반환값이 없다는 얘기는 void 또한 붙여주지 않아도 상관없다는 얘기가 됩니다.

 

 

세 번째, 모든 클래스는 반드시 최소 1개 이상의 생성자를 가져야합니다. 

 


기본 생성자(Default Constructor)?


기본 생성자(Default Constructor)는 매개변수가 없는 생성자를 의미합니다.

 

앞서 모든 클래스는 최소 1개 이상의 생성자를 반드시 가져야 한다고 하였는데, 이때 생성자가 하나도 쓰이지 않고 생략될 경우

 

컴파일러는 알아서 이 기본 생성자를 생성해주게 되는 것입니다. 따라서 그동안 우리가 직접 생성자를 추가해주지 않아도 문제없이

 

사용할 수 있었던 것이었습니다.

 

(자동으로 생성해주더라도 앞으로는 기본 생성자를 직접 생성해주기를 권장합니다!)

 

하지만 1개 이상의 매개변수를 가지는 생성자를 사용할 경우에도 기본 생성자도 따로 생성해주어야 합니다.

 

그 이유는 1개 이상의 생성자를 가질 경우에는 컴파일러가 자동으로 기본 생성자를 생성해주지 않습니다. 또한

 

기본 생성자가 존재하지 않는다면 컴파일러는 우리에게 해당 클래스를 찾지 못한다는 에러 메세지를 보내올 것이기 때문입니다.

 


매개변수를 가지는 생성자


기본 생성자와 달리 매개변수를 가지는 생성자에 대해 알아보도록 하겠습니다. 밑에 인스턴스 생성 후 초기화하는 예시를 살펴보겠습니다.

 

Refrigerator R = new Refrigerator();

R.temperature = 15;

R.width = 100;

R.height = 150;

 

참조변수 R을 통해 Refrigerator 인스턴스를 생성하였고, 우리가 사용하고자 하는 인스턴스 변수들을 초기화하였습니다.

 

하지만 문제가 있습니다. 인스턴스 한 개가 아닌 여러 개를 생성하여 모두 초기화할 때에 저 네 줄짜리의 코드를 지속적으로

 

작성해야 합니다.

 

Refrigerator R = new Refrigerator(15, 100, 150);

 

이때, 매개변수를 가지는 생성자를 통해서 간단하게 인스턴스를 생성할 수 있다면 상당히 편리할 것입니다.

 


코드


 

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
class Refrigerator2 {
    
    int temperature;
    int width;
    int height;
    
    // 매개변수가 없는 생성자(기본 생성자)
    Refrigerator2() {}
    
    // 매개변수를 가지는 생성자
    Refrigerator2(int a, int b, int c) {
        temperature = a;
        width = b;
        height = c;
        
    }
}
 
class Refrigerator3 {
    
    int temperature;
    int width;
    int height;
    
    // 생성자가 하나도 없다면 굳이 작성하지 않아도 컴파일러가 자동으로 생성
    // 하지만 직접 생성해주는 것을 권장
    Refrigerator3() {}
}
 
 
public class Constructor {
 
    public static void main(String[] args) {
        
        
        // 매개변수를 가지는 생성자를 사용
        Refrigerator2 R1 = new Refrigerator2(15300400);
        
        System.out.println(R1.temperature);
        System.out.println(R1.width);
        System.out.println(R1.height);
        
        // 매개변수가 없는 생성자(기본 생성자) 사용
        Refrigerator3 R2 = new Refrigerator3();
        
        // 인스턴스를 생성할 때 마다 다음의 변수들을 계속 초기화해주어야 함
        R2.temperature = 20;
        R2.width = 150;
        R2.height = 200;
        
        System.out.println(R2.temperature);
        System.out.println(R2.width);
        System.out.println(R2.height);
        
    }
 
}
cs