IMCAT.DEV
로그인 가입
Swift 중급 객체지향

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
        }
    }

    6. 정리

  • 확장은 기존 타입에 새 기능을 추가할 수 있는 강력한 도구입니다.
  • 타입 메서드를 활용하여 코드의 재사용성을 높일 수 있습니다.
  • 실무에서 사용자 입력 처리, 데이터 처리 등 다양한 상황에서 유용하게 사용됩니다.
  • 다음 학습 주제로는 "프로토콜"이나 "Generics"를 추천합니다.