THIS IS ELLIE

스위프트 Generic 본문

개발/Swift

스위프트 Generic

Ellie Kim 2019. 10. 13. 10:02

제네릭은 스위프트에서 가장 강력한 기능 중 하나로 스위프트의 표준 라이브러리는 대부분 제네릭 코드로 만들어졌습니다.

스위프트에 제네릭이 없었으면 어떨까요

위와 같이 버퍼 구조체가 있다고 가정합시다.

 

각 요소를 index로 가져오는 방법이 있지만 리턴 타입을 무엇으로 만들어야 할까요

제네릭이 없다면 우리가 버퍼에 넣고 싶은 것을 표현할 수 있는 타입인 Any로 넣어야 합니다.

// Any는 함수 타입을 포함하여 모든 타입의 인스턴스를 나타낼 수 있습니다.

 

하지만 Any로 넣게 되면 꺼내서 사용할 때 다른 타입일 수 있어 오류가 발생하기 쉽습니다.

예를 들어 위와 같이 문자열 버퍼에 정수를 넣으면 안 되겠죠.

 

그럼 메모리에는 어떻게 표현될까요.

우리가 원하는 메모리 모습은 하늘색 박스와 같은 모양입니다.

문자열 버퍼를 이상적으로 표현하면 모든 요소가 나란히 그리고 연속적인 메모리 블록이 됩니다. 

 

하지만 타입이 지정되지 않은 접근 방식 Any를 사용하면 이 방법이 효과가 없습니다.

왜냐하면 버퍼는 어떤 종류의 타입을 포함할지 미리 알 수 없기 때문입니다.

 

또한 Any를 사용하면 트랙킹과 boxing 그리고 unboxing에 많은 오버헤드가 있습니다.

따라서 사용의 용이성과 정확성뿐 아니라 성능상의 문제가 발생합니다.

 

제네릭을 사용하면 위와 같은 문제를 해결할 수 있습니다.

Element는 컴파일러가 버퍼에 무엇을 포함할 것인지를 알려주는 컴파일 argument라고 생각하면 됩니다.

제네릭을 사용하면 버퍼에서 Element를 가져올 때 따로 Any와 같이 변환할 필요가 없습니다.

 

제네릭을 사용하면 타입 argument를 지정하기 때문에 따로 타입 캐스팅이 필요하지 않습니다.

그렇기 때문에 이전과 같이 강제 언랩 핑으로 인한 위험성은 줄일 수 있습니다. 

 

이전과 같이 문자열 버퍼에 정수를 넣으면 안 되겠죠.

스트링 버퍼에 정수를 넣으면? 즉 실수를 한 경우에는 컴파일러가 에러를 발생시킵니다.

 

Cannot assign value of type Int to type String

문자열 타입에 정수 타입의 값을 할당할 수 없다고 

 

왜냐하면 컴파일러가 Element내용이 무엇이어야 하는지 추측이 가능하기 때문입니다.

즉 제네릭을 사용하면 오버헤드 없이 연속적인 메모리 블록에 모든 Element를 보유할 수 있습니다.

사용의 용이성과 정확성에 도움을 줄 수 있습니다.

 

위 내용은 WWDC에서 언급한 제네릭 세션의 일부를 정리한 것입니다. 

https://developer.apple.com/videos/play/wwdc2018/406/

 

Swift Generics (Expanded) - WWDC 2018 - Videos - Apple Developer

Generics are one of the most powerful features of Swift, enabling you to write flexible, reusable components while maintaining static...

developer.apple.com

https://docs.swift.org/swift-book/LanguageGuide/Generics.html

 

Generics — The Swift Programming Language (Swift 5.2)

Generics Generic code enables you to write flexible, reusable functions and types that can work with any type, subject to requirements that you define. You can write code that avoids duplication and expresses its intent in a clear, abstracted manner. Gener

docs.swift.org

간단히 제네릭을 정리해보았다.

https://www.notion.so/Generic-d350824f1f6a429bbb06d8b95a2dfd42

 

Generic

제네릭

www.notion.so

 

반응형