swift 제네릭을 사용하는 이유

임혜정·2024년 6월 30일
0

swift에서 제네릭을 사용하면 코드가 여러 가지 데이터 타입과 함께 작동할 수 있게 만든다.

제네릭을 사용하면 코드의 재사용성이 높아진다. 같은 코드를 여러 번 작성할 필요 없이 다양한 데이터 타입에 대해 같은 코드를 사용할 수 있게 해준다. 이를 통해 코드를 더 간단하고, 오류를 줄이며, 유지보수가 쉽게 만든다.

간단한 예제

// 제네릭 함수를 정의한다.
func swapValues<T>(_ a: inout T, _ b: inout T) {
    let temp = a
    a = b
    b = temp
}

// 이제 우리는 서로 다른 타입의 값을 교환할 수 있다.
var number1 = 10
var number2 = 20
swapValues(&number1, &number2)
print("number1: \(number1), number2: \(number2)") // 출력: number1: 20, number2: 10

var string1 = "Hello"
var string2 = "World"
swapValues(&string1, &string2)
print("string1: \(string1), string2: \(string2)") // 출력: string1: World, string2: Hello

위의 예제에서 swapValues 함수는 제네릭 함수다. T는 어떤 타입이든 될 수 있는 일종의 '자리표'다. 이 함수는 두 개의 값을 받아서 서로 위치를 바꾼다. 그리고 우리는 숫자, 문자열 등 어떤 타입이든 사용할 수 있다.


제네릭이 필요한 상황

  1. 여러 타입을 처리할 때: 만약 여러 타입의 데이터를 다루어야 한다면, 제네릭을 사용하여 같은 코드로 여러 타입을 처리할 수 있다.

  2. 코드의 재사용성을 높일 때: 같은 기능을 여러 번 구현하지 않고, 한 번의 구현으로 여러 타입에 대해 동작하게 하고 싶을 때 유용하다.

  3. 유지보수의 용이성: 코드가 중복되지 않아서, 수정이 필요할 때 한 곳만 고치면 되므로 유지보수가 쉽다.


예제

장난감 상자 예제를 더 확장해보자. 이제 장난감을 담을 수 있는 상자를 만들어보자.

// 제네릭 클래스를 정의한다.
class ToyBox<T> {
    var toys = [T]()
    
    func addToy(_ toy: T) {
        toys.append(toy)
    }
    
    func getToy(index: Int) -> T? {
        if index < toys.count {
            return toys[index]
        } else {
            return nil
        }
    }
}

// 인형 장난감 상자를 만든다.
let dollBox = ToyBox<String>()
dollBox.addToy("인형")
dollBox.addToy("곰인형")
print(dollBox.getToy(index: 0) ?? "없음") // 출력: 인형

// 숫자 장난감 상자를 만든다.
let numberBox = ToyBox<Int>()
numberBox.addToy(1)
numberBox.addToy(2)
print(numberBox.getToy(index: 1) ?? "없음") // 출력: 2

위의 예제에서 ToyBox 클래스는 제네릭 클래스다. T는 어떤 타입이든 될 수 있는 자리표로, 이 상자에 어떤 타입의 장난감이든 담을 수 있다.

profile
오늘 배운걸 까먹었을 미래의 나에게..⭐️

0개의 댓글