[Java] 생성자

Bam·2024년 2월 27일
0

Java

목록 보기
28/98
post-thumbnail

생성자

생성자(Constructor)는 인스턴스 생성 과정에서 호출되는 인스턴스 초기화 메소드입니다. 생성자인스턴스변수를 초기화하고, 인스턴스 생성시 필요한 작업들을 수행하는 역할을 맡고있습니다.

생성자는 구조도 선언 방식도 메소드와 유사합니다. 오직 리턴값이 없다는 차이점이 있습니다. 그렇다고 메소드처럼 리턴값이 없다는 리턴값 타입 void를 적지 않습니다.

생성자는 다음 두 가지 조건을 만족하면 메소드와 구분되어 생성자가 됩니다.

  • 리턴값이 없다. (리턴 값타입 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";

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

오버로딩을 사용하면 한 클래스 내부에 여러개의 생성자가 존재할 수 있으므로, 당연히 한 생성자에서 다른 생성자를 호출할 수도 있습니다. 다만 막 호출하는 것은 당연히 안되고 다음 두 가지 조건을 지켜야합니다.

  • 생성자 이름으로 클래스명이 아닌 this를 사용한다.
  • 생성자의 첫 줄에서만 호출이 가능하다.
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를 정리하면 다음과 같습니다.

  • this(): 현재 클래스의 다른 생성자를 호출할 때 사용.
  • this: 현재 인스턴스 자신을 가리키는 참조 변수.

0개의 댓글