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

접근 제어자Access ControlSwift
avatar
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 등)에서는 gettersetter를 활용하여 변수의 접근을 제어하지만, 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)을 이용하여 getterinternal, setterprivate을 적용한 것처럼 사용할 수 있다.

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

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

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

접근 제어자

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

불가능







- 컬렉션 아티클