생성자(Constructor)
는 인스턴스 생성 과정에서 호출되는 인스턴스 초기화 메소드입니다. 생성자
는 인스턴스변수를 초기화하고, 인스턴스 생성시 필요한 작업들을 수행하는 역할을 맡고있습니다.
생성자는 구조도 선언 방식도 메소드와 유사합니다. 오직 리턴값이 없다는 차이점이 있습니다. 그렇다고 메소드처럼 리턴값이 없다는 리턴값 타입 void를 적지 않습니다.
생성자는 다음 두 가지 조건을 만족하면 메소드와 구분되어 생성자가 됩니다.
Car
라는 클래스를 만들고 Car
의 생성자도 만들어보겠습니다. 리턴값 타입이 없고, 클래스명과 동일한 이름의 메소드를 만들면 그것이 생성자가 됩니다.
class Car {
public String color;
public Car() {} //생성자
}
자바에서는 모든 클래스에 반드시 하나 이상의 생성자가 정의되어 있어야합니다.
하지만 우리가 아무 클래스를 만들고 생성자 없이 인스턴스를 생성해도 아무런 오류를 발생시키지 않습니다. 그 이유는 자바 컴파일러에서 기본 생성자(default constructor)
를 지원하고 있기 때문입니다.
클래스 내부에 생성자가 하나도 없다면 컴파일 과정에서 다음과 같이 빈 내용의 기본 생성자
를 생성해서 컴파일을 진행합니다.
클래스명() { }
/*
* 방금 전의 Car클래스를 예시로 들면,
* Car() { }
*/
만약 클래스의 접근제어자가 public이라면, 기본 생성자도
public 클래스명() { }
으로 생성됩니다.
생성자
도 메소드처럼 매개변수를 가질 수 있습니다. 생성자의 매개변수는 값을 받아 인스턴스 멤버를 초기화하는데 주로 사용됩니다.
매개변수가 있는 생성자를 사용하면 다음과 같이 생성자 호출을 할 때 멤버를 초기화할 수 있습니다.
public class Car {
public String color;
public Car(String c) {
color = c;
}
}
생성자를 사용할 때, 인수로 매개변수 타입에 맞는 데이터를 넘겨주면 됩니다.
Car car = new Car("Black");
만약 매개변수를 사용하지 않는 경우엔 아래처럼 따로 초기화 과정을 수행해야합니다.
Car car = new Car(); car.color = "Black";
오버로딩
을 사용하면 한 클래스 내부에 여러개의 생성자가 존재할 수 있으므로, 당연히 한 생성자에서 다른 생성자를 호출할 수도 있습니다. 다만 막 호출하는 것은 당연히 안되고 다음 두 가지 조건을 지켜야합니다.
public class Car {
public String color;
public Car() {
this("White");
}
public Car(String color) {
this.color = color;
}
}
public static void main(String[] args) {
Car car1 = new Car("Black");
Car car2 = new Car();
System.out.println("car1의 색상: " + car1.color);
System.out.println("car2의 색상: " + car2.color);
}
먼저, 첫 번째 생성자입니다.
public Car() {
this("White");
}
this()
는 같은 클래스 내부의 다른 생성자를 호출합니다. 생성자는 매개변수로 구분하기 때문에 this()
의 인수로 전달한 값에 따라 일치하는 생성자를 호출하게 됩니다. 위 예시에서는 매개변수로 String
을 전달했기 때문에 public Car(String color) {}
생성자를 호출하게 됩니다.
다음은 매개변수가 있는 생성자입니다.
public Car(String color) {
this.color = color;
}
이때 매개변수로 받는 변수명과 클래스의 매개변수 String color
가 타입, 이름이 일치하는데요. 이를 구분하기 위해서 this
를 사용합니다. this
는 인스턴스 자신을 자리키는 참조형 변수입니다. 따라서 현재 생성자 내부에서 this.color
는 Car 인스턴스의 멤버 변수 color를 가리키게 되는거고 color
는 생성자의 매개변수를 가리키는 것이 됩니다.
this
는 모든 인스턴스메소드에 자신이 포함되어있는 현재 인스턴스를 가리키는 형태(지역 변수)로 선언되어있습니다.this
가 조금 어려우시다면 당장은 자기 자신을 가리킴이라고 생각하시면 됩니다.
조금 헷갈리실수도 있는데요. 간단하게 this()와 this
를 정리하면 다음과 같습니다.