티스토리 뷰

728x90

확장으로 프로토콜 준수 추가 (Adding Protocol Conformance with an Extension)

 

프로토콜에 extension을 하게되면 기존 타입을 확장할 수 있습니다. 

 

예제를 보면서 이해하는게 더 빠를것 같습니다.

바로가시죠

 

Extension으로 기본값 지정하기

// 1
protocol Walkable {
    
}
// 2
protocol Portable {
    func port()
}
// 3
extension Walkable {
    func walk() {
        print("걷습니다")
    }
}
// 4
struct Human: Walkable, Portable {
    func port() {
        print("듭니다")
    }
}

var human = Human()
human.walk()      // 걷습니다
human.port()      // 듭니다

 

1. Walkable 프로토콜에는 선언된게 없습니다.

2. Portable 프로토콜엔 func port() 가 선언되어 있어요.

3. Walkable 프로토콜에 extension을 해서 func walk() 를 구현해줌으로써 기본값이 지정됩니다.
4. Human 구조체에서 Walkable, Portable을 채택함으로써 아래 와 같은 결과가 나오게 됩니다.

 

 

 

지정된 기본값 재정의 하기

protocol Walkable {
    
}

protocol Portable {
    func port()
}

extension Walkable {
    func walk() {
        print("걷습니다")
    }
}

struct Human: Walkable, Portable {
    func port() {
        print("듭니다")
    }
    // 재정의
    func walk() {
        print("(재정의) 걸을수 있습니다") 
    }
}

var human = Human()
human.walk()      // (재정의) 걸을수 있습니다
human.port()      // 듭니다

 

extension Walkable에 이미 구현된 walk 부분을 

구조체 Human에서 func walk() 부분을 재정의 하면 아래와 같은 결과가 나옵니다.

 

 

다중 프로토콜 채택

구조체의 경우는 상속의 개념이 없으므로 

다중 프로토콜 채택으로 중복으로 코드를 작성하는 경우를 줄일 수 있습니다.

 

protocol Walkable {
    func walk()
}

protocol Portable {
    func port()
}

extension Walkable {
    func walk() {
        print("걷습니다")
    }
}

extension Portable {
    func port() {
        print("듭니다")
    }
}

struct Man: Walkable, Portable {
    
}

struct Woman: Walkable, Portable {
    
}

var man = Man()
man.walk()
man.port()

var woman = Woman()
woman.walk()
woman.port()

 

 

 

728x90