Hyunebee

생성자 본문

Java/Java의 정석

생성자

Hyunebee 2022. 3. 2. 12:07

생성자

생성자 : 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드이다. 

생성자 역시 메서드처럼 클래스 내에 선언되며, 구조도 메서드와 유사하지만 클래스와 이름이 같아야하고 리턴값이 없다. 하지만 리턴값이 없는것을 뜻하는 void또한 붙지 않는다. 

 

생성자 또한 오버로딩이 가능하다 다른 매개변수를 사용함으로써 각각의 초기화를 따로 처리할 수 있다. 

 

ex)인스턴스 생성과정

클래스이름 c = new 클래스이름()

1. 연산자 new에 의해서 메모리(heap)에 클래스의 인스턴스가 생성된다.

2. 생성자 호출되어 수행된다.

3. 연산자 new의 결과로, 생성된 인스턴스의 주소가 반환되어 참조변수 c에 저장된다.  

 

기본 생성자

사실 모든 클래스에는 반드시 하나 이상의 생성자가 정의되어 있어야 한다. 원래 우리가 클래스를 만들고 객체를 생성할때 생성자를 작성하지 않고도 객체를 생성할 수 있는 이유는 컴파일러에서 자동으로 생성자를 추가해주기 때문이다. 이것을 기본 생성자라고 한다. 하지만 클래스에 정의된 생성자가 하나이상 있을경우에는 기본 생성자는 생성되지 않는다. 

 

이때 생성되는 생정자는 클래스이름() {} 처럼 단순하게 생성된다. 

 

생성자에서 다른 생성자 호출 - this

생성자 간에도 서로 호출이 가능하다. 하지만 두가지 조건을 만족해야 한다.

- 생성자의 이름으로 클래스이름 대신에 this를 사용한다.

- 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.

 

Car(String color){
    door = 5;
    Car(color, "auto", 3);
}

위의 코드는 여러개의 오류가 있다. 

1. 첫줄에 생성자의 호출이 아니라 대입연산자를 사용 -> 두번째 조건인 첫 줄에서만 호출x

2. Car()생성자를 호출하는게 아닌 this(color,"auto",3); ->this를 사용해서 호출해야 한다.

 

생성자에서 다른 생성자를 첫 줄에서만 호출이 가능하도록 한 이유는 생성자 내에서 초기화 작업도중에 다른 생성자를 호출하게 되면 호출된 다른 생성자 내에서도 멤버 변수들의 값을 초기화 하기 때문에 이전 초기화 작업이 무의미해 질 수 있기 때문이다. 

 

ex) 

class Car {
    String color;     // 색상
    String gearType;   // 변속기 종류 - auto(자동), manual(수동)
    int door;        // 문의 개수

    Car() {
        this("white", "auto", 4);
    }

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

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

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

위의 코드를 살펴보자 Car c1 = new Car() 연산자를 사용해서 객체를 생성하였다.  객체를 생성할때 인자를 넣지 않았기 때문에 생성자 호출시 Car()가 호출된다 하지만 Car() 생성자는 Car(String color, String gearType, int door)를 this키워드로 생성자 호출을 하고 있다. 그래서 인자를 넣어주지 않아도 기본으로 색상과 변속타입 문의 개수가 생성되서 나오는것이다. 

 

Car(String color, String gearType, int door)생성자를 보면 

this키워드를 사용하고 있다. 보통 생성자의 매개변수로 인스턴스 변수를 초기화 시키는 경우가 많기 때문에 this 키워드를 사용해 인스턴스 변수와 매개변수를 구분해주는 역활을 하고 있다. this는 인스턴스 자신을 가르키는 참조 변수이다. 그럼으로 this는 인스턴스를 가지는 맴버들만 사용할 수 있다. 그래서 인스턴스없이 사용할 수 있는 static method나 value들은 this 키워드를 사용할 수 없다.

 

 

 

 

'Java > Java의 정석' 카테고리의 다른 글

오버라이딩  (0) 2022.03.03
클래스간 관계 결정 - 상속과 포함  (0) 2022.03.03
변수의 초기화  (0) 2022.03.02
오버로딩  (0) 2022.03.01
객체 지향 프로그래밍  (0) 2022.02.27