ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Protocol의 메모리 주소와 프로토콜의 확장 구현시 실행 메서드
    Swift/swift 문법 2023. 5. 13. 20:58

    :Protocol은 자격증

    -> 어떤 구조체나 클래스도 채택 가능하다. 테이블과 메서드 주소가 정해져있지 않고, 채택해서 구현할 때 테이블이 만들어진다. 

     

    클래스에서 직접 구현한 메서드는 확장에서 구현한 메서드보다 우선순위가 생긴다.

     

    <전체 코드>

    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 다른 동작")
        }
    }

     

     

    아래에서 프로토콜의 요구사항은 

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

    turnOn() 과 turnOff() 두가지이다. 

     

     

    mp3 인스턴스는 Remote 프로토콜을 채택하고 

    turnOn() 과 turnOff() 요구사항이 아닌 doAnother() 메서드를 구현함. 

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

    vs

    [Remote 프로토콜을 타입으로 채택 시]

    protocol의 요구사항이 아닌 메서드(.doAnother)는, 선택한 타입의 기본 구현(확장)을 따른다.

    protocol의 요구사항(turnOn())은 현재 클래스의 구현 메서드를 출력

    var mp3:Remote = Mp3()
    mp3.turnOn() //Mp3 켜기
    mp3.doAnother() //리모컨 다른 동작

    'Swift > swift 문법' 카테고리의 다른 글

    열거형 - 연관값, 열거형  (0) 2023.06.05
    as 연산자 / is 연산자  (0) 2023.05.26
    [swift] 타입의 종류  (0) 2023.05.13
    문자열: 출력 형식 지정자  (0) 2023.05.08
    모나드  (0) 2023.04.27
Designed by Tistory.