생성자 체이닝
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"가 출력됩니다. 이는 자식 클래스가 자체 설정을 추가하기 전에 부모 클래스가 항상 올바르게 초기화되도록 보장합니다.
챌린지
쉬움클래스 내부 및 상속 계층 구조 전체에서 생성자 체이닝(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()의 결과 출력
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
4상속
상속의 기초 (extends)super 키워드메서드 오버라이딩 (@Override)생성자 체이닝Object 클래스단일 및 다중 레벨 상속다중 클래스 상속이 불가능한 이유요약 - 직원 계층 구조