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