
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 |