Menu
Coddy logo textTech

생성자 체이닝

Coddy Java 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 87개 중 23번째.

생성자 체이닝(Constructor chaining)은 한 생성자에서 다른 생성자를 호출하는 과정입니다. 이 기법은 클래스에 여러 생성자가 있거나 상속 계층 구조를 다룰 때 코드 중복을 피하는 데 도움이 됩니다.

동일한 클래스 내에서, this()를 사용하여 생성자를 연결(chain)할 수 있습니다. 이를 통해 모든 작업을 수행하는 하나의 "메인" 생성자를 가질 수 있으며, 다른 생성자들은 단순히 이 생성자에게 작업을 위임하게 됩니다:

public class Rectangle {
    private int width;
    private int height;
    
    public Rectangle() {
        this(1, 1);  // 매개변수가 두 개인 생성자를 호출합니다
    }
    
    public Rectangle(int size) {
        this(size, size);  // 정사각형을 생성합니다
    }
    
    public Rectangle(int width, int height) {
        this.width = width;
        this.height = height;
    }
}

상속에서 생성자 체이닝(constructor chaining)은 자동으로 발생합니다. 서브클래스 객체를 생성할 때, Java는 super()를 사용하여 부모 생성자를 먼저 호출합니다. super()를 명시적으로 호출하지 않으면, Java는 자동으로 super()(인수가 없는 버전)를 삽입합니다:

public class Animal {
    private String name;
    
    public Animal(String name) {
        this.name = name;
        System.out.println("Animal constructor");
    }
}

public class Dog extends Animal {
    private String breed;
    
    public Dog(String name, String breed) {
        super(name);  // 반드시 첫 번째 줄이어야 합니다
        this.breed = breed;
        System.out.println("Dog constructor");
    }
}

new Dog("Buddy", "Labrador")를 생성하면 "Animal constructor"가 먼저 출력되고, 그 다음에 "Dog constructor"가 출력됩니다. 이는 자식 클래스가 자체 설정을 추가하기 전에 부모 클래스가 항상 올바르게 초기화되도록 보장합니다.

challenge icon

챌린지

쉬움

클래스 내부 및 상속 계층 구조 전체에서 생성자 체이닝(constructor chaining)을 보여주는 제품 주문 시스템을 구축해 보겠습니다. this()가 동일한 클래스 내에서 생성자를 연결하는 방법과 super()가 부모 생성자를 연결하는 방법을 배우게 됩니다.

코드를 구성하기 위해 세 개의 파일을 생성합니다:

  • Product.java: 상점의 모든 제품을 나타내는 부모 클래스를 생성합니다. 다음을 포함해야 합니다:
    • name (String) 및 price (double)에 대한 private 필드
    • 이름과 가격을 모두 받아 필드를 초기화하고 "Product constructor: " + name을 출력하는 메인 생성자
    • 이름만 받고 this(name, 0.0)을 사용하여 메인 생성자를 호출해 기본 가격을 0.0으로 설정하는 두 번째 생성자
    • 필드에 접근하기 위한 getName()getPrice() 메서드
  • Electronics.java: Product를 상속하고 보증 정보를 추가하는 서브클래스를 생성합니다:
    • warrantyYears (int)에 대한 private 필드
    • 이름, 가격, 보증 기간을 받는 메인 생성자 - super(name, price)를 사용하여 부모를 초기화한 다음, 보증 기간을 설정하고 "Electronics constructor: " + warrantyYears + " year warranty"를 출력합니다.
    • 이름과 가격만 받고 this(name, price, 1)을 사용하여 메인 생성자를 호출해 기본 1년 보증을 제공하는 두 번째 생성자
    • 이름만 받고 this(name, 0.0)을 사용하여 두 번째 생성자를 호출하는 세 번째 생성자
    • getName() + " - $" + String.format("%.2f", getPrice()) + " (" + warrantyYears + " year warranty)"를 반환하는 getDetails() 메서드
  • Main.java: 생성자 체이닝이 작동하는 모습을 보여줍니다. 제품 이름(String), 가격(double), 보증 기간(int)의 세 가지 입력을 받습니다. 세 가지 매개변수를 모두 사용하여 Electronics 객체를 생성한 다음, getDetails()의 결과를 출력합니다.

제품 이름, 가격, 보증 기간의 세 가지 입력을 받게 됩니다.

getDetails()에서 가격은 String.format("%.2f", price)를 사용하여 소수점 2자리까지 표시되도록 형식을 지정하세요. 출력을 주의 깊게 살펴보세요. 부모에서 자식으로 체인이 어떻게 흐르는지 보여주는 생성자 메시지가 순서대로 나타나는 것을 볼 수 있습니다!

치트 시트

생성자 체이닝은 코드 중복을 피하기 위해 하나의 생성자에서 다른 생성자를 호출하는 과정입니다.

동일한 클래스 내에서의 체이닝

동일한 클래스의 다른 생성자를 호출하려면 this()를 사용하세요:

public class Rectangle {
    private int width;
    private int height;
    
    public Rectangle() {
        this(1, 1);  // 두 개의 매개변수를 가진 생성자를 호출합니다
    }
    
    public Rectangle(int size) {
        this(size, size);  // 정사각형을 생성합니다
    }
    
    public Rectangle(int width, int height) {
        this.width = width;
        this.height = height;
    }
}

상속에서의 체이닝

부모 클래스 생성자를 호출하려면 super()를 사용하세요. 이는 생성자의 첫 번째 줄에 위치해야 합니다:

public class Animal {
    private String name;
    
    public Animal(String name) {
        this.name = name;
        System.out.println("Animal constructor");
    }
}

public class Dog extends Animal {
    private String breed;
    
    public Dog(String name, String breed) {
        super(name);  // 반드시 첫 번째 줄이어야 합니다
        this.breed = breed;
        System.out.println("Dog constructor");
    }
}

super()를 명시적으로 호출하지 않으면 Java는 자동으로 super()(인수가 없는 버전)를 삽입합니다. 부모 생성자는 항상 자식 생성자보다 먼저 호출되어 적절한 초기화 순서를 보장합니다.

직접 해보기

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // 입력 읽기
        String name = scanner.nextLine();
        double price = scanner.nextDouble();
        int warrantyYears = scanner.nextInt();
        
        // TODO: 세 개의 매개변수를 사용하여 Electronics 객체 생성
        
        // TODO: getDetails()의 결과 출력
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨