Menu
Coddy logo textTech

단일 및 다중 레벨 상속

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

지금까지 우리는 하나의 부모 클래스를 직접 상속받는 클래스들을 살펴보았습니다. 하지만 상속은 클래스들이 서로 어떻게 연관되는지에 따라 다양한 구조를 형성할 수 있습니다. 두 가지 주요 패턴인 단일 상속(single inheritance)다단계 상속(multilevel inheritance)에 대해 알아보겠습니다.

단일 상속은 우리가 지금까지 사용해 온 방식입니다. 하나의 클래스는 정확히 하나의 부모 클래스만을 직접 상속받습니다:

public class Animal { }
public class Dog extends Animal { }
public class Cat extends Animal { }

여기서 DogCat은 모두 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");
    }
}

이 체인에서 DogMammal로부터 상속받으며, MammalAnimal로부터 상속받습니다. Dog 객체는 전체 체인의 모든 메서드에 접근할 수 있습니다:

Dog dog = new Dog();
dog.eat();      // Animal로부터
dog.breathe();  // Mammal로부터
dog.bark();     // Dog로부터

Object가 모든 체인의 최상위에 위치한다는 점을 기억하세요. 따라서 우리의 Dog는 실제로 Object -> Animal -> Mammal -> Dog의 네 가지 레벨을 가집니다. 새로운 객체를 생성할 때 생성자 체이닝은 이 모든 레벨을 거쳐 흐릅니다.

challenge icon

챌린지

쉬움

단일 및 다단계 상속 패턴을 모두 보여주는 운송 수단 계층 구조를 만들어 보겠습니다. 각 레벨이 새로운 기능을 추가하는 클래스 체인을 생성하여, 여러 레벨을 통해 메서드가 어떻게 상속되는지 보여줄 것입니다.

코드는 다음 네 개의 파일로 구성됩니다:

  • 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 { }

DogCat 모두 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 클래스 자체에 정의됨
    }
}
quiz icon실력 점검

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

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