-
상속(Inheritance)이란?Design Pattern/객체지향 2024. 4. 12. 21:46반응형
상속은 객체지향 프로그래밍(Object-Oriented Programming, OOP)의 핵심 원칙 중 하나로, 코드 재사용성을 높이고, 복잡성을 관리할 수 있게 돕습니다. 하지만, 잘못 사용하면 유지보수의 어려움을 초래할 수 있습니다. 이 글에서는 Java와 Go 언어를 통해 상속의 개념을 설명하고, 상속의 사용을 피해야 하는 이유에 대해서도 논의해 보겠습니다.
1. 상속이란 무엇인가?
상속은 한 클래스(부모 클래스)의 속성과 메서드를 다른 클래스(자식 클래스)가 받아 사용할 수 있게 하는 기능입니다. 이를 통해 공통의 코드를 재사용하고 확장할 수 있으며, 계층적인 클래스 구조를 만들어 관리할 수 있습니다.
2. Java에서의 상속
Java에서는 extends 키워드를 사용하여 클래스 간 상속을 구현합니다. 자식 클래스는 부모 클래스의 모든 public 및 protected 멤버를 상속받습니다.
예시 코드:
class Vehicle { public void move() { System.out.println("The vehicle is moving."); } } class Car extends Vehicle { @Override public void move() { super.move(); System.out.println("The car is driving."); } }
3. Go에서의 상속(혹은 그 대안)
Go는 전통적인 상속 구조를 지원하지 않습니다. 대신, 구조체 임베딩을 통해 유사한 기능을 구현할 수 있습니다. 이 방법은 명시적이며, is-a 관계보다는 has-a 관계를 더 자연스럽게 표현합니다.
예시 코드:
type Vehicle struct { // Vehicle-specific fields } func (v Vehicle) Move() { fmt.Println("The vehicle is moving.") } type Car struct { Vehicle // Embedding Vehicle } func (c Car) Move() { c.Vehicle.Move() fmt.Println("The car is driving.") }
4. Java와 Go의 상속 비교
- Java: 명시적인 상속 구조와 강력한 다형성을 제공하며, 클래스 간의 계층적 관계를 쉽게 형성할 수 있습니다.
- Go: 전통적인 상속 대신 구조체를 임베딩하여 유사한 기능을 제공합니다. 이는 코드의 명확성을 유지하며, 더 느슨한 결합을 가능하게 합니다.
5. 상속의 단점과 왜 잘 안 쓰이는가?
상속은 유용한 도구이지만, 다음과 같은 이유로 인해 문제를 일으킬 수 있습니다:
- 강한 결합: 부모 클래스의 변경이 모든 자식 클래스에 영향을 미칠 수 있습니다.
- 리스코프 치환 원칙 위배: 자식 클래스가 부모 클래스의 기능을 적절히 확장하지 않고 오버라이드할 때, 프로그램의 예측성이 떨어집니다.
- 유지보수의 어려움: 크고 복잡한 상속 체계는 이해하고 관리하기 어렵습니다.
6. 결론
상속은 객체지향 프로그래밍에서 코드 재사용과 확장성을 높이는 강력한 메커니즘입니다. 그러나, 상속의 복잡성과 유지보수의 어려움을 고려할 때, 구성과 같은 다른 패턴을 사용하는 것이 더 적합할 수 있습니다. 프로그래밍 설계 시에는 상속과 구성 중 어떤 것이 문제를 해결하는 데 더 효과적인지 신중하게 고려해야 합니다.
반응형'Design Pattern > 객체지향' 카테고리의 다른 글
서브클래싱(Subclassing)과 서브타이핑(Subtyping)이란? (0) 2024.04.14 다형성(Polymorphism)이란? (1) 2024.04.12 추상화(Abstraction)란? (0) 2024.04.12 캡슐화(encapsulation)란? (0) 2024.04.10 인스턴스(Instance)란? (0) 2024.04.10