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
'IOS개발: SWIFT > 4. 객체 지향 프로그래밍 심화' 카테고리의 다른 글
Swift 액세스 레벨 제어의 중요성 (0) | 2024.09.13 |
---|---|
Swift 확장: 타입 확장, 프로토콜 확장 (0) | 2024.09.13 |
Swift 프로토콜 정의와 채택: 프로토콜 상속, 프로토콜 연장 (0) | 2024.09.13 |
Swift 상속: 상속의 기본 개념, 오버라이딩, 오버로딩 (0) | 2024.09.13 |
Swift 초기화: 초기화 위임, 실패 가능한 초기화 (0) | 2024.09.12 |