학습
Swift Swift의 접근 제어
Swift Swift의 접근 제어 — 초급
Swift의 접근 제어
1. 도입 (왜 배워야 하는가)
Swift의 접근 제어는 소프트웨어 개발에서 매우 중요한 개념입니다. 접근 제어를 통해 클래스, 구조체, 메서드, 프로퍼티 등에 대한 접근 권한을 제어할 수 있어, 코드의 안전성과 유지보수성을 향상시킵니다.
실무에서 접근 제어를 제대로 이해하지 못하면, 다른 개발자가 작성한 코드에 의도치 않게 영향을 줄 수 있는 문제가 발생할 수 있습니다. 예를 들어, 클래스의 내부 상태를 외부에서 수정할 수 있다면, 버그가 발생하기 쉽고, 이는 나중에 문제를 해결하는 데 많은 시간을 소모하게 됩니다. 접근 제어는 이러한 문제를 예방하는 데 중요한 역할을 합니다.
2. 핵심 개념 설명
Swift의 접근 제어는 크게 네 가지로 나뉩니다:
- open: 다른 모듈에서도 접근 가능하고, 서브클래싱이 가능
- public: 다른 모듈에서도 접근 가능하지만, 서브클래싱은 불가능
- internal: 같은 모듈 내에서만 접근 가능 (기본값)
- fileprivate: 같은 파일 내에서만 접근 가능
- private: 같은 선언 내에서만 접근 가능
class Animal에서Animal이라는 클래스를 정의합니다.private var name: String = "Unknown"에서name프로퍼티는private로 선언되어, 외부에서 직접 접근할 수 없습니다.func setName(_ newName: String)메서드는name프로퍼티의 값을 설정하는 함수입니다.func getName() -> String메서드는name프로퍼티의 값을 반환하는 함수입니다.let myAnimal = Animal()에서Animal클래스의 인스턴스를 생성합니다.myAnimal.setName("Cat")에서setName메서드를 통해name을 "Cat"으로 설정합니다.print(myAnimal.getName())에서getName메서드를 통해 "Cat"을 출력합니다.- 잘못된 코드
- 올바른 코드
- 잘못된 코드
- 올바른 코드
- Swift의 접근 제어는 코드의 안전성과 유지보수성을 높이는 데 필수적입니다.
- 접근 제어의 종류로는
open,public,internal,fileprivate,private가 있습니다. - 실무에서 자주 사용하는 패턴은 장바구니나 사용자 정보를 보호하는 방식입니다.
- 다음에 학습하면 좋은 주제로는 Swift의 프로토콜이나 오류 처리를 추천합니다.
관련 용어 정리
| 접근 제어 수준 | 설명 |
|---|---|
| open | 다른 모듈에서도 접근 가능, 서브클래싱 가능 |
| public | 다른 모듈에서도 접근 가능, 서브클래싱 불가능 |
| internal | 같은 모듈 내에서만 접근 가능 (기본값) |
| fileprivate | 같은 파일 내에서만 접근 가능 |
| private | 같은 선언 내에서만 접근 가능 |
3. 기본 코드 예제
다음은 각 접근 제어 수준을 보여주는 간단한 코드 예제입니다.
class Animal {
private var name: String = "Unknown"
func setName(_ newName: String) {
self.name = newName
}
func getName() -> String {
return self.name
}
}
let myAnimal = Animal()
myAnimal.setName("Cat")
// print(myAnimal.name) // 오류 발생: 'name'은 private 접근 제어로 인해 외부에서 접근할 수 없음
print(myAnimal.getName()) // "Cat" 출력
실행 결과
Cat
코드 한 줄씩 동작 설명
4. 실전 활용 예제
1. 쇼핑몰에서 장바구니 구현
쇼핑몰에서 장바구니 클래스를 만들 때, 장바구니의 아이템 리스트는 외부에서 직접 접근할 수 없도록 private으로 설정할 수 있습니다.
class ShoppingCart {
private var items: [String] = []
func addItem(_ item: String) {
items.append(item)
}
func getItems() -> [String] {
return items
}
}
여기서 items는 private로 설정하여 외부에서 직접 접근할 수 없게 하고, addItem 메서드를 통해 아이템을 추가할 수 있도록 합니다.
2. 사용자 정보 관리
사용자 정보를 다루는 클래스에서 중요한 정보를 private으로 설정하여, 외부에서 접근할 수 없도록 하는 패턴입니다.
class User {
private var password: String
init(password: String) {
self.password = password
}
func changePassword(newPassword: String) {
self.password = newPassword
}
}
이렇게 하면 비밀번호가 외부에서 직접 수정되지 않도록 보장할 수 있습니다.
5. 흔한 실수와 주의사항
실수 1: 접근 제어의 오해
class Base {
public func show() {}
}
class Sub: Base {
override func show() {} // 오류 없음
}
class Base {
open func show() {} // open으로 설정해야 함
}
public은 서브클래싱을 허용하지 않기 때문에 open으로 설정해야 합니다.
실수 2: 접근 제어의 기본값
class MyClass {
func doSomething() {} // 기본값은 internal
}
class MyClass {
private func doSomething() {} // 의도적으로 private으로 설정
}
기본값이 internal이므로, 의도적으로 접근 제어를 설정하는 것이 중요합니다.