[swift] 제네릭 타입

제네릭(Generic)은 Swift 프로그래밍 언어의 강력한 기능 중 하나입니다. 제네릭을 사용하면 타입에 대한 추상화를 할 수 있으며, 재사용 가능한 코드를 작성하는 데 도움을 줍니다. 이번 블로그 포스트에서는 Swift에서 제네릭 타입을 사용하는 방법을 알아보겠습니다.

제네릭 타입 정의하기

제네릭 타입을 정의하기 위해서는 <>를 사용하여 타입 매개변수를 선언해야 합니다. 타입 매개변수는 실제로 사용될 때에 대신할 실제 타입을 나타냅니다. 예를 들어, Array<Element>에서 Element는 타입 매개변수로, Array는 제네릭 타입입니다.

struct Stack<Element> {
    var items = [Element]()
    
    mutating func push(item: Element) {
        items.append(item)
    }
    
    mutating func pop() -> Element? {
        guard !items.isEmpty else { return nil }
        return items.removeLast()
    }
}

위의 코드에서는 Stack이라는 제네릭 타입을 정의하였습니다. Element는 타입 매개변수로 선언되었으며, items 프로퍼티는 실제로 사용될 때 대체될 타입을 나타냅니다.

제네릭 타입 사용하기

제네릭 타입을 사용할 때에는 실제 타입을 지정하여 해당 제네릭 타입을 사용합니다. 위에서 정의한 Stack 제네릭 타입을 사용하는 예제를 살펴보겠습니다.

var stack = Stack<Int>()
stack.push(item: 1)
stack.push(item: 2)
stack.push(item: 3)

print(stack.pop()) // 3
print(stack.pop()) // 2
print(stack.pop()) // 1

위의 코드에서는 Stack 제네릭 타입을 Int로 지정하여 사용하고 있습니다. push 메서드로 값을 스택에 추가하고, pop 메서드로 값을 꺼내옵니다.

제네릭 타입 확장하기

제네릭 타입은 확장하여 추가적인 기능을 구현할 수도 있습니다. 예를 들어, Stack 제네릭 타입을 확장해 isEmpty 메서드를 추가해보겠습니다.

extension Stack {
    var isEmpty: Bool {
        return items.isEmpty
    }
}

var stack = Stack<Int>()
print(stack.isEmpty) // true

stack.push(item: 1)
print(stack.isEmpty) // false

위의 코드에서는 extension 키워드를 사용하여 Stack 제네릭 타입을 확장하였습니다. isEmpty 프로퍼티는 스택이 비어있는지 여부를 나타내는 불리언 값을 반환합니다.

결론

제네릭 타입은 Swift에서 매우 강력한 기능 중 하나입니다. 타입 매개변수를 사용하여 재사용 가능한 코드를 작성하고, 다양한 타입에 대응할 수 있습니다. 제네릭 타입을 사용하여 유연하고 간결한 코드를 작성해보세요!

참고 자료