티스토리 뷰

728x90
반응형

Reference / Value / Protocol Type 의 Extension 할 경우 dispatch 방법이 달라지기도 합니다. 알아봅시다!

  • value type 의 extension 에서 구현한 메소드는 상속 가능성이 없기 때문에 static dispatch 로 동작.

  • reference type 의 extension 에서 구현한 메소드는 서브 클래스에서 재정의가 불가능하다.(이를 위해서는 @objc 를 통해 해결할 수 있다.) 그래서 extension 의 메소드가 호출되는 것이 보장되기 때문에 static dispatch 로 동작.

  • protocol 의 extension 에서 구현한 메소드는 두 가지로 나뉜다.

    1.extension 에 default 구현을 해둔 경우는 해당 메소드에 대한 구현이 필수적이지 않기 때문에 dynamic dispatch 로 동작.

      protocol A {
          func sayA()
      }
    
      extension A {
          // default 구현
          func sayA() {
              print("A")
          }
      }

    2.protocol 에 없는 메소드를 extnesion 으로 구현했고, 상수, 변수의 타입이 해당 protocol 이라면 동일한 이름의 메서드가 구현되어 있어도 해당 protocol 에 대한 메소드가 호출되어서 static dispatch 로 동작.

      protocol Human { }
    
      extension Human {
          func sayHello() {
              print("Hello Human!")
          }
      }
    
      class Student: Human { }
    
      class Teacher: Human {
          func sayHello() {
              print("Hello Teacher!")
          }
      }
    
      // Human 타입의 변수 a 는 static dispatch 로 호출.
      var a: Human = Student.init()
      a.sayHello()       // ✅ Hello Human!
    
      a = Teacher.init()
      a.sayHello()       // ✅ Hello Human!
    
      // Teacher 클래스 내에서 선언한 메서드 호출.
      let b: Teacher = Teacher.init()
      b.sayHello()       // ✅ Hello Teacher!
      // (class 에서 선언함. 별도의 final 키워드가 없기 때문에 상속을 통한 오버라이딩 여지가 있다고 판단하여 dynamic dispatch 로 호출.)
    
      // 출처 : https://babbab2.tistory.com/144?category=828998

출처

Swift) Static Dispatch & Dynamic Dispatch (2/2)

728x90
반응형
댓글
최근에 올라온 글
최근에 달린 댓글
글 보관함
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
링크
Total
Today
Yesterday