ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Swift] Metatype μ΄λž€?
    iOS/🟠 Swift 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

     

    λŒ“κΈ€

μ–΄μ œλ³΄λ‹€ λ°œμ „ν•œ λ‚˜