-Today's Learning Content-

  • private(set)이란?
  • private(set)과 메소드 디스패치

1. 읽기 전용 접근 제한자

내용 정리

오늘은 private(set)이 프로그램에서 어떻게 작동하는지 알아보고, 메소드 디스패치에서 어떤 영역에 속하며 메모리에 어떤 영향을 주는지 알아보도록 하자.

1) private(set)

private(set)은 Swift의 접근 제한자로, 프로퍼티의 getter와 setter에 서로 다른 접근 수준을 부여할 수 있도록 하는 키워드이다.

역할

  • Getter: 선언된 기본 접근 수준(internal, public 등)을 따른다.
  • Setter: private로 제한된다.

사용 목적

  • 프로퍼티의 값을 외부에서 읽을 수는 있지만, 수정은 클래스(또는 구조체) 내부에서만 가능하도록 제한하고 싶을 때 사용한다.

2) Swift의 메소드 디스패치 방식

Swift에는 세 가지 메소드 디스패치 방식이 있다.

  • Static Dispatch: 컴파일 타임에 호출 메소드가 결정된다. 가장 성능이 빠르다.
  • Virtual Dispatch: 런타임에 메소드 호출이 결정된다.
  • Witness Table Dispatch(WTable): 프로토콜 요구사항을 구현한 메소드가 사용된다.

3) private(set)의 동작

private(set)은 프로퍼티의 setter만 private로 제한하고, getter는 선언된 접근 제어자(예: internal, public)의 범위에 맞게 동작하도록 설정한다.

즉, 디스패치 방식에 영향을 미치지 않는다.

예시

class Example {
    private(set) var value: Int = 0

    func updateValue(newValue: Int) {
        self.value = newValue // 이 메서드는 같은 타입 내부에서만 호출 가능
    }
}

위의 코드에서 value의 setter는 private로 제한이므로 외부에서 값을 변경할 수 없다.
하지만 getter는 internal 접근 수준으로 제공되므로 모듈 내부에서는 읽기가 가능하다.

private(set)은 단순히 접근 제어를 변경한 것이므로, 디스패치 방식은 setter나 getter가 클래스에서 정의 되었는지, 그리고 메소드가 final인지에 따라 달라진다.

결론적으로 디스패치 방식은 private(set) 여부와 관계없이 setter/getter가 class(dynamic dispatch) 또는 final/class 구조(static dispatch)인지에 따라 결정된다.

4) private와 비교

private 해당 키워드를 사용한 객체는 동일한 파일 내에서만 접근 가능하며, 컴파일 타임에 호출이 고정된다. private 메소드는 Static Dispatch를 사용한다.

private(set)은 setter만 private와 동일하게 동작하여 파일 내에서만 수정 가능하지만, getter는 선언된 접근 수준에 따라 접근할 수 있다.
디스패치 방식은 클래스의 구조나 final 여부에 따라 달라진다.

5) 결론

오늘의 요약은 아래와 같다

  • private(set)의 setter는 private와 동일하게 Static Dispatch를 사용

  • private(set)의 getter는 클래스 멤버라면 기본적으로 Virtual Dispatch를 사용

  • privateprivate(set)의 차이는 접근제어 수준에서 나타나며, 디스패치 방식에는 구조적 차이에 따라 영향을 준다.

-Today's Lesson Review-

요즘 private(set)을 많이 사용했는데, 이제는 어떤 방식으로 작동하는지 알았으니
적절한 상황에서 잘 사용해야겠다.
profile
이유있는 코드를 쓰자!!

0개의 댓글