티스토리 뷰

Swift

[Swift] AssociatedType이란? typealias란?

ios상우 2023. 3. 29. 15:52

Indetifiable Protocol 프로토콜을 공부하려다 보니 AssoicatedType이 나오더라구요!? 확실히 공부하고 지나갑시다!!

 

 

TypeAlias

우선 typealias를 알아보는게 좋을 것 같더라구요

typealias는 기존에 선언되어있는 타입들에 대한 별칭? 별명을 선언해주어 좀 더 이해하기 쉽거나 가독성있게 해줄 수 있는 키워드이며
아래와 같이 사용합니다.

typealias { 별명 } = existing type { 존재하는 타입 }

굳이? 왜? 라는 생각이 드실까봐 예제를 몇개 꺼내어 볼게요.

typealias Name = String

기존에 존재하는 String타입에 Name이라는 별명을 지어줬습니다.

이렇게 되면 해당 Name이라는 타입을 실제 사용은 String으로 쓸 수 있습니다.

class User {
	let name: Name = "댕우"
}

사실 쓰고 있는 저도 이 부분에서는 아직 그렇게 필요한 지는 모르겠어요!

근데 아래 예제들은 쓸만할 것 같네요!

클로저에서 사용

 

var add: ((Int, Int) -> (Int)) = {
    return $0 + $1
}

위와 같은 클로저 타입을 보다 간결하게 아래처럼 사용할 수 있습니다!

typealias Add = (Int, Int) -> (Int)

var add: Add = {
    return $0 + $1
}

 

프로토콜에서 사용

저희가 CollectionView를 사용하려면 어떻게해야하죠?

UICollectionViewDelegate

 

UICollectionViewDataSource

 

UICollectionViewDelegateFlowLayout

이 세가지 델리게이트를 모두 채택해주어야합니다! 아주아주 길어요! 이 부분에서도 typealias를 이용해 이렇게 가능합니다.

 

 

typealias CollectionViewDelegate = UICollectionViewDelegate & UICollectionViewDataSource & UICollectionViewDelegateFlowLayout

extension ViewController: CollectionViewDelegate {
    ...
}

여기까지 typealias였구요

 

AssociatedType

이제부터 알아볼 associatedType은 typealias랑은 조금 다릅니다.

프로토콜에서 주로 쓰인다고 하는데요 아래 형태로 쓰입니다.

associatedtype { 별명 }   - ①
                        또는
associatedtype { 별명 } : { Protocol } - ②

typealias처럼 존재하는 타입의 별명을 지어 사용할 수 있는 것은 맞는데 선언시에 특정 타입을 지정해 주는것이 아닙니다.

제네릭을 아시나요!? 외부에서 타입을 지정해줌으로써 재사용성을 높이는 방법인데요.

선언할 때 지정하는 것이 아니라 

protocol TestProtocol {
    associatedtype Test
    
    var test: Test { get set }
}

TestProtocol을 채택한 타입에서 test라는 연산 프로퍼티를 꼭 구현해야겠죠?

그 때 test의 값으로 들어오는 값의 자료형! 의 별명이 Test가 되는 것입니다!

위 코드와 같은 경우에서는 만약 test에 정수형 값 ex(1,2,3,4...) 등이 들어간다면 Test는 Int형의 별명이 되는거구요

test에 문자열 값 ex("test","string") 등이 들어간다면 Test는 String의 별명이 되는 겁니다!

 

이해가 되셨을까요!?

 ② 같은 경우에는 Test가 무슨 자료형의 별명이 될지는 아직 모르겠지만 뒤에 있는 프로토콜을 채택하는 자료형이여야해 라는 말입니다.

    associatedtype Test: Equatable

위와 같은 경우에

Test 속성은 Euqatable을 무조건 채택하고 있는 타입의 별명이어야 오류가 안납니다!!

 

이제 알게 되었는데! associatedtype은 Generic의 개념 중 하나라고 하네요!!

 

 

 

«   2025/04   »
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
공지사항
링크
Total
Today
Yesterday