Home 2.다형성과 추상화
Post
Cancel

2.다형성과 추상화

해당 글은 최범균님 - 인프런 | 객체지향 프로그래밍 입문 강의를 바탕으로 작성하였습니다.
너무 좋은 강의이니 추천드립니다.


다형성

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을 써서 하면 좋을 것 같다는 생각이 든다.

바로 다음 예시가 Factory..

추상화 결과

사용 대상 변경 유연함 위 예시에서 통지 대상 규칙을 바꿔도 핵심 도메인 로직은 변경되지 않는다.

추상화는 의존 대상이 변경하는 시점에

추상화 -> 추상 타입 증가 -> 복잡도 증가

  • 아직 존재하지 않는 기능에 대한 이른 추상화는 주의 섣부른 추상화는 복잡도만 증가할 수 있음
    • 실제 변경, 확장이 발생할 때 추상화 시도

추상화를 잘하려면…

구현을 한 이유가 무엇 때문인지 생각해야한다.

위 예시에서 SMS, Kakao, Mail 서비스를 구현하고 세가지가 어떤 공통점이 있는지 생각을 해봤을 때 알림을 주는 것, 알려주는 것 이라고 추상화 할 수 있다.

This post is licensed under CC BY 4.0 by the author.

1.객체 & 캡슐화

Java Lambda 외부 변수 사용시 문제