개발 관련/iOS SWIFT

[Swift] typealias와 associatedtype의 차이점

magpiebros 2023. 4. 7. 16:30
반응형

안녕하세요.

맥파이입니다.

 

오늘은 typealias와 associatedtype의 차이점을 알아보려고 합니다.

typealias와 associatedtype가 궁금하신 분은 아래 링크에서 먼저 확인해보시죠!

 

2023.04.05 - [iOS 개발/swift] - [Swift] Typealias란 무엇인가?

 

[Swift] Typealias란 무엇인가?

안녕하세요 맥파이입니다. 오늘부터는 Swift를 공부하면서, 한번씩 이게 뭐지 할수 있는 것들에 대해 정리를 해볼려고 합니다. 여러번 정리를 해보고 했지만, 글로 남겨두지 않으니 필요할때 다

www.magpiebros.com

 

2023.04.05 - [iOS 개발/swift] - [Swift] Associated Type 이란?

 

[Swift] Associated Type 이란?

안녕하세요. 맥파이 입니다. 오늘은 Associated Type를 파헤질 예정입니다. Associated Type은 프로토콜에서 사용됩니다. Associated Type은 프로토콜을 위한 Generic이라고 생각하시면 됩니다. Generic에 대해서

www.magpiebros.com

 

 

타입의 별칭

Swift에서는 타입을 별칭으로 지정하는 typealias와 프로토콜에서 연관 타입을 선언하는 associatedtype 두 가지 방법을 제공합니다.

 

 

typealias

typealias는 기존의 타입에 새로운 이름을 지정하는 역할을 합니다. 이를 통해 코드의 가독성을 높이고, 반복적인 타입을 줄이는 데 유용합니다. typealias는 다음과 같은 문법으로 사용할 수 있습니다.

typealias NewTypeName = ExistingTypeName

 

typealias IntTuple = (Int, Int)
let myTuple: IntTuple = (3, 4)

(Int, Int) 타입의 별칭을 IntTuple로 지정하고, IntTuple 타입의 변수를 생성하는 코드입니다.

 

 

associatedtype

associatedtype은 프로토콜에서 연관 타입을 선언하는 역할을 합니다.

연관 타입은 프로토콜에서 사용하는 타입 중 일부를 제네릭하게 지정할 수 있는 방법입니다.

이는 프로토콜을 사용하는 다양한 타입에서 연관 타입에 해당하는 부분을 자유롭게 구현할 수 있도록 합니다.

 

protocol MyProtocol {
	associatedtype MyType func doSomething(with value: MyType) 
}

MyProtocol에서 연관 타입 MyType을 선언하고, 이를 사용하는 doSomething 메소드를 정의하였습니다.

구현하는 클래스나 구조체에서 MyType 타입을 구체적으로 정의할 수 있습니다.

 

class MyClass: MyProtocol {
	typealias MyType = Int func doSomething(with value: Int) {
    	// do something 
    } 
}

MyProtocol을 구현하는 MyClass에서 MyType을 Int 타입으로 구체화하는 예시입니다.

 

 

typealias와 associatedtype의 차이점

 

typealias와 associatedtype은 모두 타입 별칭을 지정하는 방법이지만, 사용하는 상황과 목적이 다릅니다.

typealias는 기존의 타입에 새로운 이름을 지정하는 데 사용됩니다.

associatedtype은 프로토콜에서 연관 타입을 선언하는 데 사용됩니다.

 

 

보너스: associated type은 제네릭 타입?

연관 타입(associated type)은 프로토콜(Protocol) 내에서 제네릭 타입으로 선언되는 타입으로, 구조체, 클래스, 열거형 등에서 구체화됩니다. 

연관 타입은 제네릭 타입이기 때문에, 타입을 구체화하기 위해서는 프로토콜에서 선언한 연관 타입을 구현해야 합니다.

Swift에서는 대부분의 경우, 연관 타입을 추론할 수 있습니다. 이는 컴파일러가 타입 정보를 추론하여 연관 타입을 결정합니다. 

protocol Container {
    associatedtype Element
    var count: Int { get }
    subscript(i: Int) -> Element { get }
}

struct IntContainer: Container {
    var items = [Int]()
    var count: Int {
        return items.count
    }
    subscript(i: Int) -> Int {
        return items[i]
    }
}

items 배열의 타입이 Int이기 때문에, IntContainer 구조체에서 Element 타입이 Int로 추론됩니다. 이때, Element 타입에 대한 typealias를 정의하지 않아도, IntContainer 구조체에서 Element 타입이 Int로 결정됩니다.

결론

typealias는 기존의 타입에 새로운 이름을 대치하는 용도라고 보면 될것 같습니다.

associatedtype은 프로토콜에서 연관 타입을 선언하는 데 사용됩니다. (제너릭 타입처럼 사용 가능)

 

 

또 만나요!!

반응형