🤖 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 관계가 더 많이 나오는 게 가독성 면에서 훨씬 좋기 때문이다. 👍🏽👍🏽