내일배움캠프 25일차

임클·2025년 4월 4일

내일배움캠프

목록 보기
26/44
post-thumbnail

하루하라 알고리즘


TIL: Swift의 접근 제어자(Access Control Levels)

1. Swift의 접근 제어자란?

Swift에서 접근 제어자(Access Control Levels)는 코드의 특정 부분(클래스, 구조체, 함수 등)에 대한 접근 범위를 제어하는 키워드입니다. 이를 통해 모듈 간, 파일 간, 혹은 코드 내에서 데이터와 기능의 노출 범위를 설정할 수 있습니다. Swift는 5가지 접근 제어 수준을 제공합니다: open, public, internal, fileprivate, private.


2. openpublic의 차이점

  • open: 모듈 외부에서 접근 가능하며, 서브클래싱(subclassing)오버라이딩(overriding)이 모두 허용됩니다. 주로 프레임워크나 라이브러리에서 다른 모듈이 해당 클래스를 확장하거나 재정의할 수 있도록 설계할 때 사용됩니다.
  • public: 모듈 외부에서 접근 가능하지만, 서브클래싱이나 오버라이딩은 불가능합니다. 외부에서 단순히 사용만 가능하도록 제한됩니다.
  • 차이점: open은 더 개방적이며 확장성을 제공하는 반면, public은 사용은 허용하되 내부 구현의 수정은 막습니다.
  • 예시:
    open class MyOpenClass {
        open func myMethod() {}
    }
    public class MyPublicClass {
        public func myMethod() {}
    }
    • MyOpenClass는 다른 모듈에서 상속 및 오버라이딩 가능.
    • MyPublicClass는 다른 모듈에서 사용만 가능.

3. internal, fileprivate, private의 사용 시기

  • internal: 모듈 내부에서만 접근 가능. Swift의 기본 접근 수준입니다. 같은 앱이나 프레임워크 내에서 자유롭게 사용되지만, 외부 모듈에는 노출되지 않습니다.
    • 사용 시기: 모듈 내에서 여러 파일 간 공유가 필요한 경우. 예: 앱 내부 로직에서 클래스 간 협업.
  • fileprivate: 같은 파일 내에서만 접근 가능.
    • 사용 시기: 동일 파일 내에서만 특정 속성이나 메서드를 제한적으로 사용하고 싶을 때. 예: 구조체와 그 확장(extension)이 같은 파일에 있을 때.
  • private: 선언된 범위(클래스, 구조체 등) 내에서만 접근 가능. 가장 제한적인 수준입니다.
    • 사용 시기: 외부(심지어 같은 파일 내 다른 코드)로부터 완전히 숨기고 싶은 경우. 예: 클래스 내부의 비공개 구현 세부 사항.
  • 결정 기준:
    • 범위: 모듈 전체(internal) vs 파일(fileprivate) vs 선언 범위(private).
    • 보안성: 노출을 최소화할수록 private에 가까워짐.
  • 예시:
    class MyClass {
        internal var sharedInModule = "모듈 내 공유"
        fileprivate var sharedInFile = "파일 내 공유"
        private var hidden = "나만 사용"
    }

4. 접근 제어자를 사용하는 이유

  • 캡슐화(Encapsulation): 내부 구현 세부 사항을 숨기고, 필요한 인터페이스만 노출하여 코드의 안정성을 높입니다.
  • 모듈화: 모듈 간 의존성을 줄이고, 외부에서 불필요한 접근을 방지해 유지보수성을 향상시킵니다.
  • 보안: 민감한 데이터나 로직을 보호하여 오용을 방지합니다.
  • 예시: private로 설정된 속성은 외부에서 수정할 수 없으므로, 의도치 않은 상태 변화를 막을 수 있습니다.

배운 점

  • openpublic은 외부 접근을 허용하지만, 확장성에서 차이가 크다.
  • internal, fileprivate, private는 노출 범위를 점점 좁히며, 상황에 맞게 선택해야 한다.
  • 접근 제어자는 단순히 문법이 아니라, 설계 의도를 명확히 하고 코드의 품질을 높이는 도구다.

0개의 댓글