나의 발자취

[Swift] 접근제어자 open, public, internal, fileprivate, private 본문

앱 개발/iOS

[Swift] 접근제어자 open, public, internal, fileprivate, private

달모드 2024. 10. 29. 16:40

접근제어자는 코드의 캡슐화를 구현하는 중요한 도구로, 다른 소스 파일이나 모듈에서 코드에 접근하는 것을 제한한다.

 

 

*아예 접근제어자를 작성하지 않으면 internal이다.

 

접근제어자 종류 (가장 개방적 → 가장 제한적)

open

  • 가장 개방적인 접근 수준
  • 다른 모듈에서 상속 및 오버라이드 가능
  • 클래스와 클래스 멤버에만 사용 가능
  • 프레임워크에서 주로 사용
open class OpenClass {
    open func openMethod() { }
}

 

 

 

public

  • 모든 소스 파일에서 접근 가능
  • 다른 모듈에서 상속 및 오버라이드 불가
  • 프레임워크 API로 주로 사용
public class PublicClass {
    public func publicMethod() { }
}

 

 

internal

  • 기본 접근제어자
  • 같은 모듈 내에서만 접근 가능
  • 명시적으로 지정하지 않으면 기본값으로 사용됨
 
internal class InternalClass {
    internal func internalMethod() { }
}

 

fileprivate

  • 정의된 소스 파일 내에서만 접근 가능
  • 같은 파일 내의 extension에서도 접근 가능
 
fileprivate class FilePrivateClass {
    fileprivate func filePrivateMethod() { }
}

 

private

  • 가장 제한적인 접근 수준
  • 정의된 범위 내에서만 접근 가능
  • 같은 파일의 extension에서도 접근 불가능
 
open class OpenClass {
    open func openMethod() { }
}

 

접근제어자 사용 지침

모듈과 소스 파일

  • 모듈: 배포할 코드의 단위 (앱, 프레임워크 등)
  • 소스 파일: 모듈 내의 Swift 소스 코드 파일

 

접근제어자 선택 기준

  1. API를 설계할 때: open 또는 public
  2. 내부 구현할 때: internal
  3. 세부 구현을 숨길 때: fileprivate 또는 private
public class UserProfile {
    // 공개 API
    public var name: String
    
    // 내부 구현용
    internal var identifier: String
    
    // 파일 내부용
    fileprivate var validationStatus: Bool
    
    // 클래스 내부용
    private var cleanupTask: (() -> Void)?
}

 

<SwiftUI>

@State의 경우, 외부에서 접근할 일이 없기 때문에 private로 써주는 일이 많다.

 

물론, private를 안쓴다고 문제가 생기는 것은 아니다.

그저 애플에서 권장하는 관습대로 사용할때 좋은 것이다.

 

 

 

Comments