🤖 Computer Science

상속이 먼저, 위임이 다음.

thumbnail
category
🤖 Computer Science
tags
OOP
Java
Design
summary
👨🏽 밥아저씨가 알려준다!
 
SOLID에서도, 디자인 패턴에서도, 객체지향의 모든 곳에는 상속과 위임이라는 표현이 나온다.
또 이 안에서 IS-A 관계, HAS-A 관계와 같은 표현도 나온다 💨
 
빠르게 가보자.. 🏃🏽🏃🏽‍♀️
 

상속이라는 형님

(제목도 그렇고 서브 제목도 그렇고 상속을 먼저로 표현하고 위임을 다음으로 표현한 데에는 이유가 있다. 마지막에..)
 
부모 클래스 - 자식 클래스
상위 클래스 - 하위 클래스
메인 클래스 - 서브 클래스
 
등등..
 
상속의 표현은 다양하다.
하지만 모두가 공통되듯, 말 그대로 상속 받았다는 얘기다.
부모 기능을 자식이 할 수 있다.
이게 끝이다.
 
구체적인 방법은 자바를 기준으로 할 때
class A extends B
클래스를 상속했다면 extends 를 사용할 것이고!
 
class A impliments B
인터페이스를 상속했다면 impliments 를 사용할 것이다!
 
💡
자식 클래스에서는 상속받은 메소드나 속성을 그대로 사용하거나 오버라이드 하여 기능 변경 또는 확장을 할 수 있게 되면서 코드의 재사용성과 확장성을 높일 수 있다.
 

그 안의 IS-A

상속에서 많이 쓰이는 표현이다.
A is B == A는 B다.
이 표현이다. 초간단..
 
즉 뭐는 뭐다 라고 할 수 있을 is 로 매칭되는 관계를 표현하는 건데, 이게 왜 상속에서 쓰이느냐 가 중요하다.
 
상속을 받고 나면 자식은 부모의 기능을 수행할 수 있다.
그리고 SOLID 5원칙중 LSP원칙에 근거하여 자식은 부모를 완전히 대체할 수 있어야한다.
때문에 부모와 자식의 관계는 IS-A 관계라고 표현하는 것이다.
 
💡
나아가서 상속을 적절히 활용해 나온 디자인 패턴이 Template Method, Factory Method, Abstract Factory, Composite 등이다.
 

위임이라는 아우

한 객체에서 다른 객체의 기능을 호출하여 처리하는 걸 말한다.
말 그대로 위임한다는 것이다.
 
위임의 개념은 너무 간단하고.. 그렇기에 상속과의 차이를 중점으로 보자.
 
상속의 단점이라면 결합도가 높아진다는 건데, 위임을 하면 결합도는 낮출 수 있기 때문에 ‘유연한 구조’를 유지한다는 게 장점이다.
 
또 상속은 정적 관계이기 때문에 컴파일 시간에 관계 정의가 끝난다.
반면 위임은 동적 관계라서 런타임 시간 동안 얼마든지 변경될 수 있다.
이게 가능한 이유는 위임은 interface 에서 쓰이기 때문이고 interface 로 구현한다는 것은 즉, 다형성을 활용한다는 것이기 때문에 가능하다.
 
A가 B라는 인터페이스를 바라보고 있으면 B의 실제 구현체가 B-1 에서 B-2 로 변경되어도 A는 전혀 모르는 구조라는 말이다.
 
💡
장점은 하나. 결합도를 낮추어 유연한 구조를 유지한다!
 

그 안의 HAS-A

위임에선 HAS-A 관계라는 말이 나온다.
이 것도 떠올려보면 간단하다.
HAS == 포함하다
A HAS B 처럼 A가 B를 포함하고(가지고) 있다는 말이다.
 
위임에서는 내가 다른 객체에게 작업을 위임하는 거라서 HAS-A 관계가 성립한다.
 
💡
나아가서 위임은 디자인 패턴 중, Replace with Delegation, Decorator, Strategy 등에서 쓰인다.

 

상속과 위임의 관계

내가 타이틀에서 선행과 후행을 표현한 이유.
서브 타이틀에서 조차 형님과 아우라고 표현한 이유.
 
이건 온전히 내 생각이라서 틀.릴.수 있다!
 
SOLID 원칙들도 그렇고 결국 상속을 활용할 수 있다면 활용하는게 최고다.
때문에 상속이 언제나 선행되어야 한다.
다시 말해서 상속을 쓸 수 있는 구조인지, 설계 시에 먼저 파악해야 하고 그 다음으로 위임을 고려해야 한다.
좋은 코드를 위해선 가능하면 HAS-A 보단 IS-A 관계가 더 많이 나오는 게 가독성 면에서 훨씬 좋기 때문이다. 👍🏽👍🏽