λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

🍎 iOS/Design Pattern

[Design Pattern] κ΅¬μ‘°νŒ¨ν„΄ - Adapter Pattern

ꡬ쑰 νŒ¨ν„΄ 

μ–΄λŒ‘ν„° νŒ¨ν„΄μ€ λ””μžμΈνŒ¨ν„΄ 쀑 ꡬ쑰 νŒ¨ν„΄μ— ν•΄λ‹Ήν•˜κΈ° λ•Œλ¬Έμ—, ꡬ쑰 νŒ¨ν„΄μ΄ 무엇인지 λΆ€ν„° μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€!
ꡬ쑰 νŒ¨ν„΄μ€ ν΄λž˜μŠ€μ™€ 객체가 μ–΄λ–»κ²Œ κ΅¬μ„±λ˜λŠ”μ§€μ™€ 관련이 μžˆμŠ΅λ‹ˆλ‹€.
ꡬ쑰 νŒ¨ν„΄μ€ μƒˆλ‘œμš΄ κΈ°λŠ₯을 κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄ μΈν„°νŽ˜μ΄μŠ€λ‚˜ κ΅¬ν˜„μœΌλ‘œ μ²˜λ¦¬ν•˜κΈ° λ³΄λ‹€λŠ” κ°μ²΄λ₯Ό κ΅¬μ„±ν•˜λŠ” 방법을 μ •μ˜ν•©λ‹ˆλ‹€. μ΄λ ‡κ²Œ μΆ”κ°€λœ κΈ°λŠ₯λ“€μ˜ μœ μ—°μ„±μ€ λŸ°νƒ€μž„μ—μ„œ ꡬ성을 λ³€κ²½ν•  수 μžˆλŠ” λŠ₯λ ₯μ—μ„œ λΉ„λ‘―λ˜λ©°, 정적 ν΄λž˜μŠ€λ‘œλŠ” ν•  수 μ—†λŠ” μΌμž…λ‹ˆλ‹€.

κ°„λ‹¨ν•˜κ²Œ λ§ν•΄μ„œ ꡬ쑰 νŒ¨ν„΄μ€ μ—¬λŸ¬κ°œμ˜ 독립적인 클래슀λ₯Ό ν•˜λ‚˜μ²˜λŸΌ μ‚¬μš©ν•  λ•Œ μ‚¬μš©ν•˜κ±°λ‚˜ μ—¬λŸ¬ μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν†΅ν•©ν•˜μ—¬ ν•˜λ‚˜μ˜ μΈν„°νŽ˜μ΄μŠ€λ‘œ λ§Œλ“œλŠ” νŒ¨ν„΄μ΄λΌκ³  ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Adapter Pattern (μ–΄λŒ‘ν„° νŒ¨ν„΄)

μ–΄λŒ‘ν„° νŒ¨ν„΄μ€ ν˜Έν™˜λ˜μ§€ μ•ŠλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό 가진 두 개의 객체가 ν•¨κ»˜ λ™μž‘ν•  수 μžˆλ„λ‘ ν•΄μ£ΌλŠ” ꡬ쑰 섀계 νŒ¨ν„΄μž…λ‹ˆλ‹€.
νŠΉμ • 객체의 μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ³€ν™˜ν•΄μ„œ λ‹€λ₯Έ 객체에 μ μ‘μ‹œμΌœ μ‚¬μš©ν•  수 있게 도와주어,
μΈν„°νŽ˜μ΄μŠ€κ°€ μ„œλ‘œ λ‹€λ₯Έ νƒ€μž…μ΄ λ™μΌν•œ ν˜•μ‹μœΌλ‘œ μž‘λ™ν•  수 μžˆλ„λ‘ λ§Œλ“€μ–΄ μ€λ‹ˆλ‹€.

ν•΄μ™Έμ—¬ν–‰κ°€λ©΄ μš°λ¦¬λ‚˜λΌμ—μ„œ μ“°λŠ” 220V용 μ½˜μ„ΌνŠΈκ°€ λ§žμ§€ μ•ŠλŠ” λ‚˜λΌλ“€λ„ λ§Žμ•„μ„œ μ–΄λŒ‘ν„° μ±™κ²¨κ°€μž–μ•„μš”??
ν•΄λ‹Ή λ‚˜λΌμ˜ κ·œκ²©μ— λ§žμ§€ μ•ŠλŠ” μ½˜μ„ΌνŠΈλ₯Ό μ–΄λŒ‘ν„°λ₯Ό μ—°κ²°ν•΄ μ‚¬μš©ν•  수 있게 λ˜λŠ” 것 처럼,
μ„œλ‘œ λ‹€λ₯Έ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 가진 객체λ₯Ό μ–΄λŒ‘ν„° νŒ¨ν„΄μ΄ ν•¨κ»˜ μ‚¬μš©ν•  수 μžˆλ„λ‘ λ³€ν™˜ν•΄μ£ΌλŠ” 역할을 ν•œλ‹€κ³  μ΄ν•΄ν•˜λ©΄ μ‰¬μšΈ 것 κ°™μŠ΅λ‹ˆλ‹€.

 

Adapter νŒ¨ν„΄μ„ UML둜 λ„μ‹ν™”ν•˜λ©΄ μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

  • Client : μ™ΈλΆ€ λΌμ΄λΈŒλŸ¬λ¦¬λ‚˜ μ‹œμŠ€ν…œμ„ μ‚¬μš©ν•˜λ €λŠ” 객체
  • Adaptee : μ™ΈλΆ€ 라이브러리 및 μ™ΈλΆ€ μ‹œμŠ€ν…œ 객체(κΈ°μ‘΄ 객체) → μΈν„°νŽ˜μ΄μŠ€κ°€ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— λ°”λ‘œ μ‚¬μš©ν•  수 μ—†λ‹€.
  • Target : Adapterκ°€ κ΅¬ν˜„ν•˜λŠ” 좔상 μΈν„°νŽ˜μ΄μŠ€ 객체, ν΄λΌμ΄μ–ΈνŠΈλŠ” νƒ€κ²Ÿ(Target)의 μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν†΅ν•΄μ„œ Adaptee의 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜κ²Œ λœλ‹€. (λ‹€λ₯Έ ν΄λž˜μŠ€κ°€ ν˜„μž¬ λ‘œμ§μ— ν¬ν•¨λ˜λ €λ©΄ 따라야 ν•˜λŠ” ν”„λ‘œν† μ½œ)
  • Adapter : Adaptee(κΈ°μ‘΄ 객체)와 ν΄λΌμ΄μ–ΈνŠΈ λ‘˜ λ‹€ μ‚¬μš©ν•  수 μžˆλ„λ‘ μ€‘κ°„μ—μ„œ μ—°κ²°μ‹œμΌœμ£ΌλŠ” 역할을 ν•œλ‹€. νƒ€κ²Ÿ(Target) μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λ©° ν΄λΌμ΄μ–ΈνŠΈλŠ” νƒ€κ²Ÿ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 톡해 μ–΄λŒ‘ν„°μ— μš”μ²­μ„ 보낸닀. AdapterλŠ” Client, Adaptee 객체λ₯Ό λͺ¨λ‘ λ‹€λ£° 수 있고 Adaptee 객체λ₯Ό Client μΈν„°νŽ˜μ΄μŠ€λ‘œ λž˜ν•‘ ν•˜κ±°λ‚˜ Client 객체λ₯Ό Adaptee ν΄λž˜μŠ€κ°€ μ‚¬μš©ν•  수 μžˆλŠ” ν˜•μ‹μœΌλ‘œ λ³€ν™˜ν•œλ‹€.
    → Adapterλ₯Ό μ‚¬μš©ν•˜λ©΄ κΈ°μ‘΄ Client μ½”λ“œλ₯Ό μˆ˜μ •ν•˜μ§€ μ•Šκ³ λ„ μƒˆλ‘œμš΄ ν΄λž˜μŠ€λ“€μ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

μ•„κΉŒ μ½˜μ„ΌνŠΈλ‘œ μ˜ˆμ‹œλ₯Ό λ“€μ—ˆλŠ”λ° μš”λ ‡κ²Œ 잘 λΉ„μœ ν•΄ 놓은 그림이 μžˆλ”λΌκ΅¬μš”?? 

μ°Έκ³ ν•΄λ³΄μ‹œλ©΄ μ–΄λŒ‘ν„° νŒ¨ν„΄μ„ λŒ€λž΅μ μœΌλ‘œ μ΄ν•΄ν•˜λŠ” 데 도움이 될 것 κ°™μŠ΅λ‹ˆλ‹€πŸ˜ŠπŸ˜Š 

 

μ˜ˆμ‹œμ½”λ“œ

μ‰¬μš΄ 이해λ₯Ό μœ„ν•΄ κ°„λ‹¨ν•œ μ˜ˆμ‹œ μ½”λ“œλ₯Ό λ³΄κ² μŠ΅λ‹ˆλ‹€.

/// Adapterκ°€ κ΅¬ν˜„ν•˜λŠ” 좔상 μΈν„°νŽ˜μ΄μŠ€ 객체.
/// ν΄λΌμ΄μ–ΈνŠΈλŠ” Target의 μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν†΅ν•΄μ„œ Adaptee의 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜κ²Œ λœλ‹€.
class Target {
    func request() -> String {
        return ""
    }
}

// μ™ΈλΆ€ 라이브러리 및 μ™ΈλΆ€ μ‹œμŠ€ν…œ 객체(κΈ°μ‘΄ 객체)
class Adaptee {
    public func specificRequest() -> String {
        return "Adaptee's specificRequest."
    }
}

// μΈν„°νŽ˜μ΄μŠ€μ™€ ν˜Έν™˜λ˜λ„λ‘ ν•΄μ£ΌλŠ” μ–΄λŒ‘ν„°
// νƒ€κ²Ÿ(Target) μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λ©° ν΄λΌμ΄μ–ΈνŠΈλŠ” νƒ€κ²Ÿ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 톡해 μ–΄λŒ‘ν„°μ— μš”μ²­μ„ 보낸닀.
class Adapter: Target {
    private var adaptee: Adaptee

    init(_ adaptee: Adaptee) { // μ˜μ‘΄μ„± μ£Όμž…
        self.adaptee = adaptee
    }

    override func request() -> String { // 좔상 μΈν„°νŽ˜μ΄μŠ€ 객체 μƒμ†λ°›μ•„μ„œ ν•¨μˆ˜ μž¬μ •μ˜
        return self.adaptee.specificRequest()    }
}

// μ™ΈλΆ€ λΌμ΄λΈŒλŸ¬λ¦¬λ‚˜ μ‹œμŠ€ν…œμ„ μ‚¬μš©ν•˜λ €λŠ” 객체
class Client {
    static func specificRequest(target: Target) {
        print("Call from adapter - \(target.request())")
    }
}

let adaptee = Adaptee()

print(adaptee.specificRequest()) 
// Adaptee's specificRequest.
        
Client.specificRequest(target: Adapter(adaptee)) 
// Call from adapter - Adaptee's specificRequest.

μ–΄λ–€ μƒν™©μ—μ„œ μ‚¬μš©ν•  수 μžˆμ„κΉŒ?

  • ν•˜λ‚˜μ˜ μ„œλΉ„μŠ€μ—μ„œ μ—¬λŸ¬ ν”Œλž«νΌ κ³„μ •μœΌλ‘œ 둜그인 κΈ°λŠ₯을 μ§€μ›ν•˜λŠ” 경우
    ex) μ•± λ‚΄ 계정 생성을 ν•˜κ³  λ‘œκ·ΈμΈμ„ ν•  수 μžˆλ„λ‘ λ˜μ–΄μžˆλŠ” μ„œλΉ„μŠ€μ—μ„œ 좔후에 μ†Œμ…œλ‘œκ·ΈμΈ κΈ°λŠ₯을 μΆ”κ°€ν•˜κ³  μ‹Άλ‹€λ©΄?
    넀이버, 카카였, μ• ν”Œ λͺ¨λ‘ λ‹€λ₯Έ ν˜•νƒœμΌ 수 μžˆλŠ”λ°, κΈ°μ‘΄ 둜그인 μ„œλΉ„μŠ€ ν”„λ‘œν† μ½œμ„ μ±„νƒν•˜λŠ” Adapterλ₯Ό μ‚¬μš©ν•˜μ—¬ μ„œλΉ„μŠ€λ₯Ό ν™•μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • νƒ€μ‚¬μ˜ λΌμ΄λΈŒλŸ¬λ¦¬λ‚˜ λͺ¨λ“ˆμ„ μ‚¬μš©ν•΄μ•Ό ν•  λ•Œ, 같은 ν”„λ‘œμ νŠΈμ—μ„œ λ‹€λ₯Έ νŒ€μ΄ κ΅¬ν˜„ν•΄λ†“μ€ 클래슀의 κΈ°λŠ₯을 κ°€μ Έλ‹€ μ‚¬μš©ν•  λ•Œ
    ex) AνŒ€μ΄ μ‹ μš©μΉ΄λ“œλ₯Ό λ“±λ‘ν•˜κ³  μ‘°νšŒν•˜λŠ” 클래슀λ₯Ό λ§Œλ“€μ–΄ λ†“μ•˜μŠ΅λ‹ˆλ‹€. BνŒ€μ΄ 이 κΈ°λŠ₯을 ν™•μž₯ν•˜κ³  μ‹Άλ‹€λ©΄ AνŒ€μ˜ 클래슀λ₯Ό μƒμ†λ°›λŠ” Adapterλ₯Ό μ‚¬μš©ν•΄ 좔가적인 κΈ°λŠ₯을 κ΅¬ν˜„ν•  수 μžˆμ„ 것 κ°™μŠ΅λ‹ˆλ‹€.

[이미지 좜처]

https://www.slideshare.net/BillKim8/swift-adapter

 

[참고 자료]

 

swift λ””μžμΈνŒ¨ν„΄ - Adapter Pattern

swift λ””μžμΈνŒ¨ν„΄ - Adapter Pattern μ–Έμ œ μ‚¬μš©ν•˜λ‚˜? 1.μ—°κ΄€μ„± μ—†λŠ” 두객체λ₯Ό λ¬Άμ–΄μ„œ μ‚¬μš©ν•΄μ•Όν• λ•Œ. 2.νƒ€μ‚¬μ˜ 라이브러리 or λͺ¨λ“ˆμ„ μ‚¬μš©ν•΄μ•Ό ν• λ•Œ. 3.같은 ν”„λ‘œμ νŠΈμ—μ„œ λ‹€λ₯ΈνŒ€μ΄ κ΅¬ν˜„ν•΄ 놓은 클래슀

qteveryday.tistory.com

 

[Swift λ””μžμΈ νŒ¨ν„΄] Structural Pattern (ꡬ쑰 νŒ¨ν„΄) - λ””μžμΈ νŒ¨ν„΄ 곡뢀 6.5

μ•ˆλ…•ν•˜μ„Έμš” Pinguμž…λ‹ˆλ‹€.🐧 μ§€λ‚œ κΈ€μ—μ„œ μ•Œμ•„λ³Έ μ‹±κΈ€ν„΄ νŒ¨ν„΄μ„ 마무리둜 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ λ””μžμΈ νŒ¨ν„΄ 쀑 Creational Pattern(생성 νŒ¨ν„΄)에 λŒ€ν•œ 곡뢀λ₯Ό 마치고 이번 κΈ€λΆ€ν„°λŠ” Structural Pattern(ꡬ

icksw.tistory.com

 

'🍎 iOS > Design Pattern' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[Design Pattern] 싱글톀 νŒ¨ν„΄(Singleton Pattern)  (11) 2022.02.08