본문 바로가기
⌨️ Language/swift

[Swift] 제네릭 (Generic)

by hyebin (Helia) 2023. 2. 7.

제네릭 (Generic)

  • 타입을 파라미터화 하여 컴파일 타임에 구체적인 타입이 결정되는 것을 의미
  • 제네릭을 이용하면 타입에 유연하게 대처하는 것이 가능
  • 제네릭으로 구현한 기능과 타입은 재사용에 용이
  • 코드의 중복을 줄일 수 있어서 깔끔한 표현이 가능
  • Swift에서의 대표적인 제네릭 타입으로는 Array와 Dictionary 타입이 
  • Array와 Dictionary는 Int 값을 저장할 수도 있고, String 값을 저장할 수도 있으므로, 타입에 제한이 없음
// String 타입을 갖는 두개의 값을 바꾸는 함수
func swapTwoStrings(_ a: inout String, _ b: inout String) {
	let temporaryA = a
 	a = b
 	b = temporaryA
}

// Double 타입을 갖는 두개의 값을 바꾸는 함수
func swapTwoDoubles(_ a: inout Double, _ b: inout Double) {
 	let temporaryA = a
 	a = b
 	b = temporaryA
}

// 제네릭 타입을 활용하여 다양한 타입의 값을 바꾸는 함수
func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
 	let temporaryA = a
 	a = b
 	b = temporaryA
}

 

타입 파라미터 (Type Parameters) 

  • 위 swapTwoValues 함수의 예제에서 T는 타입 파라미터의 예시
  • 타입 파라미터는 꺽쇠 괄호 (<>) 사이에, 견본 (placeholder) 타입을 지정한 다음에 이름을 지정하고, 함수의 이름 바로 뒤에 작성
  • 타입 파라미터를 한번 선언하면 이 것을 함수의 타입으로 사용 가능
  • 복수의 타입 파라미터를 사용할 때는 <T, U>와 같이 콤마로 구분

타입 파라미터 이름 짓기

  • Dictionary와 같이 엘리먼트 간의 서로 상관관계가 있는 경우 의미가 있는 이름을 파라미터 이름으로 붙임
  • 그렇지 않은 경우는 T , U , V와 같은 단일 문자로 파라미터 이름을 사용
  • 값이 아니라 타입에 대한 placeholder 임을 가리키기 위해, 항상 타입 매개변수의 이름에는 카멜 표기법을 사용

타입 제약 사항

  • 타입 제약사항은 타입 매개변수가 특정 클래스에서 상속되어야 하거나, 특정 프로토콜이나 프로토콜 합성을 준수하는 것을 지정
  • 예를 들어, Swift의 Dictionary 타입은 딕셔너리의 키로 사용될 수 있는 타입을 Hashable로 제한
  • 단일 클래스나 타입 매개변수 이름 뒤에 타입 매개변수 목록으로 콜론(:)으로 구분된, 프로토콜 제약사항을 위치시켜서 타입 제약사항을 작성
func someFunction<T: SomeClass, U: SomeProtocol>(someT: T, someU: U)
{
 // ...
}

 

연관 타입 (Associated Types)

  • 연관 타입(associated type)은 프로토콜에서 사용되는 타입에 placeholder 이름을 주는 것
  • 연관 타입에 사용하는 실제 타입은 프로토콜이 채택될 때까지 지정되지 않음
  • 연관 타입은 associatedtype 키워드로 지정
protocol Container {
     associatedtype Item
     mutating func append(_ item: Item)
     var count: Int { get }
     subscript(i: Int) -> Item { get }
}

 

제네릭 Where절

  • 특정 프로토콜을 반드시 준수하는 연관된 타입을 가져오거나, 특정 타입 매개변수와 연관된 타입이 동일하게 하는 것이 가능
  • where 키워드로 시작
  • 연관된 타입 또는 타입과 연관된 타입 간의 동등한 관계에 대한 제약사항이 뒤따름
  • 제네릭 where절을 타입이나 함수의 본문의 열린 중괄호({}) 바로 앞에 작성
extension Array where Element: FixedWidthInteger {
    mutating func pop() -> Element { return self.removeLast() }
}
반응형

'⌨️ Language > swift' 카테고리의 다른 글

[Swift] 접근 제어 (Access Control)  (0) 2023.02.07
[Swift] ARC  (0) 2023.02.07
[Swift] 에러 처리  (0) 2023.02.07
[Swift] 고차함수  (0) 2023.02.06
[Swift] 클로저 (Closure)  (0) 2023.02.06

댓글