확장과 접근 제어
이번 강의에서는 Swift의 확장(extension)과 접근 제어(access control)에 대해 심도 있게 알아보겠습니다. 확장은 기존 타입에 새로운 기능을 추가하여 코드의 재사용성을 높이고, 접근 제어는 코드의 노출 범위를 제한함으로써 보안을 강화합니다. 이 두 기능은 객체 지향 프로그래밍 및 모듈화 된 애플리케이션 설계에서 매우 중요한 역할을 합니다.
1. Extension (확장)
Swift의 extension은 클래스, 구조체, 열거형, 프로토콜 등의 기존 타입에 새로운 기능을 추가할 수 있도록 해줍니다. 이를 통해 기존 코드를 수정하지 않고도 새로운 기능을 확장할 수 있으며, 코드의 모듈성과 유지 보수성이 향상됩니다.
// 구조체에 확장 추가
struct Person {
var name: String
var age: Int
}
extension Person {
func greet() {
print("Hello, my name is \(name) and I am \(age) years old.")
}
}
let person = Person(name: "John", age: 30)
person.greet()
위 예제는 구조체 Person에 greet() 메서드를 확장하여 추가한 것입니다. 확장을 통해 우리는 기존 타입에 직접 접근하거나 원본 소스를 변경하지 않고도 새로운 기능을 추가할 수 있습니다. 또한 확장을 통해 다음과 같은 기능을 추가할 수 있습니다:
- 계산 프로퍼티 (computed properties)
- 인스턴스 메서드 및 타입 메서드
- 서브스크립트 (subscripts)
- 중첩 타입 (nested types)
- 프로토콜 채택 및 구현
📌 계산 프로퍼티 확장 예시
extension Double {
var km: Double { return self * 1000 }
var m: Double { return self }
var cm: Double { return self / 100 }
}
let length = 5.0.km
print("5km는 \(length)미터입니다.")
이처럼 확장을 통해 다양한 유틸리티 기능을 손쉽게 추가할 수 있으며, 라이브러리나 프레임워크를 사용할 때 매우 유용합니다.
2. 접근 제어 (Access Control)
접근 제어는 클래스, 구조체, 열거형 및 그 멤버에 대한 접근 가능 범위를 정의합니다. Swift는 public, internal, fileprivate, private의 네 가지 주요 접근 수준을 제공합니다. 이를 통해 모듈화 된 구조와 정보 은닉을 구현할 수 있습니다.
📌 public
public 멤버는 어떤 소스 파일에서도 접근 가능합니다. 다른 모듈에서도 사용할 수 있기 때문에 외부 API를 구성할 때 자주 사용됩니다.
public class Car {
public var model: String
public init(model: String) {
self.model = model
}
}
let car = Car(model: "Tesla")
print(car.model)
📌 internal
internal은 Swift의 기본 접근 수준이며, 같은 모듈 내에서는 어디에서든 접근이 가능합니다. 별도의 지정이 없다면 모든 멤버는 internal로 취급됩니다.
class Person {
var name: String
init(name: String) {
self.name = name
}
}
let person = Person(name: "Alice")
print(person.name)
📌 private
private는 해당 멤버가 선언된 범위(예: 클래스 내부)에서만 접근할 수 있도록 제한합니다. 외부에서 접근할 수 없기 때문에 데이터 보호에 효과적입니다.
class BankAccount {
private var balance: Double
init(balance: Double) {
self.balance = balance
}
func deposit(amount: Double) {
balance += amount
}
func currentBalance() -> Double {
return balance
}
}
위 예제에서 balance 프로퍼티는 외부에서 직접 접근할 수 없고, 공개 메서드 currentBalance()를 통해서만 접근할 수 있습니다.
📌 fileprivate
fileprivate은 같은 파일 내에서만 접근이 가능합니다. 이는 하나의 파일에서 여러 클래스나 구조체가 서로 접근해야 할 때 유용합니다.
class FileManager {
fileprivate func readFile() {
print("Reading file...")
}
}
class DocumentHandler {
let fileManager = FileManager()
func openDocument() {
fileManager.readFile()
}
}
위 코드에서 readFile()은 같은 파일 내에 정의된 다른 클래스에서 호출될 수 있습니다. 그러나 다른 파일에서는 접근할 수 없습니다.
✅ 마무리
Swift의 확장과 접근 제어는 매우 강력한 기능으로, 모듈화 된 구조와 안전한 코드 작성을 위한 기반이 됩니다. 확장을 통해 기존 타입을 더욱 강력하게 만들 수 있고, 접근 제어를 통해 내부 구현을 보호하고 외부에 필요한 기능만 공개할 수 있습니다. 이러한 기능들을 잘 활용하면 유지보수가 쉽고 안정적인 애플리케이션을 만들 수 있습니다.
'Programming' 카테고리의 다른 글
| Swift 고급 타입 (56) | 2025.08.04 |
|---|---|
| Swift 오류 처리 (46) | 2025.08.03 |
| Swift 프로토콜 (37) | 2025.08.01 |
| Swift 클로저(Closure) (55) | 2025.07.31 |
| Swift 열거형 (106) | 2025.07.30 |