JAVA/java 이론

[자바JAVA] 생성자 constructor / this()/ 생성자를 이용한 인스턴스 복사

자바칩 프라푸치노 2020. 10. 11. 07:14

이 포스팅은 아래의 내용을 포함하고 있습니다.

1. 생성자

2. 생성자의 조건

3. 기본 생성자

4. 매개변수가 있는 생성자

5. this()

6. 생성자를 이용한 인스턴스 복사

7. 예제

 


 

1. 생성자란

인스턴스가 생성될때마다 호출되는 '인스턴스 초기화 메서드'

모든 클래스에는 하나이상의 생성자가 있어야함

생성자가 없을 시, 기본적으로 기본생성자를 컴파일러가 만들어줌

생성자가 있을 시, 기본생성자 안만들어줌

 

2. 생성자의 조건

리턴타입이 없다(하지만void를 쓰지 않는다.)

클래스의 이름과 동일하다.

 

3. 기본생성자

매개변수가 없는 생성자

public Car() { }

이런식으로 Car클래스에 있는 기본 생성자

 

4. 매개변수가 있는 생성자

public Car(int x){}

요런 식으로 매개변수가 있는 생성자

 

(예제)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package sec03_exam_constructor;
 
public class Data2 {
    
    int value;
    
    public Data2() {}//기본생성자
    
    //매개변수가 있는 생성자.
    //생성자가 1개라도 존재한다면, 컴파일러는 기본 생성자를 추가해주지 아니한다.
    public Data2(int value) {
        //this는 객체 자기자신의 주소를 지니고 있다. (참조변수와 동일)
        //this가 활성화 되는 시점은 new라는 연산자를 통해서 인스턴스가
        //생성될 때 활성화가 이루어진다.
        this.value = value;
    }
    
}
 
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package sec03_exam_constructor;
 
public class DataEx {
 
    public static void main(String[] args) {
        
        Data2 d2 = new Data2(); //처음에 컴파일에러가 뜬 이유: 기본생성자가 없는데 호출해서
        System.out.println(d2.value);
        
        Data2 d3 = new Data2(15);//매개변수가 있는 생성자를 호출
        System.out.println(d3.value);
 
    }
 
}
 
cs

 

Data2클래스에 보시면

기본 생성자가 하나있고

매개변수가 있는 생성자가 있습니다.

매개변수로 들어온 value라는 값이 멤버변수에 들어가면서 초기화가 됩니다.

 

실행클래스에 보시면 

처음에는 기본생성자를 호출하고 있으므로 value는 0이되겠고

두번째에는 매개변수로 15를 넣어주면서 인스턴스를 생성하고 있으므로 15입니다.

 

<출력결과>

 

 

생성자는 오버로딩과 같은 개념입니다.

오버로딩 개념은 아래 포스팅에 있습니다.

2020/10/10 - [§개발자 되기 프로젝트§/java 이론] - [자바java] 메서드 오버로딩 overloading

4. 생성자에서 다른 생성자 호출하기

this()

코드를 잘 살펴 보십쇼

생성자가 5개가 있습니다.

 

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
package sec05_exam;
 
public class Car {
 
    String color;//색상
    String gearType;//변속기 종류
    int door;//문의 개수
    //기본생성자
    //this() 는 같은 클래스 내에 있는 또 다른 생성자를 호출한다.
    //호출할 때, 매개변수의 타입과 개수에 따라 호출하므로 오버로딩이 적용된다.
    public Car() {
        this("흰색""오토"4);
    }
    public Car(String color) {
        this(color, "오토"4);
    }
    public Car(String color, String gearType) {
        this(color, gearType, 4);
    }
    
    //인스턴스의 복사를 위한 생성자 --> 객체 초기화 (Object Initialization)
    public Car(Car car) {
        this.color = car.color;
        this.gearType = car.gearType;
        this.door = car.door;
    }
    
    
    //매개변수가 있는 생성자
    public Car(String color, String gearType, int door) {
        this.color = color;
        this.gearType = gearType;
        this.door = door;
    }
    public String getColor() {
        return color;
    }
    public String getGearType() {
        return gearType;
    }
    public int getDoor() {
        return door;
    }
    
    @Override
    public String toString() {
        String str = "색상 : " + this.getColor() + 
                ", 기어 : " + this.getGearType() + ", 문갯수 : " + this.getDoor();
        return str;
        
    }
    
    
    
}
 
cs

 

위 3개의 생성자들은 this()로 매개변수가 3개짜리인 생성자를 호출합니다.

매개변수가 3개짜리 생성자 등장

매개변수로 받은 값들을 초기화 해줍니다.

 

(실행클래스)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package sec04_exam;
 
public class CarEx {
 
    public static void main(String[] args) {
        //기본생성자를 호출했는데 왜 초기화가 되어서 출력이 되나?
        //기본생성자 호출하면 기본값을 가진(입력한) 매개변수 3개짜리 생성자를 호출한다.
        
        Car car1 = new Car();
        System.out.println(car1);
        
        //매개변수가 1개인 생성자 호출
        Car car2 = new Car("검정");
        System.out.println(car2);
        //매개변수가 1개인 생성자 호출
        Car car3 = new Car("노랑""수동");
        System.out.println(car3);
 
    }
 
}
 
cs

기본 생성자에서는

여기를 보시면 기본 생성자는 흰색 오토 4 를 가지는 생성자를 호출해서 그러한 값으로 초기화된 인스턴스를 만듭니다.

 

두번째, color을 검정으로 준 생성자는 검정, 오토, 4 를 가지는 인스턴스를 만듭니다.

 

세번째, color와 gearType이 매개변수인 생성자는 노랑, 수동,4를 가지는 인스턴스를 만듭니다.

 

<출력결과>


5. 생성자를 이용한 인스턴스 복사

위에 Car클래스 그대로 보겠습니다.

생성자에 요런 생성자가 있습니다.

매개변수가 Car입니다.

매개변수가 Car이라는 것은 Car의 인스턴스가 매개변수로 온다는 뜻입니다.

 

(실행클래스)

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
package sec05_exam;
 
public class CarEx {
 
    public static void main(String[] args) {
 
        Car c1 = new Car();
        Car c2 = new Car(c1); //c1의 복사본 c2를 생성
        
        System.out.println(c1);
        System.out.println(c2);
        System.out.println();
        
        c2.door = 100;
        c2.color = "노랑색";
        
        Car c3 = new Car(c1);
        System.out.println(c1);
        System.out.println(c2);
        System.out.println(c3);
 
    }
 
}
 
cs

 실행클래스를 보시면 Car 클래스 c1을 c2의 생성자에 넘기고 있습니다.

그러면 c1이 가진 값들 그대로 c2에 복사가 되겠죠

 

그렇다면 위에 출력 메서드에 2줄은 똑같이 나오겠고

c3도 c1과 똑같이 나오고

c2는 변수에 값을 대입하고 나면 그 값으로 대입되어서 나오겠습니다.

 

<출력결과>

728x90