[ios_Swift] Generic

이시영·2023년 9월 20일

제네릭 함수는 다양한 데이터 유형과 형식에 대해 작동하는 함수를 작성할 때 사용되는 Swift의 강력한 기능 중 하나입니다. 제네릭 함수를 사용하면 함수의 인자나 반환 값의 데이터 유형을 미리 지정하지 않고, 호출 시에 실제 데이터 유형을 결정할 수 있습니다. 이렇게 하면 코드의 재사용성을 높이고 유연성을 제공할 수 있습니다.

실제로 Swift 표준 라이브러리의 여러 코드들이 제네릭 코드로 구성되어 있는데 배열(Array), 딕셔너리(Dictionary), 세트(Set) 등의 타입은 모두 제네릭 컬렉션입니다.

제네릭 함수를 정의할 때는 함수 이름 뒤에 와 같은 형태로 제네릭 타입 매개변수를 선언합니다. 이렇게 선언한 제네릭 타입 매개변수 T는 함수 내에서 사용되며, 함수가 호출될 때 실제 데이터 유형으로 대체됩니다.
여기서 이 T를 Type Parameter라고 부르며 T라는 새로운 형식이 생성되는 것이 아닌 실제 함수가 호출될 때 해당 매개변수의 타입으로 대체되는 Placeholder입니다.

제네릭은 아래와 같은 형태로 사용됩니다.

// 제네릭 함수
func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
    let temp = a
    a = b
    b = temp
}

// 제네릭 함수 호출
var num1 = 5
var num2 = 10
swapTwoValues(&num1, &num2)
print("num1: \(num1), num2: \(num2)") // 출력: num1: 10, num2: 5

var str1 = "Hello"
var str2 = "World"
swapTwoValues(&str1, &str2)
print("str1: \(str1), str2: \(str2)") // 출력: str1: World, str2: Hello

위의 예제에서 swapTwoValues 함수는 제네릭 함수로 정의되어 있으며, inout 매개변수 a와 b를 통해 두 값의 위치를 교환합니다. 이 함수는 T라는 제네릭 타입 매개변수를 사용하므로 num1과 num2처럼 정수 또는 str1과 str2처럼 문자열을 교환할 수 있습니다.

inout 매개변수와 앰퍼샌드(&)

함수의 매개변수는 기본적으로 상수인데, 이 매개변수 값을 해당 함수의 본문 내에서 변경하려 하면 컴파일 오류가 생깁니다. 함수에서 매개변수의 값을 수정하고 함수 호출이 종료된 후에도 변경 사항을 유지하려면 inout 파라미터를 사용해야 합니다.
inout 매개변수는 함수에 전달된 값을 가지며, 함수에 의해 수정되며 원래 값을 대체하기 위해 함수에 다시 전달됩니다.
inout 매개변수는 변수 var 에만 전달할 수 있고, 상수 및 리터럴은 수정 불가하므로 인수로 전달할 수 없으며 변수 이름 앞에 앰퍼샌드(&)를 사용해 수정될 수 있음을 나타냅니다.

이와 같이 제네릭 함수를 사용하면 함수의 다양한 유형 및 데이터에 대한 재사용성을 높일 수 있으며, 타입 안전성을 유지하면서 코드를 더 간결하게 작성할 수 있습니다.

0개의 댓글