본문으로 바로가기

1. 생성자

  • new 연산자와 같이 사용되어 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당 
  • 객체 초기화란 필드를 초기화하거나, 메소드를 호출해서 객체를 사용할 준비를 하는 것을 말합니다.
  • 메소드와 비슷하게 생겼지만, 클래스 이름으로 되어 있고 리턴 타입이 없습니다.

 

2. 기본 생성자

  • 모든 클래스는 생성자가 반드시 존재하며, 하나 이상을 가질 수 있습니다.
  • 클래스 내부에 생성자 선언을 생략했다면 컴파일러는 기본 생성자를 바이트 코드에 자동으로 추가합니다.
  • 클래스가 public class로 선언되면 기본 생성자에서도 public이 붙지만, 클래스가 public 없이 class로만 선언되면 기본 생성자에도 public이 붙지 않습니다.
  • 주의) 클래스에 명시적으로 선언한 생성자가 한 개라도 있으면, 컴파일러는 기본 생성자를 추가하지 않는다. (특정 외부 라이브러리 활용 시 기본 생성자를 필수로 요하는 경우도 있습니다.)

기본 생성자 자동 생성

 

3. 생성자 선언

클래스명( 매개변수, ... ) {
	// 객체의 초기화 코드
}
  • 생성자는 메소드와 비슷해 보이지만, 리턴 타입이 없고 클래스 이름과 동일합니다.
  • 매개 변수 선언은 생략할 수도 있고, 여러 개를 선언해도 됩니다.
  • 클래스에 생성자가 명시적으로 선언되어 있을 경우에는 반드시 선언된 생성자를 호출해서 객체를 생성해야만 합니다.

 

4. 필드 초기화

1. 필드를 선언할 때 초기값을 주는 방법

public class Computer {
    // 필드 (고유 데이터)
    String modelName = "MacBook Air M1";    
    String adminName = "veaneas";
    int serialNumber = 1232;
}

 

 

2. 생성자에서 초기값을 주는 방법

관례적으로 필드와 동일한 이름으로 매개 변수를 사용합니다.

이름이 동일하기 때문에 생성자 내부에서 해당 필드에 접근하기 위해서는 this. 연산자를 활용하면 됩니다.

public class Computer {
    // 필드
    String modelName;
    String adminName;
    int serialNumber;

    // 생성자에서 초기값 대입
    public Computer(String modelName, String adminName, int serialNumber) {
        this.modelName = modelName;
        this.adminName = adminName;
        this.serialNumber = serialNumber;
    }
}
public class Main {
    public static void main(String[] args) {
        // Computer2 computer2 = new Computer2(); // 기본 생성자 호출 불가

        // 명시된 생성자를 호출해야 합니다.
        Computer2 computer2 = new Computer2("LG Gram", "veneas", 1343);

        System.out.println(computer2.modelName); // LG Gram
        System.out.println(computer2.adminName); // veneas
        System.out.println(computer2.serialNumber); // 1343
    }
}

 

5. 생성자 오버로딩

  • 모든 클래스는 생성자가 반드시 존재하며, 하나 이상을 가질 수 있습니다.
  • 매개 변수를 달리하는 생성자를 여러 개 선언하는 것
  • 매개 변수의 타입, 개수, 순서가 다르게 선언합니다.
  • 생성자를 다양하게 하여 여러 요구 조건을 수용할 수 있습니다.
public class Computer {
    // 필드
    String modelName;
    String adminName;
    int serialNumber;

    // 생성자
    public Computer() {

    }

    public Computer(String modelName) {
        this.modelName = modelName;
    }

    public Computer(String adminName, int serialNumber) {
        this.adminName = adminName;
        this.serialNumber = serialNumber;
    }

    public Computer(String modelName, String adminName, int serialNumber) {
        this.modelName = modelName;
        this.adminName = adminName;
        this.serialNumber = serialNumber;
    }
}

 

6. 다른 생성자 호출

  • this() = 자신의 다른 생성자를 호출하는 코드 
  • 반드시 생성자의 첫 줄에서만 허용
  • 생성자 오버로딩이 많아질 경우 생성자 간의 중복된 코드를 피하기 위해서 사용합니다.
public class Computer {
    // 필드
    String modelName;
    String adminName;
    int serialNumber;

    // 생성자
    public Computer() {
    }

    public Computer(String modelName) {
        this(modelName, "veneas", 1343);
    }

    public Computer(String adminName, int serialNumber) {
        this("Mac Book Air M1", adminName, serialNumber);
    }

    public Computer(String modelName, String adminName, int serialNumber) {
        this.modelName = modelName;
        this.adminName = adminName;
        this.serialNumber = serialNumber;
    }
}