🔥 접근 제어 문법

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 영상

채널 보기
API 응답 지연과 복잡한 에러, NestJS 인터셉터로 관리하는 방법 | NestJS 가이드
존 매카시가 들려주는 인공지능의 탄생 이야기
NestJS 역할 기반 접근 권한 부여 - Guard, Reflector | NestJS 가이드
인터셉터와 RxJS로 캐시 시스템 구축하기 | NestJS 가이드
함수 타입과 Hom-Set 이해하기 | 프로그래머를 위한 카테고리 이론
NestJS 인터셉터에서 map 연산자로 응답을 변환하는 방법 | NestJS 가이드
NestJS 가드, 바이딩과 스코프 | NestJS 가이드
NestJS 커스텀 데코레이터, createParamDecorator 사용 | NestJS 가이드