객체지향 모델의 상속 (Inheritance)

1. 코드 재사용성 구현, 객체지향 모델의 상속의 개념 및 목적

(1) 상속 (Inheritance)의 개념

개념도개념
부모 클래스의 특성을 물려받아 코드 재사용성을 높이고, 기능을 확장하여 다형성을 구현하는 객체지향 모델의 특성

(2) 상속의 특징

코드 재사용성
(Code Reusability)
– 기존 속성과 메서드를 하위 클래스에서 그대로 물려받아 사용
– 동일한 코드를 중복해서 작성할 필요가 없어 효율적 개발/유지보수 가능
다형성 구현의 토대
(Polymorphism)
– 하위 클래스는 상위 클래스의 일종(“is-a” 관계) 논리 제공
– 새로운 하위 클래스 추가시 기존 코드 수정을 최소화하여 확장 가능
  • 상속을 통해 새로운 클래스를 정의하면 기존 클래스의 변수와 메서드를 수정하지 않고 상속받은 클래스에서 재사용 가능
  • 기준이 되는 상위 클래스를 Super / Parent / Base Class로 표기하고, 상속 받는 하위 클래스를 Sub / Child / Derived Class로 표기

 

2. 객체지향 모델의 상속 원리 및 핵심 요소

(1) 상속의 원리

(2) 상속의 핵심 요소

구분핵심 요소역할
클래스상위 클래스
(Super Class)
– 상속의 원천이 되며 부모(Parent), 기존(base) 클래스
– 공통적인 속성(필드)과 기능(메서드)을 정의
하위 클래스
(Sub Class)
– 상위 클래스의 특성을 물려 받는 자식(Child), 파생(Derived) 클래스
– 부모의 기능을 그대로 사용하거나 새로운 기능을 추가하여 확장
상속 관련
예약어
extends, :, ( )– 확장의 의미로 상위 클래스의 기능을 물려받음
– extends (Java, Kotlin), : 또는 ( ) (C++, Python)
protected– 외부 접근 차단, 하위 클래스에 물려줄 때 사용
– 동일 패키지 및 하위 클래스만 허용
  • 상위 클래스를 상속받은 하위 클래스에서 기능 추가 또는 같은 이름으로 새로운 기능 정의가 필요하면 객체지향 모델의 다형성 (Polymorphism) 중 오버라이딩 (Overriding)을 통해 재정의 가능

 

3. 객체지향 모델의 상속 코드 사례

class Animal {
    protected String sounds = "동물이 소리를 냅니다.";
  
    void speak() {
        System.out.println(this.sounds);
    }
}

class Cat extends Animal { // Cat은 Animal을 상속
    @Override
    void speak() {
        this.sounds = "야옹!";
        System.out.println(this.sounds);
    }
    
    void scratch() {
        System.out.println("할퀴기!");
    }
}

public class Main {
    public static void main(String[] args) {
        Cat myCat = new Cat();
        myCat.speak();   // 부모 메서드를 재정의(오버라이딩)
        myCat.scratch(); // 자식 클래스에만 있는 확장 기능
    }
}
  • 모든 접근 제한을 public으로 만들면 정보 은닉이 깨지게 되므로, 보통은 private으로 정보를 보호하되, 하위 클래스에서 필요한 부분만 protected로 열어주는 방식 권장

 
[참고]

  • 리프레임, 최은만, 객체지향 설계와 패턴 워크북, 2024.2

콘텐츠 사용 시 출처 표기 부탁 드리고, 댓글은 큰 힘이 됩니다^^