본문 바로가기
swift

swift 프로토콜

by 승환파크 2024. 6. 14.

프로토콜

프로토콜은 특정 역할을 하기 위한 메소드, 프로퍼티, 기타 요구사항을 정의해 놓은 "규약" 혹은 "약속"으로 class, structure, enum이 프로토콜을 채택해서 특정 기능을 실행하기 위한 프로토콜의 요구사항을 실제로 구현할 수 있다.

 

프로토콜은 설계된 조건만 정의를 하고 제시를 할 뿐, 스스로 기능을 구현할 수 없다. 또한 프로토콜에서는 이름과 타입, 그리고 getteable, setteable 을 명시하고 프로퍼티를 선언할 때는 변수만 선언이 가능하다.(var 만 선언이 가능하다.) 또한 메소드를 정의할 때 메소드 이름과 리턴값을 지정할 수 있고, 구현 코드는 적지 않는다. 이후 class, structure, enum이 프로토콜을 '채택' 하면 모든 요구 사항을 충족해야 프로토콜을 '준수' 했다고 한다. 

 

이렇게 보면 프로토콜은 상속과 유사하다고 볼 수도 있지만, class 이외에 structure 나 enum도 프로토콜을 채택할 수 있다는 특징이 존재한다. 또한 상속은 다중 상속이 불가능하지만, 프로토콜은 다중 상속이 가능하다.

 

protocol 프로토콜이름 {
 // 프로토콜 정의
}

// 상속받는 클래스의 프로토콜 채택
class 클래스이름: 슈퍼클래스, 프로토콜1, 프로토콜2 {
 // 클래스 정의
}

protocol Vehicle {
    var speed: Double { get set } // get과 set을 모두 요구하는 가변 속성
    var manufacturer: String { get } // 읽기 전용 속성
}

class Car: Vehicle {
    var speed: Double = 0.0 // get과 set이 요구되는 속성을 구현
    var manufacturer: String = "Toyota" // 읽기 전용 속성을 구현
}

class Bicycle: Vehicle {
    var speed: Double = 0.0 // get과 set이 요구되는 속성을 구현
    var manufacturer: String { return "Giant" } // 읽기 전용 속성을 연산 프로퍼티로 구현
}

let car = Car()
car.speed = 60.0 // set 가능
print(car.speed) // get 가능
print(car.manufacturer) // get 가능

let bike = Bicycle()
bike.speed = 20.0 // set 가능
print(bike.speed) // get 가능
print(bike.manufacturer) // get 가능

 

// 프로토콜의 다중상속
protocol Coordination
 {
    var top: String { get set }
    var pants: String { get set }

    init(top: String, pants: String)

    func checkCoordination()
}

protocol Hair {
    var hair: String { get }

    func checkHairStyle()
}

struct Person: Coordination, Hair {
    var top: String
    var pants: String
    let hair: String = "포마드"

    func checkHairStyle() {
        print("오늘의 헤어스타일은 \(hair)스타일")
    }

    func checkCoordination() {
        print("상의: \(top)\n하의: \(pants)")
    }

    init(top: String, pants: String) {
        self.top = top
        self.pants = pants
    }     
}

let safari: Person = Person(top: "긴팔", pants: "반바지")
safari.checkHairStyle()
safari.checkCoordination()
//오늘의 헤어스타일은 포마드스타일
//상의: 긴팔
//하의: 반바지

'swift' 카테고리의 다른 글

UILabel  (0) 2024.06.21
스위프트 UIKit  (0) 2024.06.21
swift 접근 제한자  (0) 2024.06.13
Swift 프로퍼티 옵저버  (0) 2024.06.12
Swift 카카오 로그인  (1) 2024.05.10