ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Kotlin] Generic, Inner 클래슀
    Android/Kotlin 2021. 7. 7. 01:09
    λ°˜μ‘ν˜•
    • 이 글은 "μœ€μž¬μ„±μ˜ Google 곡식 μ–Έμ–΄ Kotlin" κ°•μ˜λ₯Ό λ“£κ³  κ³΅λΆ€ν•œ λ‚΄μš©μœΌλ‘œ μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

    Generic 클래슀

    • 클래슀λ₯Ό 섀계할 λ•Œ 같은 역할을 ν•˜μ§€λ§Œ λ‚΄λΆ€μ˜ λ³€μˆ˜μ˜ νƒ€μž…λ§Œ λ‹€λ₯΄κ²Œ ν•„μš”ν•  λ•Œκ°€ μžˆμŠ΅λ‹ˆλ‹€.
    • Generic 클래슀λ₯Ό ν™œμš©ν•˜μ—¬ 클래슀 μž‘μ„± μ‹œκ°€ μ•„λ‹Œ 객체λ₯Ό μƒμ„±μ‹œμ— νƒ€μž…μ„ 지정할 수 μžˆμŠ΅λ‹ˆλ‹€.
    • Generic을 μ‚¬μš©ν•˜λ©΄ 데이터 νƒ€μž…μ„ 컴파일 νƒ€μž„μ— μ •ν•˜κΈ° λ•Œλ¬Έμ— ν΄λž˜μŠ€λ‚˜ λ©”μ†Œλ“œ λ‚΄λΆ€μ˜ μ‚¬μš©λ  λ°μ΄ν„°μ˜ νƒ€μž… μ•ˆμ •μ„±μ„ 높일 수 μžˆμŠ΅λ‹ˆλ‹€.
    • λŒ€ν‘œμ μΈ 예둜 Collection 듀은 λͺ¨λ‘ Generice 클래슀둜 μ •μ˜λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
    • 만일 Any 클래슀둜 μΊμŠ€νŒ…ν•΄μ„œ μ‚¬μš©ν•œλ‹€λ©΄ 번거둭고 잘λͺ»λœ μΊμŠ€νŒ…μœΌλ‘œ λŸ°νƒ€μž„μ— 였λ₯˜ λ°œμƒ κ°€λŠ₯성이 있기 λ•Œλ¬Έμ— Generic을 μ‚¬μš©ν•˜μ—¬μ•Ό ν•©λ‹ˆλ‹€.
    class ArrayList<T>(val param : T){
        fun print(){
            when(param){
                is String -> {
                    println("ArrayList element's Type is String : $param")
                }
                is Int -> {
                    println("ArrayList element's Type is Int : $param")
                }
                is Double -> {
                    println("ArrayList element's Type is Double : $param")
                }
                else -> {
                    println("ArrayList element's Type is Any")
                }
            }
        }
    }
    
    fun main(){
        val intArr = ArrayList(3)
        val stringArr = ArrayList("hello")
        val doubleArr = ArrayList(3.3)
    
        intArr.print()
        stringArr.print()
        doubleArr.print()
    
        /** result
        ArrayList element's Type is Int : 3
        ArrayList element's Type is String : hello
        ArrayList element's Type is Double : 3.3
        **/
    }
    • μ˜ˆμ œμ—μ„œ μ‚¬μš©λœ Tλ₯Ό νƒ€μž… λ³€μˆ˜λΌκ³  ν•˜λ©°, μž„μ˜μ˜ μ°Έμ‘°ν˜• νƒ€μž…μ„ μ˜λ―Έν•©λ‹ˆλ‹€. νƒ€μž…μ˜ λ§€κ°œλ³€μˆ˜ μ΄λ¦„μ—λŠ” μ•„λ¬΄κ±°λ‚˜ 듀어가도 μƒκ΄€μ—†μ§€λ§Œ κ³΅μ‹λ¬Έμ„œμ˜ Name Convention을 λ”°λ₯΄λŠ”κ²Œ μ’‹μŠ΅λ‹ˆλ‹€. [https://math-coding.tistory.com/184]
    • Generic은 ν΄λž˜μŠ€μ™€ λ©”μ†Œλ“œλ₯Ό 이외에도 μΈν„°νŽ˜μ΄μŠ€μ—λ„ μ‚¬μš©μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.

     

    κ°€λ³€μ„±

    • λΆˆλ³€μ„± : Generic이 μ„€μ •λœ 객체의 μ£Όμ†Œ κ°’μ—λŠ” μžμ‹ ν΄λž˜μŠ€λ‚˜ λΆ€λͺ¨ν΄λž˜μŠ€κ°€ μ•„λ‹Œ μ„€μ •λœ 같은 νƒ€μž…μ˜ λ³€μˆ˜μ—λ§Œ 담을 수 μžˆμŠ΅λ‹ˆλ‹€. (λ‹€ν˜•μ„± x)
    • 곡변성 : Generic이 μ„€μ •λœ 객체의 μ£Όμ†Œ 값에 out ν‚€μ›Œλ“œλ₯Ό 톡해 λΆ€λͺ¨ 클래슀 νƒ€μž…μ˜ λ³€μˆ˜μ— 담을 수 μžˆμŠ΅λ‹ˆλ‹€. (μžλ°”μ˜ bounded Type μœ μ‚¬)
    • 반 곡변성 : Generic이 μ„€μ •λœ 객체의 μ£Όμ†Œ 값에 in ν‚€μ›Œλ“œλ₯Ό 톡해 μžμ‹ 클래슀 νƒ€μž…μ˜ λ³€μˆ˜μ— 담을 수 μžˆμŠ΅λ‹ˆλ‹€.
    open class TestClass
    open class TestSubClass : TestClass()
    class TestSubSubClass : TestSubClass()
    
    class GenericClass<T>
    class GenericClass2<out T>
    class GenericClass3<in T>
    
    fun main(){
        // λΆˆλ³€μ„±
        val cls1: GenericClass<TestSubClass> = GenericClass<TestSubClass>()
        val cls2: GenericClass<TestSubSubClass> = GenericClass<TestSubClass>()    // Compile error
        val cl3: GenericClass<TestClass> = GenericClass<TestSubClass>()  // Compile error
    
        // 곡변성
        val cls4: GenericClass2<TestSubClass> = GenericClass2<TestSubClass>()
        val cls5: GenericClass2<TestSubSubClass> = GenericClass2<TestSubClass>()    // Compile error
        val cls6: GenericClass2<TestClass> = GenericClass2<TestSubClass>()
    
        // 반 곡변성
        val cls7: GenericClass3<TestSubClass> = GenericClass3<TestSubClass>()
        val cls8: GenericClass3<TestSubSubClass> = GenericClass3<TestSubClass>()   
        val cls9: GenericClass3<TestClass> = GenericClass3<TestSubClass>()      // compile error
    }
    • λΆˆλ³€μ„± μ˜ˆμ œμ—μ„œλŠ” μ œλ„ˆλ¦­ νƒ€μž…μ— μ„€μ •λœ νƒ€μž… λ³€μˆ˜λ₯Ό μ œμ™Έν•˜κ³ λŠ” λΆ€λͺ¨ ν΄λž˜μŠ€λ“  μžμ‹ 클래슀 λͺ¨λ‘ 컴파일 μ—λŸ¬κ°€ λ‚˜νƒ€λ‚œ 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.
    • 곡변성 μ˜ˆμ œμ—μ„œλŠ” μ œλ„ˆλ¦­ νƒ€μž…μ— μ„€μ •λœ νƒ€μž… λ³€μˆ˜μ™€ μ„€μ •λœ νƒ€μž…μ˜ μžμ‹ ν΄λž˜μŠ€κΉŒμ§€ ν¬ν•¨ν•˜μ—¬ λŒ€μž…μ΄ λ˜λŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. out ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ”λ° ν—·κ°ˆλ¦¬μ‹œλ‹€λ©΄, Tκ°€ outν•˜λŠ” 클래슀(λ‚΄λ³΄λ‚΄λŠ” 클래슀)λŠ” λΆ€λͺ¨ ν΄λž˜μŠ€λ‘œλΆ€ν„° μžμ‹ν΄λž˜μŠ€κ°€ out되기 λ•Œλ¬Έμ— κ·Έλ ‡κ²Œ μ΄ν•΄ν•˜μ‹œλ©΄ νŽΈν•  것 κ°™μŠ΅λ‹ˆλ‹€.
    • 반 곡변성 μ˜ˆμ œμ—μ„œλŠ” μ œλ„ˆλ¦­ νƒ€μž…μ— μ„€μ •λœ νƒ€μž… λ³€μˆ˜μ™€ μ„€μ •λœ νƒ€μž…μ˜ λΆ€λͺ¨ 클래슀λ₯Ό ν¬ν•¨ν•˜μ—¬ λŒ€μž…μ΄ λ˜λŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. in ν‚€μ›Œλ“œλŠ” Tκ°€ inν•˜λŠ” 클래슀(ν¬ν•¨ν•˜λŠ” 클래슀)λŠ” μžμ‹ ν΄λž˜μŠ€μ—λŠ” λΆ€λͺ¨ν΄λž˜μŠ€λ₯Ό ν¬ν•¨ν•˜κΈ° λ•Œλ¬Έμ— λΆ€λͺ¨ 클래슀λ₯Ό 포함할 수 μžˆλ‹€κ³  μƒκ°ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€.

     

    쀑첩 클래슀

    • 클래슀 μ•ˆμ— μƒˆλ‘­κ²Œ μƒμ„±λœ 클래슀λ₯Ό 쀑첩 클래슀라고 λΆ€λ¦…λ‹ˆλ‹€.
    • 쀑첩 ν΄λž˜μŠ€λŠ” μ™ΈλΆ€ 클래슀의 멀버 λ³€μˆ˜λ₯Ό μ‰½κ²Œ 접근이 κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— μ™ΈλΆ€ 클래슀의 멀버 λ³€μˆ˜λ₯Ό 많이 μ‚¬μš©ν•˜κ²Œ λ˜λŠ” 섀계λ₯Ό ν•˜μ‹€ λ•Œ 쀑첩 클래슀λ₯Ό μ‚¬μš©ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€.
    • 쀑첩 ν΄λž˜μŠ€μ—μ„œλŠ” 각 ν΄λž˜μŠ€μ— μ •μ˜ν•œ 멀버λ₯Ό μ‚¬μš©ν•  수 μžˆλŠ”κ°€λ₯Ό μ •ν™•ν•˜κ²Œ μˆ™μ§€ν•  ν•„μš”κ°€ μžˆμŠ΅λ‹ˆλ‹€.
    class OuterClass{
        val outerMember = 100
    
        fun outerMethod(){
            println("OuterMethod $outerMember")
        }
    
        inner class InnerClass{
            val innerMember = 200
    
            fun innerMethod(){
                println("innerMethod $innerMember")
                println("outmember $outerMember")
                outerMethod()
            }
        }
    }
    
    fun main(){
        var cls = OuterClass()
        var innercls = cls.InnerClass()
        cls.outerMethod()
        innercls.innerMethod()
    }
    • inner ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 쀑첩 클래슀λ₯Ό μ •μ˜ν•  수 있고, inner classλŠ” 무쑰건 outerclass의 객체λ₯Ό ν†΅ν•΄μ„œλ§Œ 생성할 수 μžˆμŠ΅λ‹ˆλ‹€. 즉, inner 클래슀λ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” outerclassλ₯Ό 생성해야 ν•©λ‹ˆλ‹€.
    • inner ν΄λž˜μŠ€λŠ” outer ν΄λž˜μŠ€κ°€ μƒμ„±λœ 이후에 생성이 되기 λ•Œλ¬Έμ— outer ν΄λž˜μŠ€μ— μžˆλŠ” 멀버 λ³€μˆ˜μ™€ λ©”μ†Œλ“œ λͺ¨λ‘ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • outer ν΄λž˜μŠ€μ—μ„œλŠ” inner 클래슀 λ‚΄λΆ€μ˜ 멀버 λ³€μˆ˜, λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•  수 μ—†λŠ”λ° outer 클래슀만 생성 μ‹œμ— inner ν΄λž˜μŠ€λŠ” 생성이 된 것이 μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— μ ‘κ·Όν•  수 μ—†λŠ” 것이 λ‹Ήμ—°ν•©λ‹ˆλ‹€.
    • 만일 outer ν΄λž˜μŠ€μ—μ„œ inner 클래슀의 멀버 λ³€μˆ˜μ™€ λ©”μ†Œλ“œμ— μ ‘κ·Όν•˜κ³  μ‹Άλ‹€λ©΄, 직접 inner 클래슀λ₯Ό μƒμ„±ν•œ ν›„ 객체λ₯Ό ν†΅ν•΄μ„œ μ ‘κ·Όν•˜λ©΄ λ©λ‹ˆλ‹€.
    λ°˜μ‘ν˜•
Designed by Tistory.