IOS개발: SWIFT/5. 고급 주제 탐구

Swift 제네릭 함수, 제네릭 타입

_Blue_Sky_ 2024. 9. 13. 15:33
728x90
728x90

Swift 제네릭: 유연하고 재사용 가능한 코드를 위한 강력한 도구

제네릭이란?

Swift의 제네릭(Generic)은 특정 타입에 의존하지 않고, 다양한 타입을 다룰 수 있도록 하는 기능입니다. 즉, 코드를 한 번 작성하여 여러 타입에 적용할 수 있도록 만들어주는 것이죠. 이를 통해 코드의 재사용성을 높이고, 유연성을 확보할 수 있습니다.

제네릭 함수

제네릭 함수는 타입 매개변수를 사용하여 다양한 타입의 값을 다룰 수 있는 함수입니다.

func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
    let temporaryA = a
    a = b
    b = temporaryA
}
 

위 코드에서 T는 타입 매개변수입니다. 이 함수는 어떤 타입의 값이든 두 개를 받아서 서로 바꿔주는 역할을 합니다. Int, Double, String 등 어떤 타입이든 상관없이 사용할 수 있습니다.

Swift
var a = 42
var b = 3.14159
swapTwoValues(&a, &b)
print(a, b) // 출력: 3.14159 42
코드를 사용할 때는 주의가 필요합니다.
 

제네릭 타입

제네릭 타입은 타입 매개변수를 사용하여 정의된 구조체, 클래스, 열거형입니다.

struct Stack<Element> {
    var items = [Element]()
    mutating func push(_ item: Element) {
        items.append(item)
    }
    mutating func pop() -> Element? {
        return items.popLast()
    }
}
 
 

위 코드는 Element라는 타입 매개변수를 사용하여 스택을 구현한 예입니다. Element 타입은 어떤 타입이든 될 수 있으므로, Int 스택, String 스택 등 다양한 종류의 스택을 만들 수 있습니다.

var intStack = Stack<Int>()
intStack.push(1)
intStack.push(2)
intStack.push(3)

var stringStack = Stack<String>()
stringStack.push("hello")
stringStack.push("world")
 

제네릭 제약

제네릭 타입에 대한 제약을 설정하여 더욱 안전하고 유연한 코드를 작성할 수 있습니다.

func findIndex(of valueToFind: T, in array: [T]) -> Int? where T: Equatable {
    for (index, value) in array.enumerated() {
        if value == valueToFind {
            return index
        }
    }
    return nil
}
 
위 코드에서 where T: Equatable은 T 타입이 Equatable 프로토콜을 준수해야 한다는 제약을 설정합니다. Equatable 프로토콜은 == 연산자를 통해 두 값을 비교할 수 있는 기능을 제공합니다. 따라서 이 함수는 Equatable 프로토콜을 준수하는 모든 타입의 배열에서 특정 값의 인덱스를 찾을 수 있습니다.

제네릭의 장점

  • 코드 재사용성 향상: 동일한 로직을 여러 타입에 적용할 수 있어 코드 중복을 줄이고 유지보수를 용이하게 합니다.
  • 타입 안전성: 컴파일 시점에 타입 오류를 잡아내어 실행 시 예기치 못한 오류 발생 가능성을 줄입니다.
  • 유연한 코드 작성: 다양한 타입을 다루는 코드를 작성할 수 있어 코드의 활용도를 높입니다.

결론

Swift의 제네릭은 코드의 재사용성과 유연성을 높이는 강력한 기능입니다. 제네릭을 효과적으로 활용하면 더욱 안전하고 표현력 있는 코드를 작성할 수 있습니다.

더 깊이 있는 학습을 위해 다음과 같은 내용을 추가로 학습해 보세요.

  • 제네릭 프로토콜: 프로토콜에 제네릭을 적용하는 방법
  • 제네릭 연관 타입: 제네릭 타입 간의 관계를 정의하는 방법
  • 제네릭 제약: 제네릭 타입에 대한 다양한 제약 조건 설정
  • Swift 표준 라이브러리의 제네릭 활용: Array, Dictionary 등 표준 라이브러리의 제네릭 기능 활용
728x90
728x90