접근 제어자는 코드 내 클래스, 구조체, 열거형, 변수, 함수 등의 접근 수준을 결정하는 중요한 기능입니다. 이를 통해 코드의 특정 부분을 외부에서 보거나 수정하지 못하도록 보호할 수 있습니다.
목차
접근 제어자의 필요성
왜 접근 제어자가 필요할까요?
•
Encapsulation(캡슐화)
•
코드 안정성 향상
•
API 설계
객체 지향 프로그래밍의 핵심 원칙 중 하나로, 객체의 내부 상태를 숨기고 필요한 부분만 외부에 공개합니다. 그리고 외부에서 내부 구현에 직접 접근하지 못하게 함으로써 의도치 않은 변경이나 오류를 방지합니다. 또한, 라이브러리나 프레임워크를 설계할 때 사용자에게 필요한 기능만 노출하고 내부 구현은 숨길 수 있습니다.
Swift의 접근 수준 종류
Swift에서는 다섯 가지의 접근 수준을 제공합니다.
•
open
•
public
•
internal
•
fileprivate
•
private
각 접근 수준은 코드 요소에 대한 접근 기능 범위를 결정합니다.
open
•
가장 개방적인 접근 수준입니다.
•
모듈 외부에서도 접근 및 상속과 오버라이딩이 가능합니다.
•
주로 프레임워크나 라이브러리에서 클래스를 공개하고 사용자가 이를 상속하거나 메서드를 재정의할 수도 있도록 할 때 사용합니다.
Overriding이란, 상속된 클래스가 부모 클래스에서 정의된 메서드나 속성을 재정의하는 것을 의미합니다. 즉, 부모 클래스에서 제공하는 기본 동작을 자식 클래스에서 필요한 방식으로 변경하거나 확장할 수 있는 기능입니다.
public
•
모듈 외부에서 접근은 가능하지만 상속이나 오버라이딩은 불가능합니다.
•
클래스나 메서드를 공개하되 사용자가 이를 확장하지 못하도록 할 때 사용합니다.
internal
•
접근 수준을 별도로 지정하지 않으면 기본적으로 internal로 설정됩니다.
•
모듈 내부에서만 접근 가능합니다.
•
모듈은 프레임워크나 앱의 단일 배포 단위를 의미합니다.
fileprivate
•
같은 파일 내에서만 접근 가능합니다.
•
파일 단위로 코드를 묶어 관리할 때 유용합니다.
private
•
선언된 범위 내에서만 접근 가능합니다.
•
가장 제한적인 접근 수준으로, 해당 속성이나 메서드를 해당 선언 내부에서만 사용할 수 있습니다.
접근 제어자의 적용 방법
public class PublicClass {
open func openMethod() { ... }
public func publicMethod() { ... }
internal func internalMethod() { ... }
fileprivate func fileprivateMethod() { ... }
private func privateMethod() { ... }
}
Swift
복사
접근 제어자의 활용 시 주의사항
상위 접근 수준보다 낮은 접근 수준
어떤 코드 요소의 접근 수준은 해당 요소를 포함하는 다른 요소의 접근 수준보다 높을 수 없습니다.
public class PublicClass {
private var privateProperty: String // 가능
public var publicProperty: String // 가능
}
internal class InternalClass {
public var publicProperty: String // 오류 발생
}
Swift
복사
프로토콜의 접근 수준은 해당 프로토콜을 채택하는 타입의 접근 수준과 같거나 낮아야 합니다.
public protocol SomeProtocol {
func doSomething()
}
internal class SomeClass: SomeProtocol { // 오류 발생
func doSomething() { ... }
}
Swift
복사