프로토콜(Protocol)

썹스·2022년 10월 26일
0

Swift 문법

목록 보기
25/68

프로토콜(Protocol)

프로토콜(Protocol)은 특정 역할을 수행할 수 있도록 메서드(함수), 프로퍼티(변수) 등을 간단하게 정의(상세한 기능은 작성 X, 틀만 작성)하여 사용합니다.

프로토콜은 주로 Custom Type(클래스, 구조체, 열거형)이 채택(Adopt)하여 사용하며, 프로토콜를 채택한 타입은 프로토콜의 요구사항(기능 구현)을 모두 충족해야 합니다. (구현하지 않을 경우 에러 발생)

✅프로토콜의 기본 문법 및 사용법

  • 프로퍼티를 정의할 때는 읽기(get)만 사용할 것인지, 읽기/쓰기(get/set)를 사용할 것이지 정의해야 합니다.
  • 읽기(get)로 정의한 프로퍼티는 변수(var)와 상수(let)를 사용할 수 있으며, 계산 속성은 get{ }과 get/set{ }을 사용할 수 있습니다.
  • 읽기/쓰기(get/set)로 정의한 프로퍼티는 변수(var)로만 정의할 수 있으며, 계산 속성 또한 get/set{ }으로만 정의할 수 있습니다..
  • 프로토콜은 다중 채택을 허용하며, 쉼표( , )를 사용하여 다중 채택을 표현합니다.
protocol Hello{
    func hello1()             //기능 구현 없이 선언만!
    func hello2() -> String   //return type까지만 작성!
    func hello3(x: String) -> String  //parameter label과 parameter type 작성!


    var name1: String{get}       //읽기만 가능 -> 저장 속성(var, let), 계산 속상(get, get/set) 구현 가능
    var name2: String{get set}   //읽기/쓰기 가능 -> 저장 속성(var), 계산 속성(get/set) 구현 가능


    static var typeName: String{get set}   //타입 속성 및 타입 메서드 구현 가능
}


class Man: Hello{
    func hello1() {
        print("안녕1")
    }
    func hello2() -> String {
        return "안녕2"
    }
    func hello3(x: String) -> String {
        return "\(x) 안녕3"
    }

    var name1: String = "짱구"
    var name2: String{
        get{
            return "철수"
        }
        set{
            name2 = newValue
        }
    }

    static var typeName: String = "떡잎마을"
}


🤔프로토콜 없이 처음부터 Custom Type을 정의할 때 모든 기능을 구현하면 편하지 않을까??

  • 상위 클래스를 상속받은 하위클래스로부터 만들어진 인스턴스가 상위클래스의 모든 기능을 골고루 사용한다면 좋겠지만, 이는 현실적으로 불가능합니다. (현실적으로 수십~수백 개의 기능을 모두 사용할 수 없으며, 필요 없는 기능이 존재한다.)

  • 상속받은 기능을 사용하지 않고 상속만 받는다 하더라도 메모리공간을 차지하기 때문에 이 또한 비효율적이다.

이러한 클래스의 상속 단점을 보완하기 위해 만들어진 것이 프로토콜!!

✅ 상속의 단점: 상속시 필요없는 기능또한 상속 받아야한다.

class Animal{
    func meatEat(){
        print("육식~!")
    }
    func vegetableEat(){
        print("채식~!")
    }
 
    func aquaticAnimal(){
        print("저는 수상 동물입니다.")
    }
    func landAnimal(){
        print("저는 육상 동물입니다.")
    }
}


class Tiger: Animal{
    var name: String = "호돌이"
    /*
     -상속받은 함수-
     func meatEat()
     func vegetableEat()    //필요없는 함수

     func aquaticAnimal()   //필요없는 함수
     func landAnimal()
    */
}

✅ 프로토콜을 사용하여 상속의 단점을 보안

  • 필요한 기능만을 채택하여 구현하면 메모리 공간을 효율적으로 사용할 수 있습니다.
protocol MeatEat{
    func meatEat()
}

protocol VegetableEat{
    func vegetableEat()
}

protocol AquaticAnimal{
    func aquaticAnimal()
}

protocol LandAnimal{
    func landAnimal()
}


class Animal{

}


class Tiger: Animal, MeatEat, LandAnimal{
    var name: String = "호돌이"

    func meatEat() {
        print("육식~!")
    }
    func landAnimal() {
        print("저는 육상 동물입니다.")
    }
}


Reference

참고자료: 앨런 Swift문법 마스터 스쿨

profile
응애 나 코린이(비트코인X 코딩O)

0개의 댓글