• 검색 결과가 없습니다.

Chapter 2. Adapter 필요한 형태로 수정해서 재활용한다

N/A
N/A
Protected

Academic year: 2022

Share "Chapter 2. Adapter 필요한 형태로 수정해서 재활용한다"

Copied!
20
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

2012-1

덕성여자대학교 정보미디어대학

교재: 자바언어로배우는디자인패턴입문(개정판)/YukiHiroshi저/김윤정역/영진닷컴

(2)

AC 어댑터

직류 12볼트

교류 100볼트

 AC 어댑터

– 기존의 교류 220볼트 전기를, 직류 12 볼트로 바꾸어 준다 – 필요한 건 12볼트인데, 220볼트 밖에 없다. => 어댑터를 사용

한다.

(이미 제공되는 것)

(필요로하는 것)

220

(3)

 Adapter 패턴

– 이미 제공되어 있는 것을 그대로 사용할 수 없는 경우

– ‘이미 제공되어 있는 것’과 ‘필요한 것’ 사이의 간격을 메우는 디자인 패턴

– Wrapper 패턴이라고도 한다.

 두 가지 종류의 Adapter 패턴

– 상속(inheritance)을 이용한 Adapter 패턴 – 위임(delegation)을 이용한 Adapter 패턴

(4)

 Banner 클래스

– showWithParen( ): 문자열 앞뒤에 괄호를 쳐서 표시하는 메소드 – shwoWithAster( ): 문자열 앞뒤에 ‘*’를 붙여서 표시하는 메소드 – 이 두 메소드를 ‘이미 제공되어 있는 것’으로 가정한다.

 Print 인터페이스

– printWeak( ): 문자열을 약하게 표시(괄호를 붙임) – printStrong( ): 문자열을 강하게 표시(‘*’ 붙임)

– 이 두 메소드를 직류 12볼트와 같은 ‘필요한 것’이라고 가정한다.

 목표

– Banner 클래스라는 기존의 클래스를 이용해서, Print 인터페이스 를 충족시키는(즉, 구현하는) 클래스를 만들고자 한다.

(5)

 이미 제공되는 것:

 필요로 하는 것:

필요한 메소드는, Print 인터페이스에 정의되어 있는 printWeak와 printStrong이다.

그러나, 같은 일을 하는 메소드를 Banner 클래스가 제공한다.

 Banner 클래스의 메소드들을 재활용하는 Adapter 클래스를 만든다.

 PrintBanner 클래스

<<interface>>

Print printWeak printStrong

<<interface>>

Print printWeak printStrong

Banner

showWithParen showWithAster

Banner

showWithParen

showWithAster

(6)

Client

이미 존재하며 수정하지 못하는 클래스

Banner

showWithParen showWithAster

Banner

showWithParen showWithAster

<<interface>>

Print printWeak printStrong

<<interface>>

Print printWeak printStrong

필요한 메소드를 선언한 인터페이스

Print 인터페이스에 선언된 메소드를 이용해서 Banner 클래스가 가지고 있는

메소드를 이용하고자 한다.

(7)

 PrintBanner 클래스

– Banner 클래스를 상속하면서, Print 인터페이스를 구현한다.

 전원 예와 예제 프로그램 비교

직류 12볼트 어댑터

교류 100볼트

전원의 비유

Print 인터페이스(printWeak, printStrong)

필요한 것

PrintBanner클래스 교환장치

Banner클래스

(showWithParen,showWithAster) 제공되어 있는 것

예제 프로그램

직류 12볼트 어댑터

교류 100볼트

전원의 비유

Print 인터페이스(printWeak, printStrong)

필요한 것

PrintBanner클래스 교환장치

Banner클래스

(showWithParen,showWithAster) 제공되어 있는 것

예제 프로그램

(8)

 Banner 클래스 소스 (sample1/Banner.java)

 Print 인터페이스 소스 (sample1/Print.java)

 PrintBanner 클래스 소스 (sample1/PrintBanner.java)

– Banner 클래스를 상속, Print 인터페이스를 구현

– printWeak( ): 상속받은 showWithParen( )을 호출한다.

– printStrong( ): 상속받은 showWithAster( )를 호출한다.

(9)

 클래스 다이어그램

showWithParen showWithAster

Main

PrintBanner

printWeak printStrong

<<interface>>

Print printWeak printStrong

Banner

Uses

showWithParen showWithAster

Main

PrintBanner

printWeak printStrong

<<interface>>

Print printWeak printStrong

Banner

Uses

▼ Main

PrintBanner

printWeak printStrong

<<interface>>

Print printWeak printStrong

Banner

Uses

(10)

 Main 클래스 소스 (sample1/Main.java)

– PrintBanner의 인스턴스를 Print 인터페이스 형의 변수에 할당

 Main 클래스는, Print 인터페이스를 사용해서 프로그래밍했음

 실제 일을 수행하는 Banner 클래스의 메소드는, Main 클래스에서 는 완전히 은폐되어 있다.

– Main 클래스를 수정하지 않고도, PrintBanner 클래스의 구현을 변경할 수 있다.

(11)

 위임

– 내가 할 일을 누군가에게 맡긴다.

– 예제에서:

 PrintBanner는 자신이 할 일을 Banner 클래스의 인스턴스에게 맡 긴다.

 예제1과 달리, Print를 클래스로 가정하면,

– PrintBanner가 Print와 Banner의 하위 클래스로 정의할 수 없 다. (다중 상속을 자바는 지원하지 않기 때문에)

– 위임을 사용해야 한다.

(12)

 Print 클래스 (sample2/Print.java)

– 추상 클래스로 정의됨

 PrintBanner 클래스 (sample2/PrintBanner.java)

– banner 필드가 Banner 클래스의 인스턴스를 가진다.

– printWeak( ):

 banner의 showWithParen()을 호출한다.

 PrintBanner 자신이 일을 처리하지 않고, banner에게 위임한다.

– printStrong( ):

 banner의 showWithAster()을 호출한다.

 PrintBanner 자신이 일을 처리하지 않고, banner에게 위임한다.

(13)

 클래스 다이어그램

Main

PrintBanner banner

printWeak printStrong Print

printWeak printStrong

Banner

showWithParen showWithAster

Uses

▼ Main

PrintBanner banner

printWeak printStrong Print

printWeak printStrong

Banner

showWithParen showWithAster

Uses

(14)

 Target(대상)의 역할

– 필요한 메소드를 제공(선언)하는 역할

– 예제: 직류 12 볼트 또는 Print 인터페이스나 클래스

 Client(의뢰자)의 역할

– Target 역할의 메소드를 이용하는 역할

– 예제: 12 볼트로 동작하는 노트북이나 Main 클래스

 Adaptee(변경되는 측)의 역할

– 이미 준비되어 있는 메소드를 제공하는 역할 – 예제: 교류 100볼트 전원이나 Banner 클래스

 Adapter의 역할

– Target 역할을 실제로 충족시키는 역할 – 예제: 어댑터나 PrintBanner 클래스

(15)

상속을 이용한 패턴

 위임을 이용한 패턴

methodA methodB methodC

Client

Adapter

targetMethod1 targetMethod2

<<interface>>

Target targetMethod1 targetMethod2

Adaptee

Uses

extends ▶

◀ implements

methodA methodB methodC

Client

Adapter

targetMethod1 targetMethod2

<<interface>>

Target targetMethod1 targetMethod2

Adaptee

Uses

extends ▶

◀ implements

Client

Adapter

targetMethod1 targetMethod2

<<interface>>

Target targetMethod1 targetMethod2

Adaptee

Uses

extends ▶

◀ implements

Client

Adapter adaptee targetMethod1 targetMethod2

<<interface>>

Target targetMethod1 targetMethod2

Adaptee

methodA methodB methodC

Uses

has ▶

◀ extends

Client

Adapter adaptee targetMethod1 targetMethod2

<<interface>>

Target targetMethod1 targetMethod2

Adaptee

methodA methodB methodC

Uses

has ▶

◀ extends

Client

Adapter adaptee targetMethod1 targetMethod2

<<interface>>

Target targetMethod1 targetMethod2

Adaptee

methodA methodB methodC

Uses

has ▶

◀ extends

(16)

어떤 경우에 사용할까

– 기존의 클래스를 수정해서 필요한 클래스로 만들 때 사용함 – 기존의 클래스가 충분히 테스트 되어 있을 때 더욱 좋다

 재사용

 만약 소스가 없더라도

– 기존의 클래스는 손을 대지 않고, 새로운 인터페이스에 기존의 클래스를 맞출 수 있다.

– 특히, 기존 클래스의 소스 코드 없이, 메소드의 프로토타입만 알면 어댑터 패턴을 적용할 수 있다.

메소드 프로토타입: 메소드의 이름, 인자 개수, 인자형, 반환형 등

(17)

Bridge 패턴(9장)

 Decorator 패턴(12장)

(18)

인터페이스(API)가 다른 두 개의 사이에 들어가 그 사이를 메우는 Adapter 패턴

– API: Application Programming Interfaces

(19)

2-2

– 기존에 제공되는 클래스: java.util.Properties

 “프로퍼티이름=값” 형식의 내용을 갖는 파일(프러퍼티 파일)로부 터 값을 읽어오거나 설정하는데 사용되는 클래스

Properties load( )

store( )

setProperty( ) getProperty( ) FileIO

readFromFile( ) writeToFile( ) setValue( ) getValue( )

Main

필요로하는 것 제공되는 것

uses

사이를 메꾸는 어댑터 클래스가 필요하다

(20)

2-2

– 어댑터 FileProperties: Properties 상속, FileIO 구현

 Main 클래스는, FileIO의 인터페이스를 호출한다.

 FileIO를 구현한 FileProperties의 각 메소드들은 Properties의 해당 메소드를 호출한다.

Properties load( )

store( )

setProperty( ) getProperty( )

FileProperties readFromFile( ) writeToFile( ) setValue( ) getValue( )

Main

uses

FileIO

readFromFile( )

writeToFile( )

setValue( )

getValue( )

참조

관련 문서

– 뇌파를 이용한 인터페이스, 감성컴퓨터, 뇌파로 가전기기 작동 – 촉각을 이용한 인터페이스 (Haptic Feedback).

이와 같은 방법으로 제조하 는 것을 직류법(straight-run fractional distilation)이라 한다... 2) 전환법. 직류법에서 연료를 제조하면 필요한 성분, 즉

본 연구에서는 그래핀 및 기존의 다른 반도체 물질보다 뛰어난 특성을 가진 전 이금속 칼코겐 화합물 물질 중 ReSe 2 를 이용하여 ReSe 2 기반의 전계효과트

즉 , 이벤트 처리용 리스너 클래스 작성시 리스너 인터페이스 를 이용한 것이 아니라, 어댑터 클래스를 이용함으로써 불필 요한 코드를 줄일 수

그러나 이미 풀어서 답을 알고 있는 부분문제 의 결과가 다시 필요한 경우에는 반복하여 계산하는 대 신에 이미 계산된 결과를 그냥

• 한 클래스를 처음부터 새로 만들려고 하면 필요한 변수들과 메소드들을 전부 다 새로 만들어야 한다.. • 그러나 상속을 이용하여 기존 클래스로부터 새

막연하게 무조건 많이 벌어 풍족하게 돈 을 쓰려는 것이 목적이 아니라, 내가 이루고 싶은 목표 특히 돈이 필요한 목표(이를 재무목표라 한다)를 세우고 이를 달성하기

2.6 단백질의 amino acid sequence가 단백질의 3차 구조를