애정코딩 💻

BASIC 2021.05.10 댓글 0 Joana

02. 객체 지향 프로그래밍 입문 - 다형성과 추상화

 

다형성(Polymoriphism)

여러(poly) 모습(morph)을 갖는 것

 

객체 지향에서는 한 객체가 여러 타입을 갖는 것 

 

추상화(Abstraction)

데이터나 프로세스 등을 의미가 비슷한 개념이나 의미 있는 표현으로 정의하는 과정

두 가지 방식의 추상화

- 특정한 성질 ex) 통화, 금액 을 'Money class'로 추상화할 수 있다.

- 공통 성질(일반화) ex) 삼성의 SL-M2XX, HP MXX 을 '프린터'로 추상화 할수 있다.

 

서로 다른 구현을 추성화 한다. 예를 들어

(SCP로 파일 업로드, HTTP로 데이터 전송, DB 테이블에 삽입) => 푸시 발송 요청으로 추상화할 수 있다.

 

타입 추상화

여러 구현 클래스를 대표하는 상위 타입 도출

기능에 대한 의미만 제공하고 구현은 제공하지 않아 어떻게 구현할지 알 수 없다 .

-> 구현을 제공하는 클래스를 콘크리트 클래스라고 한다. 

 

예를 들어 추상 타입을 이용한 Notifier.class 가 있다고 했을 때 

Notifier notifier = getNotifier(...);

notifier.notify(somenoti);

해당 기능의 구현을 감출 수 있고, 기능의 구현이 아닌 의도를 더 잘 드러내서 가독성이 좋다.

 

만약 콘크리트 클래스를 직접 사용한다면?

1. 주문 취소가 되면 Sms 를 보내는 로직이 있다.

2. 요구사항이 변경되어 추가적으로 kakaoPush도 보내야한다.

3. 주문 취소 되는 로직에 아래와 같이 추가된다.

 

if(pushEnabled){

    kakaoPush.push();

} else {

    smsSender.send():

}

 

주문 취소 로직이 변경되지 않았지만 안에 있는 sms, kakaoPush 등이 변경된다.

 

추상 타입 사용 

공통점을 도출하여 추상 타입을 사용한다.

public void cancel(String ono){
// 주문 취소 처리
	Notifier notifier = getNotifier(..);
	norifier.notify(..);
}

private Notifier getNotifier(..){

	if(pushEnabled)
		return new KakaoNotifier();
	else
		return new SmsNotifier();
    
}

 

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

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

- 아직 존재하지 않는 기능에 대한 이른 추상화는 주의한다. -> 잘못된 추상화 가능성, 복잡도만 증가한다.

- 실제 변경, 확장이 발생할 때 추상화 시도

 

추상화를 잘 하려면 어떤걸 생각해야 할까?

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

 

예시)

 

기능 예시

- 클라우드 파일 통합 관리 기능 개발

- 대상 클라우드 - 드롭박스, 박스

- 주요기능 - 각 클라우드의 파일 목록 조회, 다운로드, 업로드, 삭제 ,검색

 

 -> 추상화하지 않을 경우 대상 클라우드가 추가되었을 때 ( NCLOUD ) 다운로드, 업로드, 조회 등에 if block이 각각 늘어난다.

-> 하지만 아래와 같이 추상화를 해준다면 기능의 대한 코드 수정 없이 새로운 종류의 클라이드를 추가할 수 있다.

객제 지향 프로그래밍 입문 - 최범균 / 인프런

이러한 구조를 OCP 라고 한다. 확장에 열려 있고 수정엔 닫혀 있다.

반응형