🔥 접근 제어 문법

400자
5분

Swift에서는 엔티티의 선언 시작 부분에 open, public, internal, fileprivate 또는 private 수정자 중 하나를 배치하여 해당 엔티티의 접근 수준을 정의할 수 있습니다. 한번 예제 코드를 살펴볼까요?

open class SomeOpenClass {}                 // 명시적으로 open 접근 수준 지정
public class SomePublicClass {}             // 명시적으로 public 접근 수준 지정
internal class SomeInternalClass {}         // 명시적으로 internal 접근 수준 지정
fileprivate class SomeFilePrivateClass {}   // 명시적으로 fileprivate 접근 수준 지정
private class SomePrivateClass {}           // 명시적으로 private 접근 수준 지정
 
 
open var someOpenVariable = 0               // 명시적으로 open 접근 수준 지정
public var somePublicVariable = 0           // 명시적으로 public 접근 수준 지정
internal let someInternalConstant = 0      // 명시적으로 internal 접근 수준 지정
fileprivate func someFilePrivateFunction() {} // 명시적으로 fileprivate 접근 수준 지정
private func somePrivateFunction() {}       // 명시적으로 private 접근 수준 지정
swift

위의 코드에서 볼 수 있듯이, 각 엔티티의 선언 앞에 해당 접근 수준 수정자를 명시적으로 지정해 주고 있죠. 이를 통해 다른 코드에서 해당 엔티티에 접근할 수 있는 범위를 명확하게 제어할 수 있답니다.

하지만 특별히 지정하지 않는 한, Default Access Levels에서 설명한 대로 기본 접근 수준은 internal이에요. 즉, SomeInternalClasssomeInternalConstant는 명시적 접근 수준 수정자 없이도 작성할 수 있으며, 여전히 internal 접근 수준을 가지게 됩니다.

class SomeInternalClass {}              // 암묵적으로 internal 접근 수준
let someInternalConstant = 0            // 암묵적으로 internal 접근 수준
swift

이렇게 접근 수준을 명시적으로 지정하지 않으면 기본값인 internal이 적용되는 거죠. 이는 대부분의 경우 명시적 접근 수준 지정 없이도 코드를 간결하게 유지할 수 있도록 해준답니다.

하지만 가끔은 엔티티의 접근 수준을 명확하게 나타내기 위해 접근 수준 수정자를 명시적으로 사용하는 것이 좋을 때도 있어요. 특히 public API를 설계할 때는 의도를 명확히 전달하기 위해 접근 수준을 명시적으로 지정하는 것이 권장됩니다.

public struct User {
    public let id: Int
    public var name: String
    internal var email: String
 
    public init(id: Int, name: String, email: String) {
        self.id = id
        self.name = name
        self.email = email
    }
 
    public func getInfo() -> String {
        return "User(id: \(id), name: \(name))"
    }
 
    internal func sendEmail() {
        // 이메일 전송 로직
    }
}
swift

위의 User 구조체는 public으로 선언되었고, 외부에서 사용할 수 있는 속성과 메서드는 명시적으로 public으로 표시되었죠. 반면 내부 구현에 사용되는 email 속성과 sendEmail() 메서드는 internal로 지정되어 모듈 내부에서만 접근 가능하도록 제한했습니다. 이렇게 접근 수준을 적절히 조정하면 코드의 캡슐화와 모듈화를 촉진할 수 있어요.

접근 수준 문법을 잘 활용하면 코드의 가독성과 유지보수성을 높일 수 있으므로, 프로젝트의 특성에 맞게 적절한 접근 수준을 선택하는 것이 중요해요. 이제 여러분도 Swift의 접근 수준 문법을 능숙하게 다룰 수 있게 되었길 바랍니다!