IOS개발: SWIFT/4. 객체 지향 프로그래밍 심화

Swift 엑세스 제어: open, public, internal, fileprivate, private

_Blue_Sky_ 2024. 9. 13. 13:59
728x90
728x90

Swift 엑세스 제어: open, public, internal, fileprivate, private 상세 설명

Swift에서 엑세스 제어는 코드의 접근 가능 범위를 제한하여 코드의 안전성과 모듈성을 높이는 중요한 기능입니다. 각 엑세스 레벨에 따라 어디에서 어떤 요소에 접근할 수 있는지 자세히 알아보겠습니다.

엑세스 레벨 종류 및 설명

  • open:
    • 가장 낮은 제한 수준으로, 다른 모듈에서도 접근, 상속, 재정의가 가능합니다.
    • 주로 프레임워크나 라이브러리처럼 다른 프로젝트에서 재사용될 클래스에 사용됩니다.
    • 예시:
      open class MyOpenClass {
          // 다른 모듈에서 접근, 상속, 재정의 가능
      }
      
       
  • public:
    • 다른 모듈에서 접근은 가능하지만, 상속이나 재정의는 불가능합니다.
    • 구조체나 열거형과 같이 상속이 불가능한 타입에 주로 사용됩니다.
    • 예시:
      public struct MyPublicStruct {
          // 다른 모듈에서 접근 가능
      }
      
       
       
  • internal: (기본값)
    • 같은 모듈 내에서만 접근 가능합니다.
    • 모듈 내부의 모든 소스 파일에서 접근할 수 있습니다.
    • 예시: (명시하지 않으면 자동으로 internal)
      struct MyInternalStruct {
          // 같은 모듈 내에서만 접근 가능
      }
      
       
  • fileprivate:
    • 같은 소스 파일 내에서만 접근 가능합니다.
    • 다른 파일에서는 접근할 수 없습니다.
    • 예시:
      fileprivate func myPrivateFunction() {
          // 같은 파일 내에서만 호출 가능
      }
      
       
  • private:
    • 선언된 영역(클래스, 구조체, 함수 등) 내에서만 접근 가능합니다.
    • 가장 제한적인 수준으로, 외부에서는 절대 접근할 수 없습니다.
    • 예시:
      class MyClass {
          private var privateProperty = "private" // 이 클래스 내부에서만 접근 가능
      }
      
       

엑세스 레벨 선택 시 고려 사항

  • 정보 은닉: 민감한 정보는 private으로 설정하여 외부에서 접근하지 못하도록 보호합니다.
  • 모듈성: 각 모듈의 책임을 명확히 하고, 불필요한 의존성을 줄이기 위해 적절한 엑세스 레벨을 설정합니다.
  • 재사용성: 다른 프로젝트에서 재사용할 수 있도록 public이나 open으로 설정할 수 있습니다.
  • 유지보수: 코드의 가독성을 높이고, 변경에 따른 영향을 최소화하기 위해 적절한 엑세스 레벨을 설정합니다.

예시를 통한 이해

// ModuleA.swift
public struct PublicStruct {
    private var privateProperty = "private"
    fileprivate var fileprivateProperty = "fileprivate"
    var internalProperty = "internal" // default는 internal

    public func publicMethod() {
        // ...
    }

    private func privateMethod() {
        // ...
    }
}

// ModuleB.swift
import ModuleA

let publicInstance = PublicStruct()
publicInstance.publicMethod() // 접근 가능
// publicInstance.privateProperty // 접근 불가
// publicInstance.fileprivateProperty // 접근 불가 (다른 모듈이므로)
 

위 예시에서 볼 수 있듯이, ModuleB에서는 PublicStruct의 public 메소드와 프로퍼티에만 접근할 수 있습니다. private와 fileprivate으로 선언된 멤버는 다른 모듈에서는 접근할 수 없습니다.

결론

Swift의 엑세스 제어는 코드의 안전성과 모듈성을 높이는 데 매우 중요합니다. 각 엑세스 레벨의 특징을 잘 이해하고, 코드의 목적에 맞게 적절한 엑세스 레벨을 선택하여 효율적인 코드를 작성해야 합니다.

요약:

  • open: 가장 낮은 제한 수준, 다른 모듈에서 접근, 상속, 재정의 가능
  • public: 다른 모듈에서 접근 가능, 상속 및 재정의 불가
  • internal: 같은 모듈 내에서만 접근 가능 (기본값)
  • fileprivate: 같은 소스 파일 내에서만 접근 가능
  • private: 선언된 영역 내에서만 접근 가능

추가적으로 알아두면 좋은 점:

  • 엑세스 레벨은 상속 시에도 유지됩니다.
  • 확장(extension)에서 추가된 멤버의 엑세스 레벨은 기존 타입의 엑세스 레벨을 초과할 수 없습니다.
  • 프로토콜의 요구 사항은 프로토콜을 채택한 타입의 엑세스 레벨보다 더 제한적일 수 없습니다.
728x90
728x90