티스토리 뷰
Generics
제네릭
제네릭(Generic)은 스위프트 표준 라이브러리에서 제공하고 있는 기능 중 하나입니다.
제네릭 코드는 융통성있는, 재사용가능한 기능 및 타입들을 작성할 수 있게 해줍니다. 또한, 제네릭은 다른 어떠한 타입, 개발자가 정의한 요구사항에 의존적인 타입들과 함께 작동할 수 있습니다. 또한 제네릭을 사용하면 중복을 방지하며, 의미를 깔끔하고, 추상화된 방식으로 표현할 수 있습니다.
제네릭은 Swift 언어의 매우 강력한 기능 중 하나라고 할 수 있습니다. 또한, 대부분의 스위프트 표준 라이브러리는 제네릭(Geenic) 코드로 구성되어 있습니다. 그렇기에 사실, 많은 개발자 들은 언어 가이드(Language Guide)를 통해서 지금까지 제네릭을 사용해왔고 해오고 있을 것입니다. 이를 알아차리지 못했을 뿐이지요.
예를들면, Swift의 배열(Array), 딕셔너리(Dictionary) 타입은 둘다 제네릭 컬렉션입니다. 제네릭을 사용하면 Array의 타입을 Int 값 뿐만아니라 String, Character 등 다양한 타입으로서 지정해서 사용할 수 있습니다. 또한 Swift에서 만들어지느 어떠한 타입으로든 선택이 될 수 있습니다. 이와 유사하게, 당신은 딕셔너리의 값 타입을 특정 타입으로 지정해서 만들 수 있습니다. 또한 이러한 타입 지정을 할 때 별도의 제한은 없습니다.
The Problem That Generics solve
제네릭이 해결할 수 있는 문제
아래의 코드는 일반적인 제네릭을 사용하지 않은 메서드, swapTwoInts(_:_:)입니다. 이는 두개의 Int값을 Call By Reference 방식으로 전달 받아 스왑하는 메서드입니다.
위의 메서드는 Call-By-Reference 방식으로 넘겨지는 in-out 인자값(링크), aValue, bValue를 받아서 두개의 값을 swap하고 있습니다.
해당 메서드는 in-out으로서 넘겨진 두개의 값을 swap해줍니다. 예를들면 위의 경우 aValue는 bValue로, bValue는 aValue로 값이 바뀌게 됩니다.
위와 같이 각각 10, 20의 값을 가진 firstInt, secondInt는 swap 되어 20, 10의 값을 갖게 되었습니다. 이렇게, 두 개의 값을 swap해주는 swapToIntValues(_:_:) 메서드는 유용할 수 있습니다. 하지만, 해당 메서드는 Int타입의 인자값만 받을 수 있다는 제한이 있습니다. 만약 두개의 String 타입을 swap하고 싶다면, Double타입이라면... 개발자는 이를 위한 메서드를 또다시 새로 작성해야할 수 있습니다.
swapTwoStringValues(_:_:), swapTwoDoubleValues(_:_:) 등의 메서드를 말이지요..
만약 타입에 따라 메서드를 각각 정의하게 된다면 아래와 같이 작성될 수 있겠습니다.
위의 코드는 swap을 사용하기 위해 여러개의 메서드를 선언한 모습입니다. 아시겠지만, 인자값 타입만 다를 뿐, 동일한 코드 내용을 갖고 있어 중복이 발생하는 것을 볼 수 있습니다. 해당 메서드를 각각 사용하면 사용 결과는 아래와 같습니다.
위와 같은 코드를 통해 Int, Double, String 타입의 다양한 값들을 정상적으로 swap할 수 있게 되었습니다.
만약 하나의 단일 메서드에서 어떤 타입이던 상관없이 인자로 받아 swap을 해줄 수 있다면, 위의 경우보다 훨씬 유용하고, 매우 융통성있는 코드가 될 것입니다. Generic 코드는 이러한 코드를 작성할 수 있게 해줍니다.
Note
위에서 Int, String, Double 타입의 swap을 위해 생성한 세개의 타입들처럼, swap을 할때 두개의 인자값 타입은 동일해야 합니다. 만약 두개의 인자값, aValue, bValue 타입이 서로 같지 않다면, 두개의 값을 swap하는 것을 불가능할 겁니다. 타입 안정성을 중시하는 Swift에서는 타입이 다른 두개의 값들을 서로 교체하는 것을 허용하지 않습니다. 만약 이러한 것들을 하려고 하면 컴파일 타임 에러를 보게 됩니다.
'iOS 개발 > 개발자문서 정보' 카테고리의 다른 글
Swift typealias, 스위프트 별명 사용방법, 주의사항 (0) | 2020.07.07 |
---|---|
Swift Generic 2) 제네릭 사용방법, 활용예시 (0) | 2020.07.06 |
Swift 문서, 스위프트 표준 라이브러리 개요 (0) | 2020.07.04 |
Swift String, 문자열 구성하는 Character 타입 알아보기 (0) | 2020.07.02 |
Swift String, 문자열의 count보다 isEmpty가 빠른 이유 (0) | 2020.07.01 |
- Total
- Today
- Yesterday
- Collection
- swift알고리즘
- 프로그래머스swift
- 백준swift
- 알고리즘문제
- 프로그래머스
- uikit
- 김프매매
- Swift 알고리즘
- 알고리즘
- ios
- 백준알고리즘
- swift
- swift 문자열
- 프로토콜
- 컬렉션
- SwiftUI
- swift 기초
- swift reduce
- 부스트코스
- swift문제
- createML
- swift string
- publisher
- Protocol
- swift언어
- CoreML
- 스위프트
- 개발자문서
- 자연어처리
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |