본문 바로가기
공부/자바

생성자(Constructor)

by xladmt 2024. 5. 29.

생성자란?

생성자는 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'이다. 따라서 인스턴스 변수의 초기화 작업에 주로 사용되며, 인스턴스 생성 시에 실행되어야 할 작업을 위해서도 사용된다.

 

생성자의 조건

1. 생성자의 이름은 클래스의 이름과 같아야 한다.
2. 생성자는 리턴 값이 없다.

 

인스턴스를 생성하는 과정(코드 예)

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

 

기본 생성자

컴파일 할 때, 소스파일(*.java)의 클래스에 생성자가 하나도 정의되지 않은 경우 컴파일러는 자동적으로 기본 생성자를 추가하여 컴파일 한다.

 

매개변수가 있는 생성자

생성자도 메서드처럼 매개변수를 선언하여 호출 시 값을 넘겨받아서 인스턴스의 초기화 작업에 사용할 수 있다. 

 

생성자에서 다른 생성자 호출하기 - this(), this

- 생성자의 이름으로 클래스 이름 대신 this를 사용한다.
- 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.

 

코드로 이해하기) 오류인 부분을 찾아보자!

Car(String color) {
	door = 5;
    Car(color, "auto", 4);   // 에러1. 생성자의 두 번째 줄에서 다른 생성자 호출
}                            // 에러2. this(color, "auto", 4);로 해야함.

 

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

 현재 사용하고 있는 인스턴스와 같은 상태를 갖는 인스턴스를 하나 더 만들고자 할 때 생성자를 이용할 수 있다. 두 인스턴스가 같은 상태를 갖는다는 것은 두 인스턴스의 모든 인스턴스 변수(상태)가 동일한 값을 갖고 있다는 것을 뜻한다. 하나의 클래스로부터 생성된 모든 인스턴스의 메서드클래스변수는 서로 동일하기 때문에 인스턴스 간의 차이는 인스턴스마다 각기 다른 값을 가질 수 있는 인스턴스 변수 뿐이다.

 

코드로 이해하기

class Car {
    String color;
    String gearType;
    int door;
    Car() {
        this("white","auto",4);
    }

    Car(Car c){
        // this(c.color, c.gearType, c.door); 로도 쓸 수 있음.
        color = c.color;
        gearType = c. gearType;
        door = c.door;
    }
    Car(String color, String gearType, int door){
        this.color = color;
        this.gearType = gearType;
        this.door = door;
    }
}

public class CarTest {
    public static void main(String[] args) {
        Car c1 = new Car();
        Car c2 = new Car(c1);

        System.out.println("c1 => "+c1.color+" "+c1.gearType+" "+c1.door);
        System.out.println("c2 => "+c2.color+" "+c2.gearType+" "+c2.door);

        c1.door = 100;


        System.out.println("c1 => "+c1.color+" "+c1.gearType+" "+c1.door);
        System.out.println("c2 => "+c2.color+" "+c2.gearType+" "+c2.door);
    }
}

 => 인스턴스 c2는 c1을 복사하여 생성된 것이므로 서로 같은 상태를 갖지만, 서로 독립적으로 메모리 공간에 존재하는 별도의 인스턴스이므로 c1의 값들이 변경되어도 c2는 영향을 받지 않는다.

 

[참고]

Java의 정석 3판 (남궁성 저)

'공부 > 자바' 카테고리의 다른 글

상속 & 클래스 간의 관계  (0) 2024.05.30
변수의 초기화  (0) 2024.05.29
오버로딩(overloading)  (0) 2024.05.29
객체 지향 프로그래밍(OOP)  (0) 2024.05.28
배열 선언과 초기화  (0) 2024.05.26