NOW-ON / iOS-Interview-Preparation

iOS 면접 준비
3 stars 0 forks source link

Generic #4

Closed Glsme closed 1 year ago

Glsme commented 1 year ago

2022.12.23(금) 모임전까지 작성해주세요.

LeeJoobang commented 1 year ago
Glsme commented 1 year ago
Yun-YeoJin commented 1 year ago

타입에 의존하지 않는 범용 코드를 작성할 때 사용한다. 사용 시 중복을 피할 수 있고, 코드를 유연하게 작성할 수 있다. 흔하게 사용하는 Array나 Dictionary도 제네릭 타입으로 구성되어 있음!

는 타입 파라미터로 실제 함수가 호출될 때 해당 매개변수의 타입으로 대체되는 것! (새로운 형식으로 생성되는데 아님!)
heydoy commented 1 year ago

Generic의 정의

Generic은 Swift의 강력한 특징 중 하나. Swift의 표준 라이브러리의 대부분은 Generic으로 빌드됨. 예를 들어 Array, Dictionary 도 Generic Collection.

Generic이 해결하는 문제

아래의 nongeneric 함수의 경우 두 값을 바꾸기 위해 inout을 사용했다.

func swapStrings(_ a: inout String, _ b: inout String) {
    let temp = a
    a = b
    b = temp
}

두 값을 바꾸기에 유용하지만, String 형태의 값만 바꿀 수 있다. 다른 타입의 값을 바꾸고 싶다면 해당 타입을 받는 함수를 추가적으로 만들어야하지만, 값을 바꾸는 함수의 내부 바디는 어떤 형태이든 동일할 것이다.

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

위와 Generic 함수는 어떤 타입과도 작동할 수 있다.

Generic과 Nongeneric 의 차이점

Placeholder type name

Generic을 이용한 함수는 실제 타입 이름이 아니라, placeholder 타입 이름 (위 코드에서는 T)을 사용한다. 이 placeholder 타입 이름은 T가 무엇인지 말하지 않지만, 매개변수 a와 b가 둘 다 같은 타입 T라는 것을 명시한다. T 자리에 사용되는 실제 타입은 swapTwoValues(_:_:) 함수가 호출될 때마다 결정이 된다.

플레이스홀더가 함수 이름 뒤에 꺽쇠 안에 붙는다는 점 <T>

이 꺽쇠를 통해 Swift에게 T는 해당 함수의 placeholder 타입 이름이라는 것을 명시한다. T가 플레이스홀더이므로 Swift가 T라는 실제 타입을 찾아헤매지 않는다.

타입 파라미터

위 예시로 든 플레이스홀더 타입 T는 타입 파라미터의 한 예. 꺽쇠 안에 콤마로 여러개의 타입파라미터를 작성할 수 있다. <T, U, K>

네이밍 타입 파라미터

타입 파라미터는 설명적인 이름을 가진다. 예를 들면 Dictionary<Key, Value또는 Array<Element>처럼. 읽는 사람에게 타입 파라미터와 제네릭 타입, 또는 사용되는 함수에 대한 관계를 알려줄 수 있도록. 하지만 의미있는 관계가 그 사이에 없다면 보통은 하나의 문자 T, U, V 를 사용하는 것이 전통적인 형태.

이때 타입파라미터는 Upper camel case로 네이밍해서, 값이 아니라 타입에 대한 Placeholder라는 것을 명시한다.

wodyddml2 commented 1 year ago

Generic이란 
타입에 제한을 두지 않는 코드를 작성할 때 사용
 코드의 중복을 피해 재사용 가능한 함수를 만들 수 있다.