스위프트 제네릭(Generics)

스위프트의 제네릭은 유연하고 재사용 가능한 함수나 타입을 작성할 수 있도록 해줍니다. 제네릭을 사용하면 다양한 타입에 대응하는 단일 함수나 타입을 정의할 수 있으며, 코드 중복을 줄이고 의도를 명확하게 표현할 수 있습니다.

사용되는 이유

  • 유연성과 재사용성: 한 타입의 로직을 다른 타입에도 쉽게 적용할 수 있습니다.
  • 타입 안전성: 타입을 명시적으로 처리함으로써 잘못된 타입 사용으로 인한 오류를 컴파일 시간에 잡을 수 있습니다.
  • 추상화: 구체적인 타입에 의존하지 않고, 일반적인 로직을 구현할 수 있습니다.

장단점

  • 장점: 코드 중복을 줄이고, 타입 안전성을 높여 프로그램의 오류를 줄일 수 있습니다.
  • 단점: 복잡한 제네릭 타입과 함수는 이해하고 사용하기 어려울 수 있으며, 오버엔지니어링을 유발할 수 있습니다.

제네릭 타입

제네릭 타입은 하나 이상의 타입 매개변수를 가진 커스텀 타입입니다. 이를 사용하여 다양한 타입을 처리할 수 있는 범용 컨테이너나 다른 타입을 만들 수 있습니다.

예시: 제네릭 타입

struct Stack<Element> { 

    var
 items = [Element]() 

    mutating func push(_ itemElement) {
       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>(_ ainout T_ binout 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" 출력
 

제네릭은 코드의 범용성과 재사용성을 향상시키지만, 복잡성을 관리하고, 적절한 추상화 수준을 유지하는 것이 중요합니다. 너무 일반화된 로직은 사용하기 어려울 수 있으므로, 제네릭을 적절히 활용하는 것이 좋습니다.

+ Recent posts