해당 글은 최범균님 - 인프런 | 객체지향 프로그래밍 입문 강의를 바탕으로 작성하였습니다.
너무 좋은 강의이니 추천드립니다.
다형성
Polymorphism
여러(poly) 모습(morph)을 갖는 것
객체 지향에서는 한 객체가 여러 타입을 갖는 것
- 여러 타입의 기능을 제공
- 타입 상속으로 다형성 구현
e.g.
1
2
3
4
5
6
7
8
public class Timer {
public void start() {...}
public void stop() {...}
}
public interface Rechargeable {
void charge();
}
1
2
3
4
5
public class IotTimer extends Timer implements Rechargeable {
public void charge() {
...
}
}
IotTimer
class는Timer
타입도 되고Rechargeable
타입도 가능하다. ```java IotTimer it = new IotTimer(); it.start(); it.stop();
Timer t = it; t.start(); t.stop();
Rechargeable r = it; r.charge(); ```
추상화
데이터나 프로세스 등을 의미가 비슷한 개념이나 의미 있는 표현으로 정의하는 과정
- 두가지 방식의 추상화
- 특정한 성질
- 공통 성질 (일반화)
타입 추상화
여러 구현 클래스를 대표하는 상위 타입 도출
- 흔히 인터페이스 타입으로 추상화
- 추상화 타입과 구현은 타입 상속으로 연결
여러가지 구현 클래스가 공통점이 있을 때 타입 추상화를 생각해 볼 수 있다.
이메일, SMS, Kakao 모두 알림을 보내는 공통점이 있으므로 알림을 보낸다
로 추상화 할 수 있다.
추상 타입 사용에 따른 이점
유연함
콘크리트 클래스를 직접 사용하면 요구 사항 변경에 따라 이미지와 같이 주문 취소 코드도 함께 변경될 수 있다. 오른쪽으로 갈수록 여러가지 기능이 붙지만 사실 주문 취소는 변하지 않았다.
추상 타입을 사용하여 변경
getNotifier()
에서 기능에 알맞은 객체를 Return 해주면 도메인 로직인 주문취소 코드는 변경없이 알림 기능만을 수정 할 수 있게 된다. 여기에서 Factory Pattern을 써서 하면 좋을 것 같다는 생각이 든다.
추상화 결과
사용 대상 변경 유연함 위 예시에서 통지 대상 규칙을 바꿔도 핵심 도메인 로직은 변경되지 않는다.
추상화는 의존 대상이 변경하는 시점에
추상화 -> 추상 타입 증가 -> 복잡도 증가
- 아직 존재하지 않는 기능에 대한 이른 추상화는 주의 섣부른 추상화는 복잡도만 증가할 수 있음
- 실제 변경, 확장이 발생할 때 추상화 시도
추상화를 잘하려면…
구현을 한 이유가 무엇 때문인지 생각해야한다.
위 예시에서 SMS, Kakao, Mail 서비스를 구현하고 세가지가 어떤 공통점이 있는지 생각을 해봤을 때 알림을 주는 것
, 알려주는 것
이라고 추상화 할 수 있다.