본문 바로가기
코딩/JAVA

생성자(Constructor)_자바의정석

by letsgoit39 2021. 7. 22.
728x90

생성자(Constructor)란?
: 인스턴스가 생성될 때 호출되는 '인스턴스변수 초기화 메서드'
이 때, 좀 더 간결하고 직관적으로 코드를 보기위해 사용되는 메서드?

생성자의 조건
1. 생성자의 이름은 클래스의 이름과 같아야 함.
2. 생성자는 리턴 값이 없다.(그러나 void를 쓰지 않음)
3. 생성자 메서드는 객체 생성시 1회만 호출됨
4. 모든 클래스에는 반드시 하나 이상의 생성자가 있어야 함.

생성자의 형식

클래스이름(타입 변수명, 타입 변수명, ...) {
    // 인스턴스 생성시 수행될 코드
    // 주로 인스턴스 변수의 초기화 코드를 적는다.
}
class Card {
    Card() { //매개변수가 없는 생성자.
    ...
    }

    Card(String k, int num) { //매개변수가 있는 생성자.
    ...
    }
    ...
}


생성자의 수행 순서
Card c = new Card();
1. 연산자 new에 의해서 메모리(heap)에 Card클래스의 인스턴스가 생성
2. 생성자 Card()가 호출되어 수행됨.
3. 연산자 new의 결과로 생성된 Card인스턴스의 주소가 반환되어 참조변수 c에 저장

생성자의 종류
1. 기본생성자(default constructor)
2. 매개변수가 있는 생성자

 

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
class C05Simple {
    //속성
    int x;
    int y;
    int z;
        
    //디폴트 생성자 메서드
        /* 클래스 내에 생성자 메서드코드를 명시하지 않을 때
         * 컴파일러에 의해서 "자동으로 삽입"되는 기본 생성자.
         * 디폴트 생성자는 초기값을 0으로 설정한다.
         * (매개변수가 없고 {}안의 내용은 직접 작성할 수 있음)
         */
    //구조
    C05Simple() 
    {
        System.out.println("디폴트 생성자 호출!");
        x=10;y=20;
    }                            
 
        //구현부_디폴트 생성자
    
    //매개변수가 있는 생성자 메서드
        /* 매개변수 생성자 구현시 주의할 점 : 
         * 호출할 때, 매개변수에 해당하는 값을 넣지 않을 땐
         * C05Simple obj4 = new C05Simple2();
         * 구현부에서 디폴트 생성자를 인위적으로 추가해야함★★★
         * 그렇게 안하면 컴파일 오류!
         * 
         * 호출시 다음과 같이 매개변수에 해당하는 값(4)을 넣어주면
         * C05Simple obj3 = new C05Simple(4);
         * 해당하는 생성자가 구현부에 있기 때문에 오류없음
         */
        /* 인스턴스를 생성한 다음에 인스턴스 변수의 값을 변경하는 것보다
         * 매개변수를 갖는 생성자를 사용하는 것이
         * 코드를 보다 "간결하고 직관적"으로 만든다.
         *  ex)
         *  class Car { String color; String gearType; int door;
         *      Car() {}
         *      Car(String c, String g, int d) {    
 
        //매개변수 생성자
         *          color = c; gearType = g; door = d;}
         *  }
         *  Class CarTest {
         *      public static void main(String[] args) {
         *  Car c = new Car();        ▶    Car c = new Car("white", "auto", 4); //매개변수 생성자 호출
         *  c.color = "white";        ▶    
        *  c.gearType = "auto";     ▶    
        *  c.door = 4;               ▶
         *  }}
         */
    //구조
    C05Simple(int g) //생성자 오버로딩??
//결국 메서드이기때문에 오버로딩이 가능(이름이 같다? 하는일이 같음, 매개변수의 종류와 개수로 구분됨)
    {
        System.out.println("매개변수 생성자 호출! 값 : "+ g);
        z = g;
    }                            
 
        //구현부_매개변수 생성자
    
     
    
}
class C05Simple2 {
    int value;
    C05Simple2()
     {
         System.out.println("Simple2's 디폴트 생성자 호출!");
     }
    C05Simple2(int h)
     {
         System.out.println("Simple2's 매개변수 생성자 호출! 값 : "+ h);
         value = h;
     }
}
 
class C05Simple3 {
    void printS() {
        System.out.println("기본 생성자가 컴파일러에 의해 추가되는 경우는\n"
                + "클래스에 정의된 생성자가 하나도 없을 때 뿐!\n"
                + "이 문장에 해당하는 C05Simple3처럼~\n"
                + "여기선 C05Simple3(){}이 자동으로 추가돼 있음");
    }
}
 
public class ConstructorTest {
    public static void main(String[] args) {
        C05Simple obj = new C05Simple(); //호출부_디폴트 생성자 
            
        System.out.println("obj.x = " + obj.x);
        System.out.println("obj.y = " + obj.y);
        
        C05Simple obj2 = new C05Simple();
        System.out.println("obj2.z = " + obj2.z); //디폴트생성자는 초기값을 0으로 지정
        
        System.out.println();
        C05Simple obj3 = new C05Simple(4); //호출부_매개변수 생성자    
        System.out.println("obj.z = " + obj3.z); 
        
        System.out.println();
        C05Simple2 obj4 = new C05Simple2(); 
        //디폴트생성자가 없으면('C05Simple2(){}') 컴파일 오류남 
        C05Simple2 obj5 = new C05Simple2(22); 
        
        System.out.println();
        C05Simple3 obj6 = new C05Simple3();
        obj6.printS();
    }
 
}
cs

위를 실행시킨 결과이다.

디폴트 생성자 호출!
obj.x = 10
obj.y = 20
디폴트 생성자 호출!
obj2.z = 0

매개변수 생성자 호출! 값 : 4
obj.z = 4

Simple2's 디폴트 생성자 호출!
Simple2's 매개변수 생성자 호출! 값 : 22

기본 생성자가 컴파일러에 의해 추가되는 경우는
클래스에 정의된 생성자가 하나도 없을 때 뿐!
이 문장에 해당하는 C05Simple3처럼~
여기선 C05Simple3(){}이 자동으로 추가돼 있음

기본 생성자가 컴파일러에 의해서 추가되는 경우

클래스에 정의된 생성자가 하나도 없을 때 뿐이다.

 

따라서 매개변수 생성자를 선언하고 호출할 때 매개변수를 넣지 않은 채로 호출하면

(매개변수 생성자를 호출한 것이 아닌 기본생성자를 호출하는 것이고,)

기본생성자를 컴파일러가 자동으로 생성해주지 않기 때문에 에러가 발생한다.

미리미리 기본생성자도 (필요하다면) 꼭 잘 작성해주자.

 

[내 생각]

생성자는 결국 초기화 즉, (처음)값을 넣어주는 역할을 하는 것이고,

어떤 클래스의 필드를 사용하기 위해서

호출할 때마다 초기화를 해주는 것이 아닌

초기화하는 틀(Car(String c, String g) {color = c; gearType = g;})로

그 클래스의 필드와 연결(Car c1 = new Car();)해주는 역할을 한다..?

 

간결하고 직관적으로 쉽게 보기 위해 사용하는 '틀(또는 테투리, 뼈대, 도구?)'이라고 생각하면 좋지 않을까?

 

728x90