Theme. 생성자(constructor)

 

1. 생성자란?

 

생성자는 인스턴스가 생성될 때마다 호출되는 '인스턴스(객체) 초기화 메서드'이다.

객체는 iv(instance variable)의 묶음이므로 , 생성자는 결국 iv 초기화의 역할을 한다.

(물론, 생성자도 매서드이므로 { }안에 수행할 작업을 나타내는 코드를 작성할 수 있다.)

"iv 초기화"란 뭘까?

아래 코드를 보자.

1
2
3
4
5
6
7
8
 
Time t = new Time(); //t라는 인스턴스를 생성
 
//iv 초기화 -> 12시 34분 56
t.hour = 12;
t.minute = 34;
t.second = 56;
 
cs

즉, 만들어진 객체의 변수들에 원하는 값을 넣어놓은 것을 말한다.

 

위 코드는 생성자를 통해 

Time t = new Time(12, 34, 56); 와 같이 나타낼 수 있는데,

이때 "Time()"과 "Time(12, 34, 56)" 부분이 생성자가 호출된 부분이다.

 

생성자를 호출(사용)하기 위해서는 생성자를 추가해놔야 한다.

 

2. 생성자의 조건

 1) 생성자의 이름은 클래스의 이름과 같아야 한다.

 2) 생성자는 리턴 값이 없다.

 3) 모든 클래스는 반드시 한 개 이상의 생성자를 가져야 한다.

 

추가 조건!

모든 생성자는 첫 줄에 다른 생성자를 호출해야 한다.

예를 들어, super(); 을 통해 Object 생성자를 호출하는 방법이 있다.

 

 

 1) 생성자의 이름은 클래스의 이름과 같아야 한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Card {
 
    //기본 생성자(매개변수 없는 생성자)
    Card() {
 
    //인스턴스 초기화 작업
 
    }
 
    //매개변수 있는 생성자
    Card(String str, int number) {
 
    //인스턴스 초기화 작업
 
    }
 
}
cs

클래스이름: Card

이때, 두 생성자는 오버로딩이다.

생성자의 형식은 다음과 같다.

 

1
2
3
4
5
6
7
8
// 생성자 형식
 
클래스 이름(타입 변수명, 타입 변수명, ...) {
 
    인스턴스 생성시 수행될 코드,
    인스턴스 변수의 초기화 
 
}
cs

2) 생성자는 리턴 값이 없다.

 따라서, void를 안 붙인다.

 

3. 생성자의 종류

 1) 기본 생성자(매개변수가 없는 생성자)

  형식: 클래스이름() { }

  기본 생성자 또한 직접 코드를 작성하여 추가해줘야 하지만, 클래스에 생성자가 하나도 없을 때에는 컴파일러가 자동으로 추가해준다.

 따라서, 클래스를 만들면 반드시 기본 생성자를 넣어주는 것을 습관화해야 한다!

 

 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
package test;
 
class Car {
    
    //iv(instance variable = 멤버변수)
    String color;    // 색상
    String gearType; // 변속기 종류(auto, manual)
    int door;        // 문의 개수
    
    //기본 생성자
    Car() {}
 
    //매개변수가 있는 생성자
    Car(String c, String g, int d) {
        //iv
        color = c;
        gearType = g;
        door = d;
    }
    
}
 
public class MainClass {
 
    public static void main(String[] args) {
        // 매개변수가 있는 생성자를 이용한 객체 생성 및 초기화
        Car c = new Car("white""auto"4);
        // 기본 생성자를 이용한 객체 생성 및 초기화
        Car c = new Car(); //객체 생성
        //iv 초기화
        c.color = "white";
        c.gearType = "auto";
        c.door = 4;
        
    }
 
}
 
 
 
 
 
 
 
 
 
cs
실행되는 순서를 설명하면, 다음과 같다.

Car c: 참조변수 c를 생성

new: new 연산자가 객체 생성

Car("white", "auto", 4): 생성자를 호출하여, 객체 초기화

=: 객체가 참조변수 c에 저장

 

 3) 생성자 this()

  생성자에서 같은 클래스에 있는 다른 생성자를 호출할 때 사용

  이때, 다른 생성자 호출 시 첫 줄에서만 사용 가능

  코드의 중복을 제거하기 위해 사용

  아래 코드를 보면 모두 Car 클래스(같은 클래스)에 있고, this()를 이용하여 다른 생성자를 호출하고 있음을 알 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Car {
    
    //iv(instance variable = 멤버변수)
    String color;    // 색상
    String gearType; // 변속기 종류(auto, manual)
    int door;        // 문의 개수
    
    //기본 생성자
    Car() {
        this("white""auto"4); //Car(String c, String g, int d)를 호출
    }
    //매개변수가 있는 생성자
    Car(String c) {
        this(c, "auto"4); //Car(String c, String g, int d)를 호출
    }
    //매개변수가 있는 생성자
    Car(String c, String g, int d) {
        //iv
        this.color = c;
        this.gearType = g;
        this.door = d;
    }
    
}
cs
ㅇㅇ

주의!!

생성자 this()와 참조변수 this는 전혀 연관이 없고, 다른 것이다!!

그렇다면, 참조변수 this란 무엇일까?

 

cf) 참조변수 this

 

인스턴스 자신을 가리키는 참조변수

인스턴스 매서드(생성자 포함)에서 사용가능

지역변수(lv)와 인스턴스 변수(iv)를 구별할 때 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//매개변수가 있는 생성자
Car(String c, String g, int d) {
    //color는 iv, c는 lv
    color = c;
    gearType = g;
    door = d;
}
 
//this를 통해 지역변수와 인스턴스 변수 구별
Car(String color, String gearType, int door) {
    //this.iv = lv; 형태
    this.color = color;
    this.gearType = gearType;
    this.door = door;
}
cs

'Java' 카테고리의 다른 글

참조변수 super, 생성자 super()  (0) 2022.12.31
오버라이딩(overriding)  (2) 2022.12.30
파일(File)  (0) 2022.12.27
날짜와 시간(Calendar class)  (2) 2022.12.26
정렬(Sorting) - 오름차순, 내림차순  (0) 2022.12.26

+ Recent posts