IS-A : 상속, Inheritance / HAS-A : Composition(리스너나 콜백)
1. 코드로 비교하기 : Shape과 Circle 두 개의 클래스를 이용하여 두 관계를 나타낸다.
Circle is a Shape. 원은 모양이다. : Circle 클래스는 Shape 클래스를 상속하고 있다.
1 2 3 4 5 6 7 | class Shape { Point x; Point y; } class Circle extends Shape { double radius; } | cs |
Circle has a Shape. 원은 모양을 가진다. : Circle 클래스 안에 Shape을 멤버로 넣어주었다.
1 2 3 4 5 6 7 8 | class Shape { Point x; Point y; } class Circle { double radius; Shape shape; } | cs |
2. 그림으로 비교하기
상속을 할 때마다 copy를 하므로 기하급수적으로 메모리가 늘어난다.
반면에 Composition은 포인터처럼 가리키기만 한다. 메모리 걱정이 없다.
3. 결론 : HAS-A 관계인 Composition을 사용하자!
유지보수 측면을 고려하는게 요즘 추세이다.
코드는 한번에 완성된다는 생각을 버려야 한다.
요구사항이 참 무궁무진 하므로, 어떠한 요구사항이라도 간편하게 구현할 수 있는 UML을 구성해야 한다.
4. Composition의 문제점
의존성(=결합도)이 강하게 발생한다. dependency(=coupling)가 강하게 발생한다.
Circle 클래스 내부에 Shape 멤버를 갖고, Shape의 객체(변수나 메소드)를 가져다 사용하는 것이 의존성이다.
그래서 목표는 (의존성을 없애는 것이 아니라) 결합도를 낮추는 것이다.
어떻게 결합도를 낮출 수 있을까?
How can I loose coupling?
[Tight Coupling]
5. Dependency Injection(DI)로 문제해결!
DI란? 객체와 객체 사이에 인터페이스를 만들어 실체를 숨김으로써,
실제 구현체를 사용하는 객체가 무언지 모르게 사용하도록 하는 전체적인 컨셉이다.
구체적인 클래스가 아닌 행위에만 의존해야 한다.
기존의 Color보다 더 좋은 대체방안이 생기면 쉽게 갈아치울 수 있다.
[Loose Coupling]
6. 정리하자면...
IS-A는 확장을 많이하게될 경우에, depth가 증가하여 관리가 힘들다.
HAS-A의 결합도를 낮추기 위해 DI를 이용하면, 얼마든지 영역을 넓힐 수 있고 문제가 발생하지 않는다.
7월 10일 스터디까지 할 것!
1. Android API 中 App Components 읽기 - 모르는 것 표시해놓기
2. 알람 앱 만들기 - 최대한 복잡하게 구성하기
'Android > 현업에 투입되기위한 STUDY' 카테고리의 다른 글
0724 4차 App Componenets 발표 (0) | 2015.07.24 |
---|---|
0714 3일차 AlramStudy project 컨설팅 (0) | 2015.07.14 |
App Components > Activities Intro (0) | 2015.07.10 |
0710 2일차 AlramStudy project 컨설팅 (0) | 2015.07.10 |
App Components > Intents and Intent Filters (0) | 2015.07.07 |