학습
Swift 확장(Extension) 사용법
Swift 확장(Extension) 사용법 — 중급
Swift의 확장(Extension) 사용법
1. 도입 (왜 배워야 하는가)
Swift에서 확장은 클래스, 구조체, 열거형, 프로토콜에 새로운 기능을 추가할 수 있는 강력한 도구입니다. 실무에서는 기존의 타입에 기능을 추가하여 코드의 재사용성을 높이거나, 외부 라이브러리의 타입을 확장하여 필요한 메서드를 추가할 수 있습니다. 만약 확장을 사용하지 않는다면, 매번 새로운 클래스를 만들거나 복잡한 상속 구조를 설계해야 할 수도 있어 코드가 복잡해지고 유지보수가 어려워집니다.
예를 들어, 쇼핑몰 애플리케이션에서 특정 모델에 대한 기능을 추가할 때, 확장을 통해 코드의 중복을 줄이고, 가독성을 높이며, 유지보수를 쉽게 할 수 있습니다.
2. 핵심 개념 설명
- 확장(Extension): 기존 타입에 새로운 기능(메서드, 프로퍼티 등)을 추가하는 방법. 클래스나 구조체의 정의를 변경하지 않고도 새로운 기능을 부여할 수 있습니다.
- 타입 메서드(Type Method): 클래스, 구조체, 열거형에서 사용할 수 있는 메서드로, 인스턴스가 아닌 타입 자체에서 호출됩니다.
비유: 집에 방을 추가하는 것과 비슷합니다. 기존의 집은 그대로 두고, 새로운 방을 추가하여 더 많은 사람을 수용할 수 있게 되는 것입니다.
| 용어 | 설명 |
|---|---|
| 확장(Extension) | 기존 타입에 새로운 기능을 추가하는 것 |
| 타입 메서드 | 타입 자체에서 호출할 수 있는 메서드 |
3. 기본 코드 예제
아래 코드는 Int 타입에 대한 확장을 통해, 정수의 제곱을 계산하는 메서드를 추가하는 예제입니다.
extension Int {
func squared() -> Int {
return self * self
}
}
let number = 4
let squaredNumber = number.squared()
// squaredNumber의 값은 16
실행 결과: squaredNumber는 16입니다.
extension Int { ... }: Int 타입에 새로운 기능을 추가합니다.func squared() -> Int { ... }: 정수의 제곱을 계산하는 메서드를 정의합니다.let number = 4: 정수 4를 변수 number에 저장합니다.let squaredNumber = number.squared(): squared() 메서드를 호출하여 제곱 값을 계산합니다.4. 실전 활용 예제
예제 1: 문자열의 공백 제거
쇼핑몰에서 사용자 입력을 처리할 때, 입력받은 문자열의 앞뒤 공백을 제거하는 기능을 추가할 수 있습니다.
extension String {
func trimmed() -> String {
return self.trimmingCharacters(in: .whitespaces)
}
}
let userInput = " Hello, World! "
let trimmedInput = userInput.trimmed()
// trimmedInput의 값은 "Hello, World!"
예제 2: 배열의 최대값 찾기
상품 가격 목록에서 가장 비싼 상품을 찾는 기능을 추가할 수 있습니다.
extension Array where Element: Comparable {
func maxElement() -> Element? {
return self.max()
}
}
let prices = [10, 20, 50, 30]
let maxPrice = prices.maxElement()
// maxPrice의 값은 50
5. 흔한 실수와 주의사항
실수 1: 메서드 이름 중복
동일한 이름의 메서드를 여러 확장에서 정의하면 충돌이 발생할 수 있습니다.
extension Int {
func doubled() -> Int {
return self 2
}
}
extension Int {
func doubled() -> Int { // 오류 발생
return self 2
}
}
올바른 코드:
extension Int {
func doubleValue() -> Int {
return self * 2
}
}
실수 2: 프로퍼티 추가 시 주의
확장에서 저장 프로퍼티를 추가할 수는 없습니다. 계산 프로퍼티만 가능합니다.
extension Int {
var square: Int { // 오류 발생
return self * self
}
}
올바른 코드:
extension Int {
var squared: Int {
return self * self
}
}