🔥 접근 제어 문법

400자
5분

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

swift
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
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 접근 수준 지정

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

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

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

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

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

swift
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
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() {
        // 이메일 전송 로직
    }
}

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

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

YouTube 영상

채널 보기
변환 파이프로 컨트롤러 코드 깔끔하게 만들기 | NestJS 가이드
C++ 속의 펑터 | 프로그래머를 위한 카테고리 이론
미들웨어 vs 가드, 왜 NestJS에서는 가드가 더 똑똑할까? | NestJS 가이드
매번 ValidationPipe 복붙하세요? NestJS 전역 파이프로 한 번에 해결하기 | NestJS 가이드
Product와 Coproduct가 Bifunctor인 이유 | 프로그래머를 위한 카테고리 이론
클로드 섀넌이 들려주는 정보 이론 이야기
리더 펑터 - 함수도 펑터다! | 프로그래머를 위한 카테고리 이론
NestJS 파이프가 뭔가요? 컨트롤러를 보호하는 방법 | NestJS 가이드