메타타입: 메타타타입타입의타입타타타입 #9
leeinae
started this conversation in
Show and tell
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
Metatype
쏘 심플. 타입의 타입이다.
우리가 쓰는 Int, String, Double 이런 값들은 이미 구현되어있는 struct, class 들을 가져다 쓰는거자나요
모든 언어에는 자료형이 존재하죠.. 이걸 좀 더 풀어서 말해보면 데이터 타입이라는건데
아까 말한 타입의 타입이다 → 데이터 타입의 타입이다 .. 라고 하면 뭔가 더 친절한 늑김
class
Type,struct
Type,protocol
Type을 포함함.우리가 ClassName
.Type
← 이 값들이 바로 클래스나 인스턴스 들의 타입이 되는 값이라는 뜻.class, struct, enum의 타입의 metatype은
.Type
라고 불린다.protocol의 타입은
.Protocol
이 옴.왜 타입의 타입이라고 말하느냐?
Int ← 이런 걸 타입이라고 부르지 (struct, enum, class .... )
Int.Type == Int의 타입임. 이런 타입값을 가지는 타입들을 메타ㅏ타타타ㅏ타입이라고 부르는 거임 ㅜㅜ!!!!!!!!!!!!!!
Swift에서 Type을 얻는 두 가지 방법
.self
static metatype! 컴파일 타임에 결정되는 object의 타입!
type(of:)
dynamic metatype! 런타임에 결정되는 object의 타입!
인스턴스를 알고있을 때, 이 인스턴스가 어떤 타입인지 얻을 수 있는 메소드임.
스위프트 기본 함수인 type(of:) 함수를 통해서 타입의 인스턴스와 함께 호출해 해당 인스턴스의 Dynamic Type (런타임에 동작하는)에 접근할 수 있음.
여기서
type(of:)
로 얻을 수 있는 리턴 타입은 SomeBaseClass.Type인건데값이라기보다 그냥 타입 그 자체임. 그래서 클래스 메소드인 printClassName을 호출할 수 있는 것임
자 그럼 .self
.self는 자기 자신의 타입을 나타낼 수 있게 지정해주는 프로퍼티니까,
이렇게 정의했을 때,‼️
Rocket.self
은Rocket.Type
이라는 거임. 인스턴스 아님→ 타입의 .self는 해당 타입의 타입을 나타낸다고라 ..
글언아..
ClassName.self == Type이라는 뜻인데 이렇게 하면 왜 오류가 나는가
Cannot convert value of type 'SmallRocket.Type.Type' to expected argument type 'SmallRocket.Type'
SmallRocket 타입의 타입은 SmallRocket 타입이 아니다..
이 현상은 마치 arr.append(Int) 와 비슷한 코드를 짠 효과임 :) ㅋㅋ
String은 타입이고, “string”은 instance value인 것처럼
정리해보면, SmallRocket.Type은 타입이고, SmallRocket.self는 metatype의 value라고 보면 됨.
큰 Self
자기 자신의 타입을 가르키는 용어로, 사용할 수 있는 곳이 제한적임.
클래스, 구조체 내에서 본인의 타입을 리턴하거나, 클래스 프로퍼티에 접근할 수 있는 용어!!
.self vs Self
.self - Metatype을 리턴하는 값, 본인의 metatype을 가지는 값을 나타낸다.
Int.self: Int.Type
Self - 자기 자신의 타입을 가리키는 키워드, 사용할 수 있는 곳이 제한적임
Protocol
struct, class와는 다르게 프로토콜의 메타타입은 .Protocol 이라는 키워드로 얻어야함.
.Type
을 할 경우: 해당 프로토콜을 따르는 클래스/구조체의 메타타입을 말함.Protocol
을 할 경우: 진짜 프로토콜의 진짜 메타타입을 말함#1
Cannot convert value of type 'NetworkInterface.Protocol' to specified type 'NetworkInterface.Type’
이봐라. NetworkInterface.Protocol의 값은 .Type의 값이 될 수 없다고 하잔니
그럼 어떻게 고치면 에러를 없앨 수 있을지?
#2
NetworkInterface.Type → 해당 프로토콜을 준수하는 클래스의 타입을 명시하는 것이 되어버림
Self, self, Self.Type에 대한 .. 번역
self
self는 일반적으로 현재 scope에 있는 object에 대한 참조가 필요할 때 사용된다.
예를 들어 struct 내에 있는 인스턴스 메소드에 대해 self를 사용한다면, self는 해당 구조체의 instance가 될 것임
하지만 클래스 인스턴스의 클래스 메소드, 구조체 인스턴스의 static 메소드에서 self를 호출하면 어떻게 될까?
이 경우에 self는 인스턴스가 없고, self가 현재 type에 대한 값 자체이기 때문에 인스턴스에 대한 참조가 될 수 없다.
왤까? static메소드와 클래스 메소드 둘 다 인스턴스가 아닌 type itself로 존재하기 때문임
Meta-types
하지만 모든 값(자료형)은
self
를 포함한 type이라는 값을 가져야 함. static, class 메소드가 type에 존재하므로, 이 경우에는self
자체에Self.Type
의 타입이 있다.예를 들어 Dog.Type은 모든 Dog의 type value를 가지는 거임
다른 유형을 보유하는 유형은 메타 타입으로 불림
쉽게말해서, meta-type
Dog.Type
은 Dog type의 값을 가질 뿐 아니라, 모든 하위 클래스도 포함할 수 있는것임.또한 변수의 어딘가에 저장하거나, 함수 파라미터로 전달할 경우 type 자체를 값으로 사용할 수 있음
Type.self
처럼 사용해서 말임!Self
이것은 항상 현재 context에서의 type을 참조한다. 현재 타입을 편하게 지칭할 수 있는 방법이라고 생각하면 돼!!!!!!!!!!
팩토리 패턴을 만들거나, protocol 메소드에서 concrete type을 반환할 때 유용함
외? 팩토리 패턴에서 타입 의존적이지 않은 코드를 만들 수 있다는 뜻임
해당 글은 해당 아티클을 보고 번역함 난 한국사람이니까 번역 틀리면 머 어쩌라궁
Beta Was this translation helpful? Give feedback.
All reactions