IOS개발: SWIFT/4. 객체 지향 프로그래밍 심화

Swift 확장: 타입 확장, 프로토콜 확장

_Blue_Sky_ 2024. 9. 13. 13:39
728x90
728x90

Swift 확장: 타입 확장과 프로토콜 확장 심층 분석

Swift의 확장(extension)은 기존에 정의된 클래스, 구조체, 열거형 또는 프로토콜에 새로운 기능을 추가할 수 있는 강력한 기능입니다. 이를 통해 코드 재사용성을 높이고, 타입의 기능을 확장하여 더욱 유연한 코드를 작성할 수 있습니다.

1. 타입 확장 (Type Extension)

타입 확장은 기존에 정의된 타입에 새로운 기능(메서드, 프로퍼티, 이니셜라이저 등)을 추가하는 것을 의미합니다.

예시:

Swift
extension Int {
    var isEven: Bool {
        return self % 2 == 0
    }
    
    func repeated(times: Int) -> [Int] {
        var array = [Int]()
        for _ in 0..<times {
            array.append(self)
        }
        return array
    }
}

let number = 42
print(number.isEven) // 출력: true
print(number.repeated(times: 3)) // 출력: [42, 42, 42]
코드를 사용할 때는 주의가 필요합니다.
 

위 예시에서 Int 타입에 isEven 프로퍼티와 repeated 메서드를 추가했습니다. 이제 모든 Int 값은 isEven 프로퍼티를 통해 짝수 여부를 확인할 수 있고, repeated 메서드를 통해 자신을 반복하여 배열을 만들 수 있습니다.

타입 확장의 활용:

  • 기존 타입 기능 확장: 표준 라이브러리에 정의된 타입에 추가 기능을 제공하여 코드를 간결하게 만들 수 있습니다.
  • 도메인 특정 언어 (DSL) 구축: 특정 도메인에 맞는 새로운 문법을 정의하여 코드 가독성을 높일 수 있습니다.
  • 제3자 라이브러리 기능 확장: 제3자 라이브러리의 타입에 추가 기능을 제공하여 맞춤형 기능을 구현할 수 있습니다.

2. 프로토콜 확장 (Protocol Extension)

프로토콜 확장은 프로토콜에 새로운 기능을 추가하거나, 프로토콜을 채택한 모든 타입에 공통적인 기능을 제공하는 방법입니다.

예시:

Swift
protocol Shape {
    var area: Double { get }
}

extension Shape {
    func scale(by factor: Double) -> Self {
        // 각 Shape 구현체에서 area 계산 로직을 재정의해야 함
    }
}
코드를 사용할 때는 주의가 필요합니다.
 

위 예시에서 Shape 프로토콜에 scale 메서드를 추가했습니다. 이제 Shape 프로토콜을 채택한 모든 타입은 scale 메서드를 사용할 수 있습니다. 하지만 각 타입에서 area 프로퍼티를 어떻게 계산할지는 구체적으로 구현해야 합니다.

프로토콜 확장의 활용:

  • 기본 구현 제공: 프로토콜을 채택한 타입에 공통적인 기능을 제공하여 코드 중복을 줄일 수 있습니다.
  • 제네릭 코드 작성: 제네릭 타입에 대한 확장을 통해 다양한 타입에 적용 가능한 코드를 작성할 수 있습니다.

3. 타입 확장과 프로토콜 확장의 차이점

특징타입 확장프로토콜 확장
확장 대상 특정 타입 프로토콜을 채택한 모든 타입
기능 추가 메서드, 프로퍼티, 이니셜라이저 등 메서드, 프로퍼티, 정적 메서드 등
구현 확장 내에서 직접 구현 프로토콜 채택 타입에서 구현하거나 기본 구현 제공
유연성 타입에 특화된 기능 추가 다양한 타입에 공통적인 기능 제공
Sheets로 내보내기

4. 주의 사항

  • 확장은 기존 타입의 기능을 변경하지 않습니다. 단지 새로운 기능을 추가할 뿐입니다.
  • 프로토콜 확장에서 모든 요구 사항을 구현해야 합니다. 프로토콜에서 요구하는 메서드나 프로퍼티를 구현하지 않으면 오류가 발생합니다.
  • 확장은 상속이 아닙니다. 확장된 타입은 확장한 타입의 서브 클래스가 아닙니다.

5. 활용 예시

  • 컬렉션 확장: Array, Dictionary 등의 컬렉션 타입에 다양한 연산 메서드를 추가하여 데이터 처리를 편리하게 만들 수 있습니다.
  • UIKit 컴포넌트 확장: UIButton, UILabel 등 UIKit 컴포넌트에 커스텀 스타일이나 기능을 추가하여 UI를 디자인할 수 있습니다.
  • 데이터 모델 확장: JSON 파싱, 데이터 유효성 검사 등 데이터 모델에 필요한 기능을 추가할 수 있습니다.

Swift의 확장 기능은 코드의 재사용성을 높이고, 코드 가독성을 향상시키는 강력한 도구입니다. 다양한 예시를 통해 확장의 활용 방법을 익히고, 자신만의 코드를 더욱 효율적으로 작성해 보세요.

728x90
728x90