Search
Duplicate

Metatype(.self, .Type)

생성일
2023/09/09 03:35
νƒœκ·Έ
Grammar

Metatype(.self, .Type)

Β Metatype μ΄λž€?

Β Metatype μ΄λž€ νƒ€μž…μ˜ νƒ€μž…μ„ λ‚˜νƒ€λ‚Έλ‹€.

Β Type: νƒ€μž…μ„ λ°›κ³  싢을 λ•Œ μ‚¬μš©

λ¨Όμ € Type에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μž.
λ§Œμ•½
struct Human { static let name = "HJ" var age = 28 }
Swift
볡사
이런 Human μ΄λž€ ꡬ쑰체λ₯Ό λ§Œλ“€κ³ ,
μ•ˆμ— νƒ€μž… ν”„λ‘œνΌν‹°μΈ nameκ³Ό μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹°μΈ ageλ₯Ό μƒμ„±ν•˜μ˜€λ‹€. 호좜 방법은
let HJ = Human.init() Human.name // HJ HJ.age = 28
Swift
볡사
νƒ€μž… ν”„λ‘œνΌν‹°μ˜ 경우 ν˜•μ‹(Type)에 κ΄€λ ¨λœ ν”„λ‘œνΌν‹°λ‘œ νƒ€μž… μ΄λ¦„λ§Œ μ•Œλ©΄ 호좜이 κ°€λŠ₯ν•˜κ³ , μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹°μ˜ 경우 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•΄μ•Όλ§Œ 호좜이 κ°€λŠ₯ν•˜λ‹€.
μ—¬κΈ°μ„œ, Humanμ΄λž€ νƒ€μž… 이름을 λ‚΄κ°€ λͺ¨λ₯Έλ‹€κ³  κ°€μ •ν•˜λ©΄, name을 ν˜ΈμΆœν•  수 μ—†μ„κΉŒ?
β†’ No!, type(of:) λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.
ν•΄λ‹Ή νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μ €μž₯ν•˜λŠ” 게 μ•„λ‹ˆλΌ, ν•΄λ‹Ή νƒ€μž… 자체λ₯Ό μ €μž₯ν•  수 μžˆλ‹€λŠ” 말
let HJType = type(of: HJ) // Human. Type HJType.name // HJ
Swift
볡사
μ΄λ ‡κ²Œ, HJλž€ μΈμŠ€ν„΄μŠ€λ₯Ό type(of:)에 λ„£μœΌλ©΄, λ°”λ‘œ Human νƒ€μž… 자체λ₯Ό λ°˜ν™˜ λ°›μ•„μ„œ μ €μž₯ν•  수 μžˆλ‹€.
λ˜ν•œ, λ°˜ν™˜ λ°›μ•„ μ €μž₯ν•œ HJType μ΄λž€ λ³€μˆ˜λŠ” Human νƒ€μž… 자체이기 λ•Œλ¬Έμ— νƒ€μž… ν”„λ‘œνΌν‹°μΈ name에도 μ ‘κ·Όν•  μˆ˜κ°€ μžˆλ‹€.
μ΄λ•Œ, 이 β€˜νƒ€μž… μžμ²΄β€™ λΌλŠ” 것이 β€˜λ©”νƒ€ νƒ€μž…β€™ 이닀.
Human μ΄λž€ νƒ€μž…μ˜ νƒ€μž… 이닀.
μ²˜μŒμ— HJλž€ λ³€μˆ˜μ—” Human μΈμŠ€ν„΄μŠ€λ₯Ό λ„£μ—ˆλ‹€.
그럼 보톡 HJλž€ λ³€μˆ˜μ˜ νƒ€μž…μ„ μ–˜κΈ°ν•  λ•Œ Human νƒ€μž…μ΄λΌκ³  μ–˜κΈ°ν•œλ‹€.
그럼 μΈμŠ€ν„΄μŠ€κ°€ μ•„λ‹Œ νƒ€μž… 자체λ₯Ό type(of:) λ©”μ„œλ“œλ₯Ό μ΄μš©ν•΄μ„œ μ €μž₯할거라면,
μ΄λ•Œ, νƒ€μž… 자체λ₯Ό λ°˜ν™˜λ°›μ€ HJTypeμ΄λž€ λ³€μˆ˜μ˜ νƒ€μž…μ„ λ˜‘κ°™μ΄ Human νƒ€μž…μ΄λΌκ³  말할 μˆ˜κ°€ μ—†λ‹€. (HJType β‰  Human type)
μ™œλƒν•˜λ©΄ Human νƒ€μž…μ€ Humanμ΄λž€ νƒ€μž…μœΌλ‘œ μƒμ„±ν•œ μΈμŠ€ν„΄μŠ€μ˜ νƒ€μž…μ„ κ°€λ¦¬ν‚€λŠ” 것이기 λ•Œλ¬Έμ΄λ‹€. μΈμŠ€ν„΄μŠ€κ°€ μ•„λ‹ˆλΌ 정말 νƒ€μž… 자체 이기 λ•Œλ¬Έμ΄λ‹€.
μ΄λ•Œ, 이 νƒ€μž… 자체λ₯Ό μ–˜κΈ°ν•˜λŠ” 것이 λ°”λ‘œ 메타 νƒ€μž… 이닀.
HJType은 Humanμ΄λž€ νƒ€μž…μ˜ νƒ€μž…μ΄λ‹€. 즉, Human의 λ©”νƒ€νƒ€μž…μ΄λ‹€. νƒ€μž…μ˜ νƒ€μž… (HJType은 Human의 λ©”νƒ€νƒ€μž…, HJType = Human.Type)

Β μš”μ•½

β€’
Human νƒ€μž… β†’ Human으둜 μƒμ„±ν•œ μΈμŠ€ν„΄μŠ€μ˜ νƒ€μž… (μΈμŠ€ν„΄μŠ€ 멀버 μ‚¬μš© κ°€λŠ₯)
β€’
Human νƒ€μž…μ˜ νƒ€μž…(메타 νƒ€μž…) β†’ Human νƒ€μž… 자체λ₯Ό κ°€λ¦¬ν‚€λŠ” νƒ€μž… (νƒ€μž… 멀버 μ‚¬μš© κ°€λŠ₯)
β†’ λ•Œλ¬Έμ—, λ‹Ήμ—°νžˆ νƒ€μž… 자체λ₯Ό 가리킀기 λ•Œλ¬Έμ—, μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹°μΈ age에 μ ‘κ·Όν•  μˆ˜κ°€ μ—†λ‹€.
HJType.age // Instance member 'age' cannot be used on type 'Human'
Swift
볡사
이제 이 λ©”νƒ€νƒ€μž…μ„ ν‘œμ‹œν•˜λŠ” 단어가 λ°”λ‘œ .Type 이닀.
Human의 λ©”νƒ€νƒ€μž…μ€ λ°”λ‘œ Human.Type 으둜 λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€.
λ©”νƒ€νƒ€μž…μ€ ν•˜λ‚˜μ˜ νƒ€μž…, 즉. μžλ£Œν˜•μ΄λΌκ³  보면 λœλ‹€.
let HJType: Human.Type = type(of: HJ)
Swift
볡사
μ΄λ ‡κ²Œ ν•  수 μžˆλ‹€.
Human.Type은 Human의 λ©”νƒ€νƒ€μž…μœΌλ‘œ,
type(of:)λ₯Ό 톡해 얻은 리턴 κ°’μ˜ νƒ€μž…μ€ Human.Type이닀 라고 λ³Ό 수 μžˆλ‹€.
Human.Type을 μ–΄λ–€ ν•˜λ‚˜μ˜ β€˜κ°’β€™ 이라고 보면 μ•ˆλœλ‹€. 값이 μ•„λ‹Œ Type 이닀.
λ”°λΌμ„œ μœ„μ²˜λŸΌ Type Annotation도 κ°€λŠ₯, μ‹€μ œ νŒŒλΌλ―Έν„°μ˜ νƒ€μž…μ„ λ©”νƒ€νƒ€μž…μœΌλ‘œ μ„ μ–Έν•  μˆ˜λ„ μžˆλ‹€.

Β 1. λ©”νƒ€νƒ€μž…μ€ μ–Έμ œ μ‚¬μš©ν• κΉŒ?

protocol Human { var job: String { get set } init(_ job: String) } struct Teacher: Human { var job: String init(_ job: String) { self.job = job } } struct Student: Human { var job: String init(_ job: String) { self.job = job } }
Swift
볡사
λ§Œμ•½ μœ„μ™€ 같은 Human μ΄λž€ ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•˜λŠ” Teacher, Student ꡬ쑰체가 μžˆμ„ λ•Œ,
λ‹€μŒκ³Ό 같이
func create<T: Human>(type: T.Type) -> T { switch type { case is Teacher.Type: return T.init("teacher") case is Student.Type: return T.init("student") default: fatalError("πŸ₯Š") } }
Swift
볡사
이런 μ‹μœΌλ‘œ typeμ΄λž€ νŒŒλΌλ―Έν„°μ˜ νƒ€μž…μ„ μ œλ„€λ¦­ T νƒ€μž…μ˜ νƒ€μž…, 즉 T의 λ©”νƒ€νƒ€μž…μ„ λ°›μ•„μ„œ ν•΄λ‹Ή νƒ€μž…μ„ μ²΄ν¬ν•˜μ—¬ 각 νƒ€μž…μ— λ§žλŠ” μž‘μ—…μ„ ν•œ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ—¬ λ°˜ν™˜μ‹œν‚¬ μˆ˜λ„ μžˆλ‹€.
그리고 caseλ₯Ό 톡해 Teacher, Studentλž€ νƒ€μž…μ˜ νƒ€μž…, Teacher, Student의 λ©”νƒ€νƒ€μž…κ³Ό 비ꡐλ₯Ό ν•œλ‹€!

Β self: λ©”νƒ€νƒ€μž…μ˜ 값을 μ–»μ–΄λ‚Έλ‹€

createλž€ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœμ‹œν‚€κΈ° μœ„ν•΄μ„œ λ‹€μŒκ³Ό 같이
let hj = create(type: Teacher.Type) // Type 'Teacher.Type' cannot conform to 'Human'
Swift
볡사
create λž€ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœμ‹œν‚€κΈ° μœ„ν•΄μ„œ μ΄λ ‡κ²Œ μž‘μ„±μ„ ν•˜λ©΄, λ°”λ‘œ 였λ₯˜κ°€ λ‚œλ‹€.
μ™œλƒν•˜λ©΄ μœ„ μ½”λ“œλŠ” ν•˜λ‚˜μ˜ μžλ£Œν˜•μ„ νŒŒλΌλ―Έν„° κ°’μœΌλ‘œ 집어 넣은 것이기 λ•Œλ¬Έμ΄λ‹€.
그러면 λ©”νƒ€νƒ€μž…μ„ κ°’μœΌλ‘œ μ–»μ–΄λ‚΄κΈ° μœ„ν•΄μ„œλŠ”? β†’ Β .self
let hj = create(type: Teacher.self)
Swift
볡사
ν•΄λ‹Ή νƒ€μž… 이름에 λŒ€κ³  .selfλ₯Ό ν˜ΈμΆœν•΄μ£Όλ©΄ λœλ‹€.
μ΄λ ‡κ²Œ ν•˜λ©΄ createλž€ λ©”μ„œλ“œκ°€ μ‹€ν–‰λ˜κ³  λ‚œ 후에 hj λž€ λ³€μˆ˜μ— Teacher의 μΈμŠ€ν„΄μŠ€κ°€ λ“€μ–΄κ°€κ²Œ λœλ‹€.

Β 1. Static Metatype VS Dynamic Metatype

self λ₯Ό μ΄μš©ν•΄ λ§Œλ“œλŠ” 것은 Static Metatype 이고,
type(of:) λ₯Ό μ΄μš©ν•΄μ„œ λ§Œλ“œλŠ” 것은 Dynamic Metatype 이닀.
λ‘˜μ˜ 차이점은,
.self λŠ” Static Metatype 이라 컴파일 μ‹œμ μ— νƒ€μž…μ΄ 정해지고,
type(of:) λŠ” Dynamic Metatype 이라 λŸ°νƒ€μž„ μ‹œμ μ— νƒ€μž…μ΄ 정해진닀.
.self λ₯Ό μ΄μš©ν•΄μ„œ λ©”νƒ€νƒ€μž… 값을 μ–»μ–΄λ‚Ό 경우,
Teacher.self.init("")
Swift
볡사
항상 νƒ€μž…μ— λŒ€κ³  μ‚¬μš©ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— static으둜 λ™μž‘ν•œλ‹€.
(λͺ¨λ“  νƒ€μž…μ—λŠ” .selfκ°€ λ“€μ–΄μžˆλ‹€)
let anyType: Any = 10 type(of: anyType) // Int.Type
Swift
볡사
μœ„μ™€ 같이 Any일 경우, 컴파일 μ‹œμ μ—λŠ” νƒ€μž…μ΄ 정해지지 μ•Šκ³  λŸ°νƒ€μž„ μ‹œμ μ— μ •ν•΄μ§€λŠ”λ°, 이 것을 보면 type(of:) λŠ” λŸ°νƒ€μž„ μ‹œμ μ— λ™μž‘μ΄ λœλ‹€λŠ” 것을 확인할 수 μžˆλ‹€.

Β Reference

Swift) Metatype(.self, .Type, .Protocol) μ •λ³΅ν•˜κΈ° (1/2)
μ•ˆλ…•ν•˜μ„Έμš”, μ†Œλ“€μž…λ‹ˆλ‹€ :D μ˜€λŠ˜μ€ λ°”λ‘œ 2μ›” 1일 μ„€λ‚ μ΄λžλ‹ˆλ‹€ 눈 뜨자마자 κ°‘μžκΈ° Metatype ν¬μŠ€νŒ…μ΄ ν•˜κ³  μ‹Άμ–΄μ Έμ„œ ν¬μŠ€νŒ…μ„ ν•˜κ³  μžˆλŠ” μ‚¬λžŒμ΄λΌκ³  λ³Ό 수 μžˆκ² μŠ΅λ‹ˆλ‹€ κ·Έ μžˆμž–μ•„μš” κ°œλ°œν•˜λ‹€κ°€ 보면 self .self Self .Type .Protocol 막 ... μ΄λ ‡κ²Œ... 단어 ν•˜λ‚˜κ°–κ³  μž₯λ‚œμ§ˆμ΄μ—¬;;; 싢은 것듀에 λŒ€ν•΄ μ˜€λŠ˜μ€ 짚고 λ„˜μ–΄κ°€λ³΄λ €κ³  ν•©λ‹ˆλ‹Ή.. ... 쑰금 μƒμ†Œν•˜κ³  μ–΄λ €μš΄ λ‚΄μš©μΌ 수 μžˆμœΌλ‚˜! μ΅œλŒ€ν•œ μ΄ν•΄ν•˜κΈ° μ‰½κ²Œ ν’€μ–΄μ“Έν…Œλ‹ˆ 같이 이해해보렀고 λ…Έλ ₯ν•΄λ΄…μ‹œλ‹€ :) 참고둜 이 ν¬μŠ€νŒ…μ€ νƒ€μž… / μΈμŠ€ν„΄μŠ€ 멀버(ν”„λ‘œνΌν‹°/λ©”μ„œλ“œ)에 λŒ€ν•œ κ°œλ…μ΄ μžˆμ–΄μ•Ό 이해할 수 μžˆκΈ°μ— λ§Œμ•½ λͺ¨λ₯΄μ‹ λ‹€λ©΄ 이 ν¬μŠ€νŒ…μ„ λ¨Όμ € λ³΄κ³ μ˜€μ‹œκΈΈ μΆ”μ²œλ“œλ¦½λ‹ˆλ‹€! λ‚΄μš©μ΄ μ’€ κΈΈμ–΄μ Έμ„œ...; λΆ„λͺ… 1일에 μ“°κΈ° μ‹œμž‘ν–ˆλŠ”λ° λ“±λ‘ν•˜λŠ” λ‚ μ§œλŠ” ..