단일 및 다중 레벨 상속
Coddy Java 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 87개 중 25번째.
지금까지 우리는 하나의 부모 클래스를 직접 상속받는 클래스들을 살펴보았습니다. 하지만 상속은 클래스들이 서로 어떻게 연관되는지에 따라 다양한 구조를 형성할 수 있습니다. 두 가지 주요 패턴인 단일 상속(single inheritance)과 다단계 상속(multilevel inheritance)에 대해 알아보겠습니다.
단일 상속은 우리가 지금까지 사용해 온 방식입니다. 하나의 클래스는 정확히 하나의 부모 클래스만을 직접 상속받습니다:
public class Animal { }
public class Dog extends Animal { }
public class Cat extends Animal { }여기서 Dog와 Cat은 모두 Animal로부터 상속받지만, 서로에게서 상속받지는 않습니다. 각 자식은 하나의 직계 부모를 가집니다.
다단계 상속은 한 클래스가 다른 클래스를 상속하고, 그 클래스가 또 다른 클래스를 상속하는 체인을 생성합니다:
public class Animal {
public void eat() {
System.out.println("Eating");
}
}
public class Mammal extends Animal {
public void breathe() {
System.out.println("Breathing");
}
}
public class Dog extends Mammal {
public void bark() {
System.out.println("Barking");
}
}이 체인에서 Dog는 Mammal로부터 상속받으며, Mammal은 Animal로부터 상속받습니다. Dog 객체는 전체 체인의 모든 메서드에 접근할 수 있습니다:
Dog dog = new Dog();
dog.eat(); // Animal로부터
dog.breathe(); // Mammal로부터
dog.bark(); // Dog로부터Object가 모든 체인의 최상위에 위치한다는 점을 기억하세요. 따라서 우리의 Dog는 실제로 Object -> Animal -> Mammal -> Dog의 네 가지 레벨을 가집니다. 새로운 객체를 생성할 때 생성자 체이닝은 이 모든 레벨을 거쳐 흐릅니다.
챌린지
쉬움단일 및 다단계 상속 패턴을 모두 보여주는 운송 수단 계층 구조를 만들어 보겠습니다. 각 레벨이 새로운 기능을 추가하는 클래스 체인을 생성하여, 여러 레벨을 통해 메서드가 어떻게 상속되는지 보여줄 것입니다.
코드는 다음 네 개의 파일로 구성됩니다:
Vehicle.java: 계층 구조의 최상위에 있는 기본 클래스를 생성합니다. 모든 차량은 다음을 가져야 합니다:brand(String)를 위한 private 필드- 브랜드를 인자로 받는 생성자
- 브랜드를 반환하는
getBrand()메서드 [brand] is moving을 출력하는move()메서드
LandVehicle.java: Vehicle을 확장하는 클래스를 생성하며, 이는 다단계 체인의 중간 레벨을 나타냅니다. 육상 차량은 지상 전용 동작을 추가합니다:wheels(int)를 위한 private 필드- 브랜드와 바퀴 수를 인자로 받으며, 부모 부분을 위해
super(brand)를 사용하는 생성자 - 바퀴 수를 반환하는
getWheels()메서드 [brand] honks!를 출력하는honk()메서드
Car.java: LandVehicle을 확장하는 클래스를 생성하여 3단계 상속 체인을 완성합니다. 자동차는 자신만의 특화된 기능을 추가합니다:model(String)을 위한 private 필드- 브랜드, 바퀴 수, 모델을 인자로 받으며,
super(brand, wheels)를 사용하는 생성자 - 모델을 반환하는
getModel()메서드 [brand] [model] with [wheels] wheels를 출력하는displayInfo()메서드
Main.java: Car 객체가 계층 구조의 세 레벨 모두에서 메서드에 어떻게 접근하는지 보여줍니다. 브랜드(String), 바퀴 수(int), 모델(String)의 세 가지 입력을 받습니다. Car 객체를 생성하고 다음 메서드들을 순서대로 호출하세요:move()- Vehicle(조부모)로부터 상속됨honk()- LandVehicle(부모)로부터 상속됨displayInfo()- Car 클래스 자체에 정의됨
브랜드 이름, 바퀴 수, 모델 이름의 세 가지 입력을 받게 됩니다.
출력은 Car 객체가 최상위 Vehicle부터 자신의 클래스에 이르기까지 상속 체인의 모든 레벨에서 메서드를 어떻게 사용할 수 있는지 보여주는 세 줄의 텍스트여야 합니다!
치트 시트
Java는 다양한 상속 구조를 지원합니다. 두 가지 주요 패턴은 단일 상속(single inheritance)과 다단계 상속(multilevel inheritance)입니다.
단일 상속은 하나의 클래스가 정확히 하나의 부모 클래스를 직접 확장할 때 발생합니다:
public class Animal { }
public class Dog extends Animal { }
public class Cat extends Animal { }Dog와 Cat 모두 Animal을 상속받지만, 서로를 상속받지는 않습니다.
다단계 상속은 한 클래스가 다른 클래스를 확장하고, 그 클래스가 또 다른 클래스를 확장하는 체인을 생성합니다:
public class Animal {
public void eat() {
System.out.println("Eating");
}
}
public class Mammal extends Animal {
public void breathe() {
System.out.println("Breathing");
}
}
public class Dog extends Mammal {
public void bark() {
System.out.println("Barking");
}
}다단계 상속에서 자식 클래스는 전체 상속 체인의 모든 메서드에 접근할 수 있습니다:
Dog dog = new Dog();
dog.eat(); // From Animal
dog.breathe(); // From Mammal
dog.bark(); // From Dog모든 클래스 계층 구조의 최상위에는 Object가 있습니다. 새로운 객체를 생성할 때 생성자 체이닝(Constructor chaining)은 모든 레벨을 통해 흐릅니다.
직접 해보기
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 입력 읽기
String brand = scanner.nextLine();
int wheels = scanner.nextInt();
scanner.nextLine(); // 줄바꿈 문자 소비
String model = scanner.nextLine();
// TODO: 입력된 값들로 Car 객체 생성
// TODO: move() 호출 - Vehicle(조부모 클래스)로부터 상속됨
// TODO: honk() 호출 - LandVehicle(부모 클래스)로부터 상속됨
// TODO: displayInfo() 호출 - Car 클래스 자체에 정의됨
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
4상속
상속의 기초 (extends)super 키워드메서드 오버라이딩 (@Override)생성자 체이닝Object 클래스단일 및 다중 레벨 상속다중 클래스 상속이 불가능한 이유요약 - 직원 계층 구조