[iOS-Swift] 접근 제어자

TIL 10일 차 - Swift 문법 접근 제어자

접근 제어자란 말 그대로 이 코드를 어디까지 보여줄지 정해주는 스위치 같은 것이다.

class, structure, enum과 프로퍼티, 메소드에도 각각 적용이 가능하다.

 

이러한 접근 제어자가 없다면

- 내부 로직을 막 건드릴 수 있음

- 나중에 구조를 바꾸기 힘듦

- 협업 시 사고가 발생할 수 있음

 

Swift 접근 제어자는 총 5개이다.

 

open > public > internal > fileprivate > private 순으로 꽁꽁 숨겨진다.

(아무것도 안 쓰면 internal임)

 

1. open

- 어디서든 접근, 상속, 오버라이드 가능함

- 가장 개방적인 접근 수준

- 유일하게 class에서만 사용 가능함 (상속이 가능하고 재정의도 가능하기 때문에)

 

2. public

- 모든 외부 모듈에서 접근 가능해서 다른 프로젝트에서도 사용 가능함

 

3. internal

- 동일한 프로젝트(모듈)에서만 접근 가능함 (기본값)

 

 

4. fileprivate

- 동일한 파일에서만 접근 가능 (보통 extension과 같이 쓰임)

fileprivate var cache = [string]()
// 같은 .swift 파일 내에서는 접근 가능함

 

5. private

- 같은 타입에서만 접근 가능한 가장 제한적인 접근 제어자

- 해당 요소를 선언한 스코프(class, struct, enum의 코드블록)에서만 사용 가능

- struct 에서 private 프로퍼티가 있다면 멤버와이즈 init 사용이 불가해 직접 init을 작성해야 함

class User {
    private var password: String = "1234"
}

let user = User()
user.password // error: 접근 금지 에러

 

 

대표적인 사용 예시

class Counter {
    private var count = 0
    
    func increase() {
        count += 1
    }
    
    func current() -> Int {
        return count
    }
}
// 이 클래스의 의도는 사용자가 직접 count를 마음대로 조작할 수 없음
// 메서드로만 다룰수있어서 사용자는 정해진 규칙대로만 count를 조정할 수 있다.

 

struct Person {
    var name: String
    public var age: Int
    private var havingMoney: Int
    
    init(name: String, age: Int, havingMoney: Int) {
        self.name = name
        self.age = age
        self.havingMoney = havingMoney
    }
    
    private func printMoney() {
        print("하하씨 나 알죠? 나 \(havingMoney)원 있어요.")
    }
    
    func test() {
        printMoney()
    }
}


let person = Person(name: "JH", age: 24, havingMoney: 6000)

person.test() // test 함수는 internal(디폴트값) 이므로 호출이 가능함
// test 함수 자체는 Person 구조체 내에 있으므로 접근 가능함
// 하하씨 나 알죠? 나 6000원 있어요.

person.havingMoney
// person의 havingMoney는 private 프로퍼티이므로 접근 불가함
person.printMoney
// person의 printMoney 메서드 또한 private 메소드여서 접근 불가함

 

이러한 접근제어자를 이해하고 나면 캡슐화와 객체지향도 이해할 수 있을 거라고 생각한다.

 

+) 모듈이란?

- 모듈은 코드 배포의 단일 단위임

- swift에서는 import를 사용해 다른 모듈에서 가져올 수 있음

'iOS  > Swift ' 카테고리의 다른 글

[iOS-Swift] 스위프트 필수 문법 문제 1번 풀이  (0) 2026.01.09
[iOS-Swift] 타입캐스팅  (0) 2026.01.09
[iOS-Swift] 중첩타입  (0) 2026.01.08
[iOS-Swift] enum 열거형  (0) 2026.01.08
[iOS-Swift] 프로토콜  (0) 2026.01.08