Swift

제네릭(Generic), where 키워드

JDeoks 2023. 5. 3. 03:14

제네릭(Generic)이란?

제네릭은 Swift에서 매우 강력한 기능 중 하나이다. 

제네릭을 사용하면 함수, 메서드, 클래스, 구조체 등의 타입에 대해 일반화된 템플릿을 작성할 수 있다.

이는 코드 재사용성을 높이고, 타입 안정성을 보장하며, 유연성을 높이는 데 도움이 된다.

 

Int, Double, String 등과 같은 타입들은 모두 값을 가지는 타입이지만, 그 값의 타입과 크기가 모두 다르다.

따라서, 이러한 타입을 처리하는 함수 또는 메서드를 작성할 때, 매번 새로운 함수를 작성하는 것은 비효율적이다.

이때 제네릭을 사용하면, 타입에 상관없이 동작하는 하나의 일반적인 함수를 작성할 수 있다.

 

아래는 제네릭을 사용하는 예시이다.

func findMax<T: Comparable>(array: [T]) -> T? {
    guard !array.isEmpty else { return nil }
    var max = array[0]
    for item in array {
        if item > max {
            max = item
        }
    }
    return max
}

let numbers = [3, 6, 1, 8, 2, 10]
let max = findMax(array: numbers)
print(max) // 10

findMax라는 제네릭 함수는 T로 이루어진 배열을 입력받고 있다.

여기서 T란, 제네릭타입 매개변수로, Comparable 프로토콜을 준수하는 타입이라는 제한 조건을 가지고 있다.

위와 같이 제네릭을 사용함으로써, 여러 자료형의 값에서 최대값을 반환하는 함수를 오버로딩 없이 만들 수 있다.

 

`where`키워드를 사용한 제한 조건 추가

제네릭 타입 매개변수를 where 키워드를 사용해 나타낼 수 도 있다.

where 키워드란, 제네릭 타입 매개변수에 대한 제한 조건을 추가하는 데 사용하는 키워드이다.

가독성이 더 좋고 유연성이 높다는 장점이 있어서 where 키워드를 사용하는 것이 권장된다.

 

where 키워드의 예시이다.

// 기본 형태
func functionName<T>(parameter: T) where T: SomeProtocol, T: AnotherProtocol {
    // ...
}

func findMax<T>(array: [T]) -> T? where T: Comparable {
    guard !array.isEmpty else { return nil }
    var max = array[0]
    for item in array {
        if item > max {
            max = item
        }
    }
    return max
}

where 키워드를 사용하여 제네릭 타입 매개변수 T가 Comparable 프로토콜을 준수하도록 제한한다.

 

where 키워드는 제네릭 타입 매개변수뿐만 아니라, 일반 타입에 대해서도 사용할 수 있다.

func foo(input: Int) where input > 0 {
    print("input is positive")
}

foo(input: 5) // "input is positive"
foo(input: -5) // error: Execution was interrupted: signal SIGABRT (abort signal)

foo 함수는 input 매개변수가 양수일 때만 실행된다.

where 키워드를 사용하여 입력 매개변수의 조건을 추가할 수 있으며, 조건이 만족되지 않으면 컴파일러는 오류를 발생시킨다.