Swift/swift 문법

프로토콜

Lyla. 2023. 4. 24. 14:44

프로토콜 이란?

: 프로토콜은 특정 기능 수행에 필수적인 요수를 청의한 청사진(blueprint)입니다. 프로토콜을 만족시키는 타입을 프로토콜을 따른다(conform)고 말합니다. 프로토콜에 필수 구현을 추가하거나 추가적인 기능을 더하기 위해 프로토콜을 확장(extend)하는 것이 가능합니다.

 

 

프로토콜 -> 클래스와 상속의 단점 보완

 

1. 하나의 클래스만 상속 가능 

2. 기본적인 상위 클래스의 메모리 구조를 따라갈 수 밖에 없음. 

3. 클래스 에서만 가능 

 

 

프로토콜 - 선택적 요구사항의 구현

:메서드 선언 앞에 @objc를 붙여주면 된다. 

 

프로토콜의 확장은 클래스와 구조체가 메서드를 호출하는 방식이 다르다. 

 

[인스턴스의 타입을 해당 클래스/구조체로 인식한 경우]

클래스 -> V 테이블

구조체 -> 코드주소를 찾아간다. 

 

[인스턴스의 타입을 프로토콜로 인식한 경우]

클래스 구조체 모두 W 테이블을 찾아간다. 

 

import UIKit

protocol Remote{
    func turnOn()
    func turnOff()
}

extension Remote {
    func turnOn() {print("리모컨 켜기")}
    func turnOff() {print("리모컨 끄기")}
    
    func doAnother() {
        print("리모컨 다른 동작")
    }
}

struct LgTv:Remote {
    func turnOn() {print("TV 켜기")}
    func turnOff() {print("TV 끄기")}
    
    func doAnother() {
        print("TV 다른 동작")
    }
}


class Mp3:Remote {
    func turnOn() {print("Mp3 켜기")}
    func turnOff() {print("Mp3 끄기")}
    
    func doAnother() {
        print("Mp3 다른 동작")
    }
}

var tv1 = LgTv()
tv1.doAnother() // TV 다른 동작

var tv2:Remote = LgTv()
tv2.doAnother() // 리모컨 다른 동작

var mp3 = Mp3()
mp3.doAnother() //Mp3 다른 동작

var mp4:Remote = Mp3()
mp4.doAnother() // 리모컨 다른 동작