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() // 리모컨 다른 동작