iOS/🟠 Swift

[Swift] Metatype μ΄λž€?

woozzang 2021. 10. 2. 21:47

μ•ˆλ…•ν•˜μ„Έμš”πŸΆ

이번 μ‹œκ°„μ—λŠ” λ©”νƒ€νƒ€μž…μ— λŒ€ν•΄μ„œ μ•Œμ•„λ³΄λ €κ³  ν•©λ‹ˆλ‹€.

그럼 μ‹œμž‘ν•΄λ³Όκ²Œμš”!!πŸ”₯

 


 

λ©”νƒ€νƒ€μž… : νƒ€μž…μ˜ νƒ€μž…

 

λ©”νƒ€νƒ€μž…μ€ νƒ€μž…μ˜ νƒ€μž…μž…λ‹ˆλ‹€.

이 νƒ€μž…μ—λŠ” class, structure, enumeration, protocol νƒ€μž…μ„ ν¬ν•¨ν•©λ‹ˆλ‹€.

 

μ•„λ‹ˆ 그러면 String 은 νƒ€μž…μΈλ° 그럼 λ©”νƒ€νƒ€μž…μ€ String 의 νƒ€μž…μ΄λΌλŠ” κ±΄κ°€μš”?

 

λ§žμŠ΅λ‹ˆλ‹€. 그리고 String 의 νƒ€μž…μ€ String.Type μž…λ‹ˆλ‹€!!! γ…‹γ…‹γ…‹

 

μ²˜μŒμ—λŠ” 이 κ°œλ…μ„ μ΄ν•΄ν•˜κΈ° 쉽지 μ•ŠλŠ”λ°μš”.

 

λ©”νƒ€νƒ€μž…μ€ νƒ€μž… 자체λ₯Ό κ°€λ¦¬μΌœμ•Όν•  경우 (refer to)κ°€ 있기 λ•Œλ¬Έμ— λ§Œλ“€μ–΄μ‘ŒμŠ΅λ‹ˆλ‹€.

그리고 사싀 μš°λ¦¬λŠ” μ§€κΈˆκΉŒμ§€ λ©”νƒ€νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€μΈ [νƒ€μž…]을 잘 μ‚¬μš©ν•΄μ˜€κ³  μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

 

그건 λ‚˜μ€‘μ— λ³΄λ„λ‘ν•˜κ³ 

μš°μ„  μ œκ°€ λ§Œλ“  κ·Έλž˜ν”„λ₯Ό ν•œλ²ˆ λ³΄μ—¬λ“œλ¦΄κ²Œμš”.

이해가 잘 μ•ˆκ°€μ‹œλ‚˜μš”? 그럼 계속 글을 μ΄μ–΄λ‚˜κ°€λ³Όκ²Œμš”πŸ˜€


 

νƒ€μž…μ€ λ©”νƒ€νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€μ΄λ‹€

 

이 κ°œλ…λ§Œ μ΄ν•΄ν•˜λ©΄ λ©”νƒ€νƒ€μž…μ€ λλ‚©λ‹ˆλ‹€.

 

 UIKit μ—μ„œ κ΅¬ν˜„λœ λ©”νƒ€νƒ€μž…μ„ μš”κ΅¬ν•˜λŠ” λ©”μ„œλ“œλ“€μ„ μΆ©λΆ„νžˆ μ΄ν•΄ν•˜κ³  μ‚¬μš©ν•  수 있게 λ©λ‹ˆλ‹€.

λ©”νƒ€νƒ€μž…μ„ μ΄μš©ν•œ κ΅¬ν˜„μ€ 이후에 천천히 μ‹€μ²œν•΄λ³΄λ©΄ 되겠죠???

 

μš°μ„  λ‹€μŒ μ½”λ“œλ₯Ό λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

let myClass:  MyClass  =  MyClass.init()

 

myClass λΌλŠ” μƒμˆ˜λŠ” MyClass λΌλŠ” νƒ€μž…μ΄λΌκ³  μ„ μ–Έλ˜μžˆκΈ° λ•Œλ¬Έμ—

 MyClass νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό λ„£μ–΄ μ£Όμ—ˆμŠ΅λ‹ˆλ‹€.

 

μš°λ¦¬λŠ” 이미 이 κ·œμΉ™μ„ μ΄ν•΄ν•˜κ³  잘 μ‚¬μš©ν•˜κ³  μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

κ·Έλ ‡λ‹€λ©΄ λ‹€μŒ λ©”μ„œλ“œλŠ” μ–΄λ–€κ°€μš”?

 

 

instance λΌλŠ” μ΄λ¦„μ˜ argurment 에 Myclass νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό 넣어주어야함은 자λͺ…ν•©λ‹ˆλ‹€.

 

그럼 λ©”νƒ€νƒ€μž…μ΄λΌκ³  μ„ μ–Έλœ λ³€μˆ˜λ‚˜ μƒμˆ˜, 그리고 λ©”νƒ€νƒ€μž…μœΌλ‘œ μ„ μ–Έλœ μ „λ‹¬μΈμžλŠ” μ–΄λ–€κ°€μš”??

λ©”νƒ€νƒ€μž… μΈμŠ€ν„΄μŠ€λ₯Ό λ„£μ–΄μ£Όλ©΄ λ˜κ² λ„€μš”!

 

μ•„κΉŒ μœ„μ—μ„œλ³Έ κ·Έλž˜ν”„λ₯Ό λ‹€μ‹œ λ³ΌκΉŒμš”?

 

였~ νƒ€μž…μ€ λ©”νƒ€νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€κ΅°μš”!

그럼 λ‹€μŒ μ½”λ“œμ—μ„œ 였λ₯Έμͺ½ ν‘œν˜„μ‹μœΌλ‘œ 무엇이 λ“€μ–΄κ°€μ•Όν•˜λŠ”μ§€λŠ” ν•œλ²ˆ λ§žμΆ°λ³ΌκΉŒμš”?

???? μ—λŠ” MyClass.self κ°€ λ“€μ–΄κ°€λ©΄ λ©λ‹ˆλ‹€.

λ©”νƒ€νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό λ„£μ–΄μ£Όμ–΄μ•Όν•˜λ‹ˆκΉŒμš”!


 

MyClass 와  MyClass.self 의 차이

 

그러면 이런 ꢁ금증이 μƒκΈΈμˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

μ•„λ‹ˆ MyClass κ°€ νƒ€μž… μ•„λ‹Œκ°€μš”???

뒀에 .self λŠ” μ™œ λΆ™μ—¬μ•Όν•˜λ‚˜μš”???

 

 MyClass λŠ” νƒ€μž… λ„€μž„ (type name)이지, νƒ€μž… 였브젝트 (type object) λŠ” μ•„λ‹™λ‹ˆλ‹€.

λ©”νƒ€νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€κ°€ μ•„λ‹ˆλΌλŠ” 뜻이죠!

 

MyClass λ§ŒμœΌλ‘œλŠ” νƒ€μž… 였브젝트λ₯Ό ν‘œν˜„ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

 

κ·ΈλŸΌμ—λ„ λΆˆκ΅¬ν•˜κ³  μ»΄νŒŒμΌλŸ¬κ°€ μ˜ˆμ™Έμ μœΌλ‘œ ν—ˆμš©ν•΄ μ£ΌλŠ” μ»¨ν…μŠ€νŠΈκ°€ μžˆμŠ΅λ‹ˆλ‹€.

λ°”λ‘œ 멀버에 μ ‘κ·Όν•  λ•Œ μΈλ°μš”.

μš°λ¦¬λŠ” μŠ€νƒœν‹±, 클래슀 멀버λ₯Ό μ ‘κ·Όν•  λ•Œ .(dot Syntax) λ₯Ό μ΄μš©ν•΄μ„œ 잘 μ ‘κ·Όν•΄ μ™”μŠ΅λ‹ˆλ‹€.

 

λ”°λΌμ„œ μ•„λž˜μ™€ 같은 μ½”λ“œλŠ” 컴파일 μ—λŸ¬κ°€ λœ¨μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

 

두 μ½”λ“œλŠ” μ •ν™•νžˆ λ™μΌν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

 

첫번째 μ½”λ“œλŠ” μ»΄νŒŒμΌλŸ¬κ°€ ν—ˆμš©ν•΄μ£ΌλŠ” νƒ€μž… λ„€μž„ (MyClass) μ„ 톡해 멀버에 μ ‘κ·Όν•˜κ³ ,

λ‘λ²ˆμ§Έ μ½”λ“œλŠ” νƒ€μž… 였브젝트 (MyClass.self) λ₯Ό 톡해 멀버에 μ ‘κ·Όν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

 

μ΄μ™Έμ˜ κ²½μš°μ—λŠ” νƒ€μž… λ„€μž„μ„ μ‚¬μš©ν•˜μ§€ λͺ»ν•©λ‹ˆλ‹€.

λ”°λΌμ„œ λ‹€μŒ μ½”λ“œλŠ” 컴파일 μ—λŸ¬κ°€ λ°œμƒν•©λ‹ˆλ‹€.

 

μ—λŸ¬ λ©”μ‹œμ§€ λ‚΄μš©

 

λ©”νƒ€νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€, νƒ€μž… 였브젝트인 MyClass.self λ₯Ό μ „λ‹¬ν•΄μ£Όμ„Έμš”πŸ‘πŸ»


 

Protocol 의 λ©”νƒ€νƒ€μž…

 

The metatype of a protocol type—not the concrete type that conforms to the protocol at runtime—is the name of that protocol followed by .Protocol.

 

.Type 으둜 λ©”νƒ€νƒ€μž…μ„ ν‘œν˜„ν–ˆλ˜ κΈ°μ‘΄ νƒ€μž…λ“€κ³ΌλŠ” λ‹€λ₯΄κ²Œ

 ν”„λ‘œν† μ½œμ˜ νƒ€μž…μ€ .Protocol 둜 ν‘œν˜„ν•©λ‹ˆλ‹€.

 

 

그리고 ν”„λ‘œν† μ½œμ—μ„œ .Type 은 ν•΄λ‹Ή ν”„λ‘œν† μ½œμ„ μ±„νƒν•œ νƒ€μž…μ˜ λ©”νƒ€νƒ€μž…μ„ κ°€λ¦¬ν‚΅λ‹ˆλ‹€.


 

μ–΄λ””μ—μ„œ ν™œμš©ν•  수 μžˆμ„κΉŒ?

 

metatype allows you to use all of that type's class properties and methods, including init():

μš°λ¦¬λŠ” λ©”νƒ€νƒ€μž… μΈμŠ€ν„΄μŠ€λ₯Ό ν†΅ν•΄μ„œ μŠ€νƒœν‹±, 클래슀 멀버와 μƒμ„±μžλ₯Ό 호좜 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

단, μƒμ„±μžλŠ” λ°˜λ“œμ‹œ required μƒμ„±μžλ₯Ό ν˜ΈμΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

λ‹€μŒμ€ BlogPost λΌλŠ” 클래슀λ₯Ό μƒμ†ν•œ μ œλ„€λ¦­ λ©”νƒ€νƒ€μž…μ„ μ‚¬μš©ν•œ νŒ©ν† λ¦¬ μž…λ‹ˆλ‹€.

 

μ§œμ—¬μ§„ μ½”λ“œλ₯Ό μ΄ν•΄ν• μˆ˜λŠ” μžˆμ§€λ§Œ, μ΄λ ‡κ²Œ 짜라고 ν•˜λ©΄ 아직은 어색할 것 κ°™λ„€μš”;;;;

 

https://swiftrocks.com/whats-type-and-self-swift-metatypes

 

 

 

 

μ˜€λŠ˜λ„ λ‚˜λŠ” μ„±μž₯ν–ˆλ‹€!!!✊🏻


πŸ€–πŸŸ’[우짱의 iOS λΈ”λ‘œκ·Έ]πŸ”΅πŸ’»

iOSλ₯Ό κ³΅λΆ€ν•˜λ©΄μ„œ 배운 λ‚΄μš©μ„ κΈ°λ‘ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

 

참고자료:

https://docs.swift.org/swift-book/ReferenceManual/Types.html

https://swiftrocks.com/whats-type-and-self-swift-metatypes