본문 바로가기
카테고리 없음

9. 접근제어(Access Control)

by swifttt 2025. 3. 31.

 

접근 제어는 코드의 구성 요소(클래스, 구조체, 함수, 변수 등)에 대한 외부 접근을 제어하는 기능입니다.
다른 모듈이나 타입에서 특정 속성이나 메서드에 접근하는 것을 제한함으로써 코드의 캡슐화(encapsulation)를 유지하고, 의도치 않은 사용을 방지할 수 있습니다.

Swift는 접근 제어를 위한 다섯 가지 수준을 제공합니다.

1. 접근 제어 수준

접근 수준 설명
open 모듈 외부에서 상속, 재정의 가능 (클래스 및 클래스 멤버 전용)
public 모듈 외부에서 사용 가능하지만, 상속이나 재정의는 불가능
internal 동일 모듈 내에서만 사용 가능 (기본값)
fileprivate 같은 파일 내에서만 접근 가능
private 같은 타입 내부에서만 접근 가능

Swift에서 접근 제어는 기본적으로 internal입니다. 별도로 지정하지 않으면 같은 모듈 내에서만 접근이 가능합니다.

2. 예제: 기본 접근 제어

class BankAccount {
    private var balance: Int = 0

    func deposit(_ amount: Int) {
        balance += amount
    }

    func currentBalance() -> Int {
        return balance
    }
}

let account = BankAccount()
// account.balance = 1000 // 오류: 'balance'는 private임
account.deposit(1000)
print(account.currentBalance()) // 1000

이 예제에서 balanceprivate으로 선언되어 클래스 외부에서는 직접 접근할 수 없습니다.
이러한 방식은 데이터를 보호하고, 허용된 방식으로만 접근하도록 유도합니다.

3. fileprivate의 활용

fileprivate은 같은 파일 내에서는 접근이 가능하지만, 다른 파일에서는 접근할 수 없습니다.
주로 확장(extension)과 함께 사용될 수 있습니다.

class Logger {
    fileprivate func log(_ message: String) {
        print("LOG: \(message)")
    }
}

extension Logger {
    func logInfo(_ text: String) {
        log("INFO: \(text)")
    }
}

log(_:)는 같은 파일에 있는 extension에서 접근할 수 있지만, 외부에서는 사용할 수 없습니다.

4. internal: 기본 접근 수준

Swift의 기본 접근 수준은 internal입니다. 명시하지 않아도 동일 모듈 내에서 사용 가능합니다.

struct User {
    var name = "익명"
}

위 구조체는 접근 제어자가 없지만, 컴파일러는 자동으로 internal로 처리합니다.
즉, 같은 앱 또는 프레임워크 모듈 내에서만 접근 가능합니다.

5. public과 open의 차이

public은 외부 모듈에서 사용할 수 있지만, 클래스나 메서드를 상속하거나 재정의할 수는 없습니다.
반면 open은 외부 모듈에서도 상속과 재정의가 모두 가능합니다.

open class Animal {
    open func sound() {
        print("...")
    }
}

public class Dog: Animal {
    override func sound() {
        print("멍멍")
    }
}

이처럼 open은 외부 확장을 허용해야 하는 라이브러리나 프레임워크에서 주로 사용됩니다.

6. 접근 제어와 캡슐화

접근 제어를 적절히 활용하면 내부 구현 세부 사항을 숨기고, 필요한 인터페이스만 외부에 노출할 수 있습니다.
이것은 객체 지향 프로그래밍의 핵심 개념 중 하나인 캡슐화(encapsulation)를 실현하는 데 필수적입니다.

마무리

접근 제어는 단순히 변수나 메서드의 노출 여부를 조절하는 것이 아니라, 코드의 안정성과 유지보수성을 향상시키는 중요한 수단입니다.
private부터 open까지 각 수준의 의미를 정확히 이해하고, 설계 의도에 맞게 선택하여 사용하는 습관이 필요합니다.
불필요하게 공개된 멤버는 외부에서의 의도치 않은 사용으로 이어질 수 있으므로, 가능한 한 제한적인 접근을 기본으로 설정하는 것이 좋습니다.