[객체 지향 프로그래밍 입문] 다형성과 추상화

kshired·2021년 8월 19일
1

다형성 ( Polymorphism )

  • 여러 ( poly ) 모습 ( morph ) 을 갖는 것
  • 객체지향에서는 한 객체가 여러 타입을 갖는 것
    • 즉 한 객체가 여러 타입의 기능을 제공
    • 타입 상속으로 다형성을 구현
    • 하위 타입은 상위 타입도 된다

예시

public class Timer {
	public void start(){ // ... }
	public void stop(){ // ... }
}

public interface Rechargeable {
	void charge();
}

public class IotTimer extends Timer implements Rechargeable {
	public void charge(){
		 // ...
	}
}

IotTimer it = new IotTimer();
it.start();
it.stop();
it.charge();

Timer t = it;
t.start();
t.stop();

Rechargeable r = it;
r.charge();

추상화 ( Abstraction )

  • 데이터나 프로세스 등을 의미가 비슷한 개념이나 의미 있는 표현으로 정의하는 과정
  • 두 가지 방식의 추상화
    • 특정한 성질
    • 공통 성질 ( 일반화 )
  • 간단한 예
    • DB의 USER 테이블 : id, username, email
    • Money 클래스 : 통화, 금액

타입 추상화

  • 여러 구현 클래스를 대표하는 상위 타입 도출
    - 흔히 인터페이스로 추상화
    - 추상화 타입과 구현은 타입 상속으로 연결

추상 타입 사용

  • 추상 타입을 이용한 프로그래밍
Notifier notifier = getNotifier(); // 어떤 구체 클래스를 사용하는지 몰라도 된다! 인터페이스에 의존
notifier.notify(someNoti);
  • 추상 타입은 구현을 감춤
    • 기능의 구현이 아닌 의도를 더 잘 드러냄

추상 타입 사용에 따른 이점 : 유연함

  • 구체 클래스를 직접 사용하면 유연하게 프로그래밍을 하기 어려워짐

위 코드도 요구 사항이 변경됨에 따라 주문 취소 코드가 계속 변경 됨을 알 수 있음

  • 공통점을 도출하여 추상 타입을 사용하면 유연함을 가질 수 있음

Notify 라는 공통점을 찾아 Notifier로 추상화하여 그것을 getNotifier, notify 로 변경하여 유연함을 가질 수 있게 됨.

추상화는 의존 대상이 변경하는 시점에 해야한다

  • 추상화 → 추상 타입 증가 → 복잡도 증가
    • 아직 존재하지 않는 기능에 대한 이른 추상화는 주의해야한다.
      • 잘못된 추상화 가능성, 복잡도만 증가할 수 있음
    • 실제 변경 및 확장이 발생할 때 추상화를 시도

추상화를 잘 하려면

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

어떠한 추상화를 하던간에 추상화를 하는 이유가 무엇때문인지를 생각해야합니다.

profile
글 쓰는 개발자

0개의 댓글