이 아티클은 Generic과 메모리 구조에 대한 전반적인 이해가 있어야 Aha! 포인트가 더 많을 것입니다!!!!
야우쓰에 제네릭과 관련해서 너무 좋은 아티클을 찾아서 같이 공유하고 싶어서 적어봅니당~
Apple 공식문서 왈 “Swift에서 가장 강력한 기능 중 하나”라고 평가를 받는 Generic은
타입에 의존하지 않는 범용 코드를 작성할 때 사용한다
제네릭을 사용하면 중복을 피하고, 코드를 유연하게 작성할 수 있다
라고 설명되어있으며, 실제 Swift의 표준 라이브러리가 대다수 제네릭으로 선언된다. 감이 안 잡힐게 뻔하니까 예시를 들어서 설명하도록 하겠다.
⇒ 다양한 객체에 대해 구현이 동일한 메서드나 타입을 컴파일 타임에 확인해 주는 강력한 도구
<T>라고 불렸던 타입 파라미터는 새로운 형식으로 생성되는 것이 아니라, 실제 함수가 호출될 때 해당 매개변수의 타입으로 대체되는 Placeholder이다.
꺽새(<>)로 감싸는 이유는 Placeholder의 타입으로
Swift한테 T는 새로운 타입이 아니야! 그러니까 실제 이 타입이 존재하는지 찾지 마! 자리 타입이야!!
를 알려주는 역할이다.
그래서 이 T는 함수가 호출될때 마다 결정이 되는겁니다. 이 과정을 우리는 **구체화(Specialization)**라고 한다!
• Specialization (구체화) : Type Parameter 는 함수의 호출 부에서 특정한 구체적인 타입으로 결정되는 과정
(호출시 → 스택으로 갈때 매개변수의 타입에 맞게 메모리를 할당하는 거 같다)
struct Stack<T> {
let items: [T] = []
mutating func push(_ item: T) { ... }
mutating func pop() -> T { ... }
}
let stack1: Stack<Int> = .init()
let stack2 = Stack<Int>.init()
요즘 계속 OS를 공부해서 그런지 제네릭은 그러면 OS?까진 아니여도 뒷쪽에서는 어떻게 작동하는지가 궁금했다.
이러한 제네릭 코드가 있고~