디스패치 학습하기 (4) [ Extension Dispatch ]

2024. 8. 26. 00:10·Programing Langauge/swift
반응형

 

이번 학습은 extension에서 동작하는 dispatch를 알아보자.

extension을 할 수 있는 3가지 경우는 다음과 같다.

  1. 값 타입에서 확장
  2. 래퍼런스 타입에서 확장
  3. 프로토콜에서 확장

각 각의 상황에서 어떤 디스패치가 동작하는 지 알아보자.

 


Value Type 확장 시 Dispatch

상속의 가능성이 없기 때문에, 확장(exension)을 해도 Static Dispatch로 동작한다.

 

struct Human {
    func sayHello() {
        print("Hello Human!")
    }
}
 
extension Human {
    func sayHo() {
        print("Ho~~")
    }
}
 
let human: Human = .init()
human.sayHello()           // Static Dispatch
human.sayHo()

 


Reference Type 확장 시 Dispatch

Class를 확장(extension)하여 메서드를 추가한 경우
서브 클래스에서 오버라이딩이 불가능하다.


오버라이딩 가능성 ❌ = Static Dispatch 

 

class Human {
    func sayHello() {
        print("Hello Human!")
    }
}
 
extension Human {
    func sayHo() {
        print("Ho~~") // static dispatch
    }
}
 
class Teacher: Human {
    override func sayHo() {         // error! Overriding non-@objc declarations from extensions is not supported
        
    }
}

 


Protocol 확장 시 Dispatch

프로토콜은 총 두 가지 경우로 나눠  생각해야한다.

 

1) extension을 통해 default 메서드를 구현한 경우

보통 프로토콜에 명시되어 있는 메서드는 필수적으로 구현해야하지만, default 메서드를
프로토콜의 extension을 통해 구현해 놓았다면 필수적이지 않음

필수적이지 않다는게 약간 오버라이드와 비슷한 느낌이 들지 않나? 

 

2가지 경우 의 수가 생기게 된다.
    a. 구현을 했을 때
    b. 구현을 하지 않고 default method를 사용할 때

 

어떤 것을 써야할 지 고민을 해야한다는 뜻이네 ?? 

 

고민  = Dynamic Dispatch

 

 

human이란 프로토콜 타입이 Student일 때 default 메서드가 호출되고 Teacher일 때

프로토콜을 채택하여 구현한 메서드가 호출된다. 인스턴스 별로 사용할 메서드를 고민한다.

 

 


2) Protocol에 선언되어있지 않은 메서드를 추가로 구현한 경우

프로토콜에는 정의되어 있지 않고 프로토콜 extension에 정의된 메서드를
구현할 경우
해당 프로토콜 타입에선 무조건 extension에 구현된 메서드만
실행되기 때문에 고민할 필요가 없다.

 

고민 ❌ = Static Dispatch 

 

 

Teacher이란 클래스는 sayHello란 메서드를 자기 클래스 내에서 구현 했음에도 불구하고,

현재 human이란 변수의 타입이 Human이란 프로토콜의 타입이기 때문에
해당 프로토콜의 extension에서 구현된 sayHello 메서드만 실행됨

반응형

'Programing Langauge > swift' 카테고리의 다른 글

클로저와 self  (0) 2024.10.23
swift 기본 타입  (0) 2024.10.18
디스패치 학습하기 (3) [ Value Type Dispatch, Protocol Dispatch ]  (1) 2024.08.25
디스패치 학습하기 (2) [ Reference Type Dispatch, final ]  (0) 2024.08.25
디스패치 학습하기 (1) [ 정의, 종류, vtable, witness table ]  (0) 2024.08.25
'Programing Langauge/swift' 카테고리의 다른 글
  • 클로저와 self
  • swift 기본 타입
  • 디스패치 학습하기 (3) [ Value Type Dispatch, Protocol Dispatch ]
  • 디스패치 학습하기 (2) [ Reference Type Dispatch, final ]
Hamp
Hamp
남들에게 보여주기 부끄러운 잡다한 글을 적어 나가는 자칭 기술 블로그입니다.
  • Hamp
    Hamp의 분리수거함
    Hamp
  • 전체
    오늘
    어제
    • 분류 전체보기 (304) N
      • CS (30)
        • 객체지향 (2)
        • Network (7)
        • OS (6)
        • 자료구조 (1)
        • LiveStreaming (3)
        • 이미지 (1)
        • 잡다한 질문 정리 (0)
        • Hardware (2)
        • 이론 (6)
        • 컴퓨터 그래픽스 (0)
      • Firebase (3)
      • Programing Langauge (37)
        • swift (32)
        • python (4)
        • Kotlin (1)
      • iOS (132)
        • UIKit (37)
        • Combine (1)
        • SwiftUI (32)
        • Framework (7)
        • Swift Concurrency (22)
        • Tuist (6)
        • Setting (11)
        • Modularization (1)
        • Instruments (6)
      • PS (59)
        • 프로그래머스 (24)
        • 백준 (13)
        • LeetCode (19)
        • 알고리즘 (3)
      • Git (18)
        • 명령어 (4)
        • 이론 (2)
        • hooks (1)
        • config (2)
        • action (7)
      • Shell Script (2)
      • Linux (6)
        • 명령어 (5)
      • Spring (13) N
        • 어노테이션 (1)
        • 튜토리얼 (11) N
      • CI-CD (4)
      • Android (0)
        • Jetpack Compose (0)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    투포인터
    boostcamp
    concurrency
    CS
    IOS
    Tuist
    dp
    SwiftUI
    AVFoundation
    dispatch
    GIT
    백준
    property
    프로그래머스
    Spring
    UIKit
    lifecycle
    dfs
    protocol
    Swift
  • 최근 댓글

  • 최근 글

  • 반응형
  • hELLO· Designed By정상우.v4.10.0
Hamp
디스패치 학습하기 (4) [ Extension Dispatch ]
상단으로

티스토리툴바