본문 바로가기
문법관련/Swift

제너릭 기초(Generic)

by print_soo 2022. 8. 26.

정의

💡 Generic: 포괄적인

우리가 사용한는 Swift 표준 라이브러리의 대부분은 제너릭으로 작성되어있다. 그 예시로 Swift의 배열, 딕셔너리가 있다.

 

예시

 

제너릭을 좀 더 쉽게 이해하기 위해서 예시를 보자.

아래에 있는 함수는 함수 이름 그대로 정수형 변수 두개의 값을 서로 바꿔주는 함수이다. 

func swapTwoInts(_ a: inout Int, _ b: inout Int) {    
	let temporaryA = a    
    a = b    
    b = temporaryA
}

하지만 해당 함수를 작성하고 String형의 변수 두개의 값을 서로 바꿔주기 위해서는 또 다시 swapTwoStrings라는 함수를 만들어야한다. 

Double도 마찬가지로 또 함수를 만들어야한다. 이렇게 하면 잘 작동은 되겠지만 3개의 함수나 만들어야한다. 

 

따라서 이럴 때는 제너릭을 사용해서 함수를 만들면 1개의 함수로 Int, String, Double 타입의 변수를 모두 바꿔줄 수 있다. (같은 타입끼리만 변경가능)

 

func swapTwoValues<T>(_ a: inout T, _ b: inout T) {    
    let temporaryA = a
    a = b
    b = temporaryA
}

 

위의 함수는 제너릭으로 만든 함수이다. swapTowInts와 다른 점은 Type을 작성하는 부분에 특정된 타입이 작성된 것이 아니라 T라는 것이 들어간 것이다.

 

❓ Q: 그럼 T는 뭘까?

💬 A: T는 타입 파라미터이다.


Q: 타입 파라미터?

💬 1. 함수이름 바로 뒤에 명시해주고 꺽쇠(<>) 사이에 넣어준다.
💬 2. 함수의 파라미터 타입이나 리턴 타입으로 쓸 수 있고, 함수 본문안에서 타입 어노테이션으로도 사용가능
💬 3. 함수가 호출될 때마다 타입 파라미터는 실제 타입으로 교체된다.

 

T라는 것은 Placeholder 타입 이름이다. String, Int도 타입 이름인 것처럼 T도 T라는 타입의 이름이 들어간 것이다.

 

❓ Q:  Placeholder 타입 이름은 뭘까?

💬 A1: "T는 반드시 이 타입이다"가 아니라 "T는 어떤 타입이라도 상관없지만 a와 b는 반드시 같은 타입인 T가 되어야 한다"를 가리키고 있다.

💬 A2: Placeholder 타입 이름은 꺽쇠(<>)안에 넣는다. 위의 예제에서는 T를 사용했다.

💬 A3: Swift에서는 T가 꺽쇠 안에 들어갔기 때문에 T를 placeholder타입 이름으로 인지하고 T라는 실제 타입이 있는지 찾아보지 않는다.

 

 

T는 함수가 호출될 때마다 들어오는 매개변수에 따라서 결정된다. 그렇기 때문에 어떤 타입의 값을 매개변수로 넣어도 오류가 생기지 않는다. (주의점: a, b는 T타입과 일치 해야한다.)