Menu
Coddy logo textTech

상속의 기초 (extends)

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

상속(Inheritance)은 OOP의 핵심 기둥 중 하나입니다. 이를 통해 클래스는 다른 클래스의 속성과 메서드를 물려받을 수 있으며, 코드 재사용을 촉진하고 클래스 간의 자연스러운 계층 구조를 형성합니다.

Java에서 extends 키워드를 사용하여 상속 관계를 만듭니다. 상속을 받는 클래스를 서브클래스(또는 자식 클래스)라고 하며, 상속을 해주는 클래스를 슈퍼클래스(또는 부모 클래스)라고 합니다.

public class Animal {
    private String name;
    
    public Animal(String name) {
        this.name = name;
    }
    
    public void eat() {
        System.out.println(name + " is eating");
    }
    
    public String getName() {
        return name;
    }
}

public class Dog extends Animal {
    public Dog(String name) {
        super(name);  // 부모 생성자를 호출합니다
    }
    
    public void bark() {
        System.out.println(getName() + " says woof!");
    }
}

Dog 클래스는 Animal로부터 eat() 메서드와 getName() 메서드를 자동으로 상속받습니다. 또한 bark()와 같은 자체 메서드를 정의할 수도 있습니다:

Dog myDog = new Dog("Buddy");
myDog.eat();   // 상속됨: "Buddy가 먹고 있습니다"
myDog.bark();  // 자체 메서드: "Buddy가 멍멍하고 짖습니다!"

상속을 "is-a" 관계로 생각해보세요. 개(Dog)는 동물(Animal)의 일종이므로, Dog가 Animal을 확장(extend)하는 것은 타당합니다. 이 관계를 통해 공통된 기능을 공유하면서도 자신만의 고유한 동작을 추가하는 특화된 클래스를 만들 수 있습니다.

challenge icon

챌린지

쉬움

상속이 실제로 어떻게 작동하는지 보여주는 간단한 차량 시스템을 만들어 보겠습니다. 공통적인 차량 속성을 보유하는 부모 클래스와 이를 확장하여 특화된 동작을 추가하는 자식 클래스를 만들 것입니다.

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

  • Vehicle.java: 모든 차량을 나타내는 부모 클래스를 만듭니다. 다음을 포함해야 합니다:
    • 차량의 brand (String)를 위한 private 필드
    • 브랜드 이름을 받아들이는 생성자 (Vehicle은 부모 클래스이므로 여기서는 super()가 필요하지 않습니다)
    • 브랜드를 반환하는 getBrand() 메서드
    • [brand] is starting을 출력하는 start() 메서드
  • Motorcycle.java: Vehicle을 확장하는 서브클래스를 만듭니다. 모터사이클은 차량이므로, 이 "is-a" 관계는 상속을 사용하기에 적합합니다. Motorcycle 클래스는 다음을 수행해야 합니다:
    • extends를 사용하여 Vehicle로부터 상속받습니다
    • 브랜드를 인자로 받아 super(brand)를 사용하여 부모 클래스에 전달하는 생성자를 가집니다
    • [brand] is doing a wheelie!를 출력하는 자체 메서드 wheelie()를 추가합니다
  • Main.java: Motorcycle 객체를 생성하고 상속된 동작과 고유한 동작을 모두 시연하여 모든 것을 하나로 합칩니다. 하나의 입력(브랜드 이름)을 받게 됩니다. 다음을 호출하여 두 줄을 출력하세요:
    • 상속된 start() 메서드
    • Motorcycle 고유의 wheelie() 메서드

모터사이클의 브랜드 이름(String)인 하나의 입력을 받게 됩니다.

Motorcycle이 코드를 다시 작성하지 않고도 start()getBrand()에 자동으로 액세스하는 방식에 주목하세요. 이것이 바로 상속의 힘입니다!

치트 시트

extends 키워드를 사용하여 클래스 간의 상속 관계를 만듭니다:

public class Animal {
    private String name;
    
    public Animal(String name) {
        this.name = name;
    }
    
    public void eat() {
        // " is eating"은 문자열 리터럴이므로 유지
        System.out.println(name + " is eating");
    }
    
    public String getName() {
        return name;
    }
}

public class Dog extends Animal {
    public Dog(String name) {
        super(name);  // 부모 생성자를 호출합니다
    }
    
    public void bark() {
        // " says woof!"는 문자열 리터럴이므로 유지
        System.out.println(getName() + " says woof!");
    }
}

서브클래스(자식)는 슈퍼클래스(부모)로부터 모든 메서드를 상속받으며, 자신만의 메서드를 추가할 수 있습니다:

Dog myDog = new Dog("Buddy");
myDog.eat();   // 상속받은 메서드
myDog.bark();  // 자체 메서드

서브클래스 생성자에서 super()를 사용하여 부모 클래스 생성자를 호출합니다.

상속은 클래스 간의 "is-a" 관계를 나타냅니다.

직접 해보기

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String brand = scanner.nextLine();
        
        // TODO: brand를 사용하여 Motorcycle 객체를 생성하세요
        
        // TODO: 상속된 start() 메서드를 호출하세요
        
        // TODO: wheelie() 메서드를 호출하세요
    }
}
quiz icon실력 점검

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

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