
스위프트 제네릭(Generics)
스위프트의 제네릭은 유연하고 재사용 가능한 함수나 타입을 작성할 수 있도록 해줍니다. 제네릭을 사용하면 다양한 타입에 대응하는 단일 함수나 타입을 정의할 수 있으며, 코드 중복을 줄이고 의도를 명확하게 표현할 수 있습니다.
사용되는 이유
- 유연성과 재사용성: 한 타입의 로직을 다른 타입에도 쉽게 적용할 수 있습니다.
- 타입 안전성: 타입을 명시적으로 처리함으로써 잘못된 타입 사용으로 인한 오류를 컴파일 시간에 잡을 수 있습니다.
- 추상화: 구체적인 타입에 의존하지 않고, 일반적인 로직을 구현할 수 있습니다.
장단점
- 장점: 코드 중복을 줄이고, 타입 안전성을 높여 프로그램의 오류를 줄일 수 있습니다.
- 단점: 복잡한 제네릭 타입과 함수는 이해하고 사용하기 어려울 수 있으며, 오버엔지니어링을 유발할 수 있습니다.
제네릭 타입
제네릭 타입은 하나 이상의 타입 매개변수를 가진 커스텀 타입입니다. 이를 사용하여 다양한 타입을 처리할 수 있는 범용 컨테이너나 다른 타입을 만들 수 있습니다.
예시: 제네릭 타입
struct Stack<Element> { var items = [Element]() mutating func push(_ item: Element) { items.append(item) } mutating func pop() -> Element? { return items.popLast() } } var stackOfStrings = Stack<String>() stackOfStrings.push("apple") tackOfStrings.push("banana") print(stackOfStrings.pop()) // "banana" 출력 |
제네릭 함수
제네릭 함수는 어떤 타입에도 유연하게 작동할 수 있도록 타입 매개변수를 받는 함수입니다.
예시: 제네릭 함수
func swapTwoValues<T>(_ a: inout T, _ b: inout T) { let temporaryA = a a = b b = temporaryA } var firstInt = 3 var secondInt = 107 swapTwoValues(&firstInt, &secondInt) print("firstInt is now \(firstInt), secondInt is now \(secondInt)") // "firstInt is now 107, secondInt is now 3" 출력 |
제네릭은 코드의 범용성과 재사용성을 향상시키지만, 복잡성을 관리하고, 적절한 추상화 수준을 유지하는 것이 중요합니다. 너무 일반화된 로직은 사용하기 어려울 수 있으므로, 제네릭을 적절히 활용하는 것이 좋습니다.