• Feed
  • Explore
  • Ranking
/
/
    🦅 Swift

    [Swift] 접근 제어자와 (set) 활용

    접근 제어자Access ControlSwift
    지
    지성
    2025.03.19
    ·
    10 min read

    접근 제어자는 코드의 특정 부분을 외부에서 접근 가능하게 하거나, 특정 모듈이나 파일 내에서만 사용할 수 있도록 제어하는 역할을 한다. Swift에서는 기본적으로 6개의 접근 제어자와 (set) 키워드를 제공하고 있다.

    기본 접근 제어자

    접근 제어자

    설명

    접근 가능 범위

    open

    • 모든 모듈에서 접근 가능

    • 클래스 및 멤버 재정의 가능

    • 외부 모듈

    • 내부 모듈

    public

    • 모든 모듈에서 접근 가능

    • 클래스 상속과 멤버 재정의는 동일 모듈 내에서만 가능

    • 외부 모듈

    • 내부 모듈

    package

    • 같은 패키지(Swift Package) 내에서만 접근 가능
      (Swift 5.9에서 추가됨)

    • 같은 패키지 내

    internal

    • 같은 모듈 내에서만 접근 가능 (기본 접근 수준)

    • 내부 모듈

    fileprivate

    • 같은 파일 내에서만 접근 가능

    • 같은 파일 내

    private

    • 같은 스코프(클래스, 구조체 등) 내에서만 접근 가능

    • 같은 타입 내

    (set)을 활용한 접근 제한

    You can give a setter a lower access level than its corresponding getter, to restrict the read-write scope of that variable, property, or subscript. You assign a lower access level by writing fileprivate(set), private(set), internal(set), or package(set) before the var or subscript introducer.

    많은 객체지향 언어(Java, C#, Python 등)에서는 getter와 setter를 활용하여 변수의 접근을 제어하지만, Swift에서는 이러한 개념을 접근 제어자와 (set) 키워드를 통해 더 간결하게 표현할 수 있다.

    예를 들어, Java에서는 변수를 private으로 설정하면, getter를 제공해야 외부에서 값을 읽을 수 있지만

    public class User {
        private String name;
        
        public User(String name) {
            this.name = name;
        }
        
        public String getName() {
            return name;
        }
    }

    Swift에서는 internal private(set)을 이용하여 getter는 internal, setter는 private을 적용한 것처럼 사용할 수 있다.

    struct User {
        internal private(set) var name: String
        
        init(name: String) {
            self.name = name
        }
    }

    다른 언어에서는 getter/setter를 사용하여 접근을 제한하는 경우가 많지만, Swift에서는 접근 제어자만으로 간결하게 제어할 수 있다.

    참고로 setter는 getter보다 더 제한적일 수는 있지만, 더 넓을 수는 없다.

    접근 제어자

    setter 제한 가능 여부

    open

    public(set)

    public

    internal(set), package(set), fileprivate(set), private(set)

    package

    internal(set), fileprivate(set), private(set)

    internal

    fileprivate(set), private(set)

    fileprivate

    private(set)

    private

    불가능







    - 컬렉션 아티클