suvera-dev πŸ₯¦

Swift) ν”„λ‘œν† μ½œ 지ν–₯ ν”„λ‘œκ·Έλž˜λ° λ³Έλ¬Έ

Language/Swift

Swift) ν”„λ‘œν† μ½œ 지ν–₯ ν”„λ‘œκ·Έλž˜λ°

suvera 2022. 4. 3. 23:46

μš°λ¦¬κ°€ iOS κ°œλ°œμ„ ν•˜λ©΄μ„œ μ“°λŠ” Swift μ–Έμ–΄λŠ” ν”„λ‘œν† μ½œ 지ν–₯ μ–Έμ–΄ 라고 ν•˜μ£  ! 

 

ν”νžˆ μ•Œκ³ μžˆλŠ” 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ€ 사물을 객체둜 ν˜•μ„±ν•˜μ—¬

곡톡점을 κ°–λŠ” λͺ¨λ“  κ³³μ—μ„œ μƒμ†λ°›λŠ” 객체 λ‚΄λΆ€μ˜ λ‘œμ§μ„ μΊ‘μŠν™” ν•©λ‹ˆλ‹€.

 

객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ€ SuperClass에 μ’…μ†μ μ΄λΌλŠ” 점과

Value Type을 μ‚¬μš©ν•  수 μ—†λ‹€λŠ” 것이 λ‹¨μ μΈλ°μš” !

 

또, λ‹¨ ν•˜λ‚˜μ˜ SuperClass 만 상속할 수 있기 λ•Œλ¬Έμ— μ‹œκ°„μ΄ μ§€λ‚˜λ©΄ κΈ°λŠ₯도 ν™•μž₯λ˜λ―€λ‘œ

이에 따라 λ³΅μž‘λ„κ°€ 높아지고 관리도 μ–΄λ €μ›Œ μ§€κ²Œ λ©λ‹ˆλ‹€. 

 


ν”„λ‘œν† μ½œ 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ€ ν•„μš”ν•œ λΆ€λΆ„λ§Œ ν”„λ‘œν† μ½œλ‘œ λΆ„λ¦¬ν•΄μ„œ λ§Œλ“€ 수 있고,

닀쀑 ν”„λ‘œν† μ½œμ„ κ΅¬ν˜„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€ !

또, ν”„λ‘œν† μ½œ κ·œμΉ™μ„ class, struct, enum에 μ μš©ν•  수 있기 λ•Œλ¬Έμ—

ν™•μž₯ λΆ€λΆ„μ—μ„œλ„ OOP보닀 μœ μ—°ν•˜λ‹€κ³  ν•  수 있겠죠 ~

 


μŠ€μœ„ν”„νŠΈλŠ” λŒ€λΆ€λΆ„ ꡬ쑰체둜 κΈ°λ³Έ νƒ€μž…μ΄ κ΅¬ν˜„λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€ !

String, Int, Float, Date, URL λ“±λ“±. 읡히 μ‚¬μš©ν•˜κ³  μžˆλŠ” 데이터 νƒ€μž…μ€ λͺ¨λ‘ ꡬ쑰체이고,

Array, Set, Dictionary λ˜ν•œ ꡬ쑰체둜 κ΅¬ν˜„μ΄ λ˜μ–΄μžˆμŠ΅λ‹ˆλ‹€.

 

그런데, κ΅¬μ‘°μ²΄λŠ” ν΄λž˜μŠ€μ™€ 달리 상속이 λΆˆκ°€λŠ₯ ν•©λ‹ˆλ‹€.

그러면 상속도 λ˜μ§€ μ•ŠλŠ” ꡬ쑰체둜 μ–΄λ–»κ²Œ λ‹€μ–‘ν•œ 곡톡 κΈ°λŠ₯을 κ°€μ§ˆ 수 μžˆμ„κΉŒμš” ? 

λ°”λ‘œ Protocol κ³Ό Extension이 있기 λ•Œλ¬Έμ΄μ£  !

 

 


μ˜ˆμ‹œ 

protocol Talkable {
    var topic: String { get set }
    func talk(to: Self)
}

struct Person: Talkable {
    var topic: String
    var name: String

    func talk(to: Person) {
        print("\(topic)에 λŒ€ν•΄ \(to.name)μ—κ²Œ μ΄μ•ΌκΈ°ν•©λ‹ˆλ‹€")
    }
}

μœ„μ˜ μ½”λ“œμ™€ 같이 Talkable μ΄λΌλŠ” ν”„λ‘œν† μ½œμ„ μƒμ„±ν•˜κ³  Personμ—μ„œ 이 ν”„λ‘œν† μ½œμ„ μ±„νƒν•©λ‹ˆλ‹€ !

ν”„λ‘œν† μ½œ 채택 μ‹œ ν”„λ‘œν† μ½œμ΄ μš”κ΅¬ν•˜λŠ” 사항을 λͺ¨λ‘ κ΅¬ν˜„ν•΄μ€˜μ•Όκ² μ£ .. !

 

Person의 λ‚΄λΆ€ μ½”λ“œλ₯Ό μ•Œμ§€ λͺ»ν•˜λ”라도,

Talkable을 μ±„νƒν•˜κ³  μžˆμœΌλ‹ˆ talk(to: ) λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ”κ²Œ κ°€λŠ₯ν•©λ‹ˆλ‹€.

 

또, μ•„λž˜μ™€ 같이 μ—¬λŸ¬κ°œμ˜ ν”„λ‘œν† μ½œμ„ μ±„νƒν•˜λŠ” 것이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

protocol Eatable {
    func eat()
}
protocol Moveable {
    func run()
    func walk()
}
struct Person: Talkable, Eatable, Moveable {
    var topic: String
    var name: String

    func talk(to: Person) {}
    func eat(){}
    func run(){}
    func walk(){}
}

ν•„μš”ν•œ κΈ°λŠ₯은 ν”„λ‘œν† μ½œλ‘œ 묢음으둜써 κΈ°λŠ₯의 λͺ¨λ“ˆν™”κ°€ κ°€λŠ₯ν•΄μ§‘λ‹ˆλ‹€ ! 

 

근데 Person 말고도 λ‹€λ₯Έ νƒ€μž…μ—μ„œλ„ μ±„νƒν•˜κ³  μ‹Άλ‹€λ©΄,

맀번 μš”κ΅¬μ‚¬ν•­μ„ κ΅¬ν˜„ν•΄μ•Όλ˜κΈ° λ•Œλ¬Έμ— μ€‘λ³΅λ˜λŠ” μ½”λ“œκ°€ λ°œμƒν•˜κ²Œ λ©λ‹ˆλ‹€. 

이λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ ν”„λ‘œν† μ½œμ˜ Extension에 미리 μš”κ΅¬μ‚¬ν•­λ“€μ„ κ΅¬ν˜„ν•΄ λ‘˜ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

이것을 ν”„λ‘œν† μ½œμ˜ μ΄ˆκΈ°κ΅¬ν˜„ 이라고 ν•©λ‹ˆλ‹€ !

protocol Talkable {
    var topic: String { get set }
    func talk(to: Self)
}

// μ΅μŠ€ν…μ…˜μ„ μ‚¬μš©ν•œ ν”„λ‘œν† μ½œ 초기 κ΅¬ν˜„
extension Talkable {
    func talk(to: Self) {
        print("\(to)! \(topic)")
    }
}

μ΄λ ‡κ²Œ μ΅μŠ€ν…μ…˜μœΌλ‘œ 미리 κ΅¬ν˜„ν•΄λ‘λ©΄,

ν”„λ‘œν† μ½œμ„ μ±„νƒν•˜κΈ°λ§Œ 해도 κ·Έ νƒ€μž…μ˜ κΈ°λŠ₯이 μΆ”κ°€λ˜μ–΄ μ‚¬μš©ν•  수 있게 λ©λ‹ˆλ‹€ !! 

 

λ§Œμ•½μ— ν”„λ‘œν† μ½œ 초기 κ΅¬ν˜„κ³Ό λ‹€λ₯Έ λ™μž‘μ„ ν•΄μ•Όν•œλ‹€λ©΄,

κ·Έμ € κ·Έ νƒ€μž…μ— ν”„λ‘œν† μ½œμ˜ μš”κ΅¬μ‚¬ν•­μ„ μž¬μ •μ˜ν•΄μ£Όλ©΄ λ©λ‹ˆλ‹€.

 


ν”„λ‘œν† μ½œ μ±„νƒλ§ŒμœΌλ‘œλ„ κ·Έ κΈ°λŠ₯을 μ‚¬μš©ν•  수 있게 ν”„λ‘œν† μ½œ μ΄ˆκΈ°κ΅¬ν˜„μ„ 잘 ν•΄λ‘λŠ”κ²Œ 

ν”„λ‘œν† μ½œ 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ μ€‘μš”ν•œ 뢀뢄이라고 ν•©λ‹ˆλ‹€ 🍞

 

λ˜ν•œ, OOP의 SuperClass와 달리 κΈ°λŠ₯듀을 λΆ„λ¦¬ν•˜μ—¬ Protocol Extension을 

생성할 수 있기 λ•Œλ¬Έμ— SuperClass의 단일화 λ¬Έμ œμ μ— λŒ€ν•œ 해결책이 될 수 μžˆμ„ 것 κ°™μŠ΅λ‹ˆλ‹€ :) 

 

 

 

 

μ°Έκ³ ν•œ λΈ”λ‘œκ·Έ

 

 

[Swift] ν”„λ‘œν† μ½œ 지ν–₯ ν”„λ‘œκ·Έλž˜λ°(Protocol-Oriented Programming) - jinShine

μ• ν”Œμ€ 2015λ…„ WWDCμ—μ„œ μŠ€μœ„ν”„νŠΈλ₯Ό λ°œν‘œν•˜λ©΄μ„œ μŠ€μœ„ν”„νŠΈ μ–Έμ–΄λŠ” ν”„λ‘œν† μ½œ 지ν–₯ μ–Έμ–΄(Protocol-Oriented Language)라고 λ°œν‘œ ν–ˆμŠ΅λ‹ˆλ‹€. ν”νžˆ μ•Œκ³  μžˆλŠ” 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°(Object-Oriented Programming)이라고

jinshine.github.io

 

 

ν”„λ‘œν† μ½œ 지ν–₯ ν”„λ‘œκ·Έλž˜λ°

μŠ€μœ„ν”„νŠΈλŠ” ν”„λ‘œν† μ½œ 지ν–₯ μ–Έμ–΄(Protocol-Oriented Language)이닀. μŠ€μœ„ν”„νŠΈλŠ” λŒ€λΆ€λΆ„ ꡬ쑰체둜 κΈ°λ³Έ νƒ€μž…μ΄ κ΅¬ν˜„λ˜μ–΄μžˆλ‹€. String, Int, Float, Date, URL λ“±λ“± 읡히 μ‚¬μš©ν•˜κ³  μžˆλŠ” 데이터 νƒ€μž…μ€ λͺ¨λ‘ ꡬ쑰체

velog.io

 

Comments