[Java] 생성자와 this

kuku·2023년 1월 15일

Java

목록 보기
5/7

📖생성자란?

생성자(constructor)는 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메소드'이다. 이때, 인스턴스 초기화는 인스턴스변수들을 초기화하는 것을 뜻한다. 이외에 인스턴스 생성 시 실행되어야 할 작업을 위해서도 사용한다. 생성자는 다음과 같은 형식으로 정의한다.

클래스이름(타입 변수명, 타입 변수명, ...) {
	// 인스턴스 생성 시 수행될 코드
}

형식에서 알 수 있듯이 생성자의 이름은 클래스의 이름과 같아야 하며, 오버로딩이 가능하므로 하나의 클래스에 여러 개의 생성자가 존재할 수 있다.

❓생성자와 메소드의 차이

생성자는 메소드처럼 클래스 내에 선언되며, 구조도 메소드와 유사하지만 리턴값이 없다. 그러나, 메소드와는 달리 리턴값이 없음을 뜻하는 키워드 void는 사용하지 않는다.

❓연산자 new

생성자라는 이름 때문에 인스턴스를 생성하는 주체가 생성자라고 생각할 수 있지만, 인스턴스를 생성하는 것은 연산자 new이다. 생성자는 연산자 new를 통해 인스턴스가 생성됨과 동시에 수행되어야 할 작업을 수행하고 인스턴스변수들이 초기화될 수 있도록 할 뿐이다.
인스턴스를 생성할 때에는 연산자 new와 함께 클래스 내에 정의된 생성자 중 하나를 선택하여 사용해야 한다.

📁기본 생성자

모든 클래스에는 하나 이상의 생성자가 정의되어있어야 한다. 사용자가 클래스 내에 생성자를 정의하지 않는 경우, 인스턴스 생성 시 컴파일러가 제공하는 기본 생성자(default constructor)가 사용된다. 컴파일러가 자동으로 추가하는 기본 생성자의 형식은 다음과 같다.

클래스이름() { }

위와 같이 기본 생성자는 매개변수도 없고 내용도 없다. 형식이 다르더라도 사용자가 정의한 생성자가 하나라도 있다면 기본 생성자는 추가되지 않는다.


📖this와 this()

this와 this()는 비슷하게 생겼지만 쓰임새는 완전히 다르다. this는 참조변수이고, this()는 생성자이다.

📁참조변수 this

다음과 같은 코드가 있다.

class Car {
	String color;
    String gearType;
    int door;
    
    Car(String color, String gearType, int door) {
    	this.color = color;
        this.gearType = gearType;
        this.door = door;
    }
}

생성자를 사용하면 인스턴스변수 color와 생성자의 매개변수 color는 이름이 같아 이름만으로는 두 변수를 구별할 수 없다. 이런 경우, 인스턴스변수 앞에 this를 사용하여 인스턴스변수임을 표시한다. 이때, this는 인스턴스 자신을 가리키는 참조변수이고 인스턴스의 주소가 저장되어있다.

📁생성자 this()

생성자 this()는 같은 클래스의 생성자들이 서로를 호출할 때 사용한다. 한 생성자 내의 코드에서 다른 생성자를 호출하고 싶은 경우 두 가지 조건을 만족해야 한다.

  1. 다른 생성자를 호출할 때 클래스이름 대신 this를 사용한다.
  2. 코드의 첫번째 줄에서 호출해야 한다.

두 조건을 만족한 코드의 예시는 다음과 같다.

class Car {
	String color;
    String gearType;
    int door;
    
    Car(String color) {
    	this(color, "auto", 4); //첫번째 줄, 클래스이름 대신 this 사용
    }
    
    Car(String color, String gearType, int door) {
    	this.color = color;
        this.gearType = gearType;
        this.door = door;
    }
}
참고 : 자바의 정석 3판

0개의 댓글