Jiseob Kim

iOS Developer

DesignPattern - Adapter Pattern μ•Œμ•„λ³΄κΈ°

12 Sep 2021 » DesignPattern


μš”μ¦˜ μ²΄ν…”μΉ΄μŠ€ν…κ³Ό 둬 λ¦¬μ„œμΉ˜ 맀λ ₯에 λΉ μ‘Œλ‹€. 이것도 ν¬μŠ€νŒ… 해봐야지

μ˜€λž«λ§Œμ— λ””μžμΈ νŒ¨ν„΄ μ μš©ν•˜κΈ°!

였늘의 μ£Όμ œλŠ” μ–΄λŒ‘ν„° νŒ¨ν„΄μ΄λ‹€.


μ–΄λŒ‘ν„°μ˜ 의미

ν˜„μ‹€μ—μ„œ κ°€μž₯ μ΄ν•΄ν•˜κΈ° μ‰¬μš΄κ±΄ μ—­μ‹œλ‚˜ 돼지코인듯 ν•˜λ‹€.

ν•΄μ™Έ μ „μž μ œν’ˆμ€ 110v인 κ²½μš°κ°€ μžˆλ‹€.

그런데 이것을 κ΅­λ‚΄λ‘œ κ°€μ Έμ™€μ„œ μ‚¬μš©ν•˜λ €λ©΄ μ½”λ“œμ™€ 돼지코λ₯Ό μ—°κ²°ν•΄μ€˜μ•Όν•œλ‹€.

μ΄λ•Œ λΌμ§€μ½”μ˜ 역할이 였늘 ν¬μŠ€νŒ… 주제인 μ–΄λŒ‘ν„° νŒ¨ν„΄μ΄λΌκ³  μ΄ν•΄ν•˜λ©΄ 될 것 κ°™λ‹€.


μ–΄λŒ‘ν„° νŒ¨ν„΄μ˜ ν•„μš”μ„±

μœ„μ™€ 같은 μ˜ˆμ œλŠ” μ΄ν•΄ν•˜κΈ° μ°Έ 쉽닀.

ν•˜μ§€λ§Œ μ½”λ“œλ‘œ μ μš©ν•˜λ €λ©΄ μ–΄μ©Œμ§€ λΌλŠ” 생각이 많이 λ“€μ—ˆλ‹€.


λ‚˜λ¦„ μ—΄μ‹¬νžˆ κ³ μ‹¬ν•΄μ„œ λ‚˜μ˜¨ μ˜ˆμ œλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

μ£Όμ œλŠ” μž¬λ‚œ μ§€μ›κΈˆμ΄λ‹€.


κΈ°μ‘΄ μΉ΄λ“œμ‚¬μ—μ„œ λˆμ„ μ“°κ³  λ‚˜λ©΄ λ‚¨κΈ°λŠ” 기둝 ν˜•νƒœκ°€ μžˆμ„ 것이닀.

 class UsedInfo {
     var userName: String
     var id: Int
     var usedDate: Date
     var usedPrice: Double
     
     init(userName: String, id: Int, usedDate: Date, usedPrice: Double) {
         self.userName = userName
         self.id = id
         self.usedDate = usedDate
         self.usedPrice = usedPrice
     }
 }


그런데, μ •λΆ€μ—μ„œ 지원을 ν–ˆμœΌλ―€λ‘œ 그에 맞게 기둝을 λ‚¨κΈ°λ˜ μ–΄λ–€ 처리λ₯Ό ν•˜λ˜κ°„μ—

그에 λ§žλŠ” λ§žμΆ€ν˜• 객체λ₯Ό λ”°λ‘œ λ§Œλ“€μ–΄λ‘λŠ”κ²Œ μ—¬λŸ¬λͺ¨λ‘œ νŽΈν•  것이닀.


근데 κ³ λ§™κ²Œλ„ μ•„λž˜μ²˜λŸΌ ν˜•νƒœλ₯Ό 지정해쀬닀.

protocol GovUsedInfoAvailable {
    var name: String { get }
    var id: Int { get }
    var date: String { get } // yyyy.MM.dd
    var price: Int { get }
}


그런데, ν”„λ‘œνΌν‹°μ˜ 의미적으둠 κ°™μœΌλ‚˜, 이름이 μ‘°κΈˆμ”© λ‹€λ₯΄κ³ , μžλ£Œν˜• λ˜ν•œ λ‹€λ₯΄λ‹€.

κ°„λ‹¨ν•˜κ²Œ μƒκ°ν•˜λ©΄, 이 ν”„λ‘œν† μ½œμ„ μ μš©ν•΄λ²„λ¦¬λ©΄ κ·Έλ§Œμ΄λ‹€.

ν•˜μ§€λ§Œ, κ·Έλž¬μ„ 경우 λ‹€μŒκ³Ό 같은 λ¬Έμ œκ°€ 생긴닀.


UsedInfo의 객체의 μ½”λ“œκ°€ λŠ˜μ–΄λ‚œλ‹€.

getter둜 λ§Œλ“€λ©΄ λ˜μ§€λ§Œ 이와 같은 방식을 μ΄μš©ν•˜κ²Œ λœλ‹€λ©΄, 또 λ‹€λ₯Έ μ–΄λ”˜κ°€μ™€ ν˜‘μ—…μ„ ν• λ•Œλ„

ν”„λ‘œν† μ½œμ„ μ μš©ν•΄λ²„λ¦¬κ² μ§€?

κ·Έλ ‡λ‹΄ μ–Όλ§ˆλ‚˜ μ§€μ €λΆ„ν•΄μ§ˆμ§€λŠ” 개인의 νŒλ‹¨μ— 맑기겠닀.


UsedInfo의 객체에 영ν–₯을 λΌμΉœλ‹€.

미관상도 λ³„λ‘œμ§€λ§Œ, λ§Œμ— ν•˜λ‚˜ 이 ν”„λ‘œν† μ½œμ„ λ”°λ₯΄λŠ” μ–΄λ–€ 값을 정뢀와 κ΄€λ ¨λœ μ½”λ“œ μ™Έμ—μ„œ 써버린닀?

κ·Έλž¬μ„ 경우 λ‚˜~쀑에 정뢀와 ν˜‘μ—…μ΄ λλ‚˜μ„œ ν•„μš” μ—†μ–΄μ§ˆ 경우, 정뢀와 μΌν•œ μ½”λ“œ λΆ€λΆ„ 외에도 λ‹€λ₯Έ 곳도 손을 λ΄μ•Όν•œλ‹€.


이 ν–‰μœ„λ₯Ό λΌμ§€μ½”λ‘œ λΉ„μœ ν•΄λ³΄μž μƒκ°ν•΄λ³΄μž.

μ“°κ³ μž ν•˜λŠ” μ „μž μ œν’ˆμ„ λΆ„ν•΄ν•΄μ„œ μ›ν•˜λŠ” ν˜•νƒœλ‘œ λ°”κΎΈκ³  λ‹€μ‹œ μž¬μ‘°λ¦½ν•˜λŠ” 격이닀.


λΌμ§€μ½”μ˜ μž₯점은 무엇인가?

220v에 ν•„μš”ν•œκ³³μ—μ„œλ§Œ 끼우고, ν•„μš” 없어지면 λΉΌλ©΄ κ·Έλ§Œμ΄λ‹€.

κΈ°μ‘΄ μ œν’ˆμ— μ „ν˜€ 영ν–₯을 주지 μ•ŠλŠ”λ‹€.


λ§ˆμ°¬κ°€μ§€λ‘œ μ–΄λŒ‘ν„° νŒ¨ν„΄μ„ μ“°λ €λŠ” μ΄μœ λŠ”

κΈ°μ‘΄ 객체에 영ν–₯을 주지 μ•ŠμœΌλ©΄μ„œ, λ‹€λ₯Έ 곳에 μ΄μš©μ„ ν•˜λŠ” 것이라 μƒκ°ν•œλ‹€.


Adapter Pattern μ‚¬μš©

μ–΄λŒ‘ν„° νŒ¨ν„΄μ„ μ‚¬μš©ν•΄λ³΄μž

κΈ°μ‘΄ UsedInfoλž€ 객체λ₯Ό μ΄ˆκΈ°ν™” 인자λ₯Ό λ°›λŠ” μƒˆλ‘œμš΄ 객체 UsedInfoForGovλ₯Ό λ§Œλ“€μž.

class UsedInfoForGov: GovUsedInfoAvailable {

    // 0. κΈ°μ‘΄ 객체λ₯Ό λ°›λŠ” 지정 μ΄ˆκΈ°ν™” ꡬ문
    init(usedInfo: UsedInfo) {
        self.usedInfo = usedInfo
    }

    // 1. ν”„λ‘œν† μ½œ κ·œμ•½μ„ λ”°λ₯Έ ν”„λ‘œνΌν‹°λ“€
    var name: String { return usedInfo.userName }
    var id: Int { return usedInfo.id}
    var date: String { return formatter.string(from: usedInfo.usedDate) }
    var price: Int { return Int(usedInfo.usedPrice) }
    
    // 2. κΈ°μ‘΄ 객체λ₯Ό λ°›λŠ” ν”„λ‘œνΌν‹°
    private var usedInfo: UsedInfo
    
    // 3. λ‚ μ§œ ν˜• λ³€ν™˜μ„ μœ„ν•œ ν”„λ‘œνΌν‹°
    private lazy var formatter: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy.MM.dd"
        return formatter
    }()
}


λ‚΄μš©μ€ 정말 κ°„λ‹¨ν•˜λ‹€.

  • GovUsedInfoAvailable ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•œλ‹€.
  • 주석0 - κΈ°μ‘΄ 객체λ₯Ό λ°›λŠ”λ‹€
  • 주석1 - μ •λΆ€ μš”μ²­λŒ€λ‘œ ν•„μš”ν•œ κ·œκ²©μ„ λ”°λ₯΄λ©° μ „λΆ€ getter둜만 κ΅¬ν˜„ν•¨μœΌλ‘œμ¨ ν•„μš”μ‹œ λ‹€λ₯Έ 연산이 λ“€μ–΄ 갈 수 μžˆλ‹€.
  • 주석2 - κΈ°μ‘΄ 객체λ₯Ό λ‹΄λŠ” ν”„λ‘œνΌν‹°
  • 주석3 - dateμ—μ„œ 쓰일 DateFormatter이닀. μš”μ²­ 사항 ν˜•νƒœκ°€ yyyy.MM.dd μ˜€μ–΄μ„œ κ·Έλ ‡λ‹€!


λ‹€μ‹œ ν•œλ²ˆ μž₯점을 λ§ν•˜μžλ©΄,

원본 객체λ₯Ό μ „ν˜€ 손상 μ‹œν‚€μ§€ μ•ŠλŠ”λ‹€. 이 λΆ€λΆ„λ§Œ 버렀도 λ¬΄λ°©ν•˜λ‹€. 즉, μœ μ§€λ³΄μˆ˜κ°€ μ‰¬μ›Œμ§„λ‹€.

끝!