본문 바로가기

Android/현업에 투입되기위한 STUDY

0707 1일차 HAS-A로 시작해서 DI로 끝난다.

IS-A : 상속, InheritanceHAS-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. 알람 앱 만들기 - 최대한 복잡하게 구성하기