Coding Memo

Kotlin 중첩 / 내부 클래스 본문

Language/Kotlin

Kotlin 중첩 / 내부 클래스

minttea25 2021. 1. 8. 13:48

 

코틀린은 Java와 100% 호환되는 언어이므로 클래스 안에 클래스가 있는 형태가 가능하다.

마찬가지로 중첩 클래스와 내부 클래스가 있다.


중첩 클래스 (Nested Class)

 

중첩 클래스는 그 클래스를 포함하고 있는 외부 클래스의 변수나 함수를 공유할 수 없다.

즉, 외부 클래스 안에 있는 중첩 클래스지만 실제적으로는 다른 클래스로 봐도 될 것 같다.

다만 사용은 (외부 클래스 명).(중첩 클래스 명)으로 외부 클래스를 참조하여 사용한다.

 

형식은 단순히 클래스 안에 다시 클래스를 선언하는 형식이다.

 

fun main() {
    OuterClass().printOuter()
    println(OuterClass().a)

    OuterClass.NestedClass().printNested()
    println(OuterClass.NestedClass().a)
}

class OuterClass {
    var a: String = "OuterClassProperty"
    fun printOuter() {
        println(a)
    }

    class NestedClass {
        var a: String = "NestedClassProperty"
        fun printNested() {
            println(a)
            //println(this@OuterClass.a) <- Nested Class에서는 불가
        }
    }
}

Nested Class 예시 출력 결과

NestedClass를 참조하려면 OuterClass를 통해 참조해야 하고 그 안에 있는 속성도 마찬가지이다.

NestedClass에서 OuterClass의 속성을 참조는 this@OuterClass.a 로 할 수 없다.


내부 클래스 (Inner Class)

 

내부 클래스는 중첩 클래스와 달리 외부 클래스의 자원(속성, 함수)을 사용할 수 있다.

아래 형식을 이용한다.

 

this@(외부 클래스 명).(참조할 자원)

 

따라서 외부클래스를 통해 참조할 때는 외부 클래스가 생성이 되어야만 한다.

형식은 클래스 안에 다시 클래스를 선언하는 형식이지만 추가적으로 내부 클래스에는 inner라는 키워드가 붙는다.

fun main() {
    OuterClass().InnerClass().printInner()
    OuterClass().InnerClass().printOuter()
    OuterClass().InnerClass().printOuter2()

    val outer = OuterClass()
    val inner = outer.InnerClass()
    inner.changeOuterA("changed")
    outer.printOuter()
}

class OuterClass {
    var a: String = "OuterClassProperty"
    fun printOuter() {
        println(a)
    }

    inner class InnerClass {
        var a: String = "InnerClassProperty"

        fun printInner() {
            println(a)
        }

        fun printOuter() {
            println(this@OuterClass.a)
        }

        fun printOuter2() {
            this@OuterClass.printOuter()
        }

        fun changeOuterA(str: String) {
            this@OuterClass.a = str
        }
    }
}

Inner Class 예시 출력 결과

참조를 통해 값을 변경 할 수 도 있다. (changeOuterA() 함수)

 

참고: OuterClass를 생성을 안 하고 했을 경우 (Nested Class에서는 아래 방법이 가능했다.)


중첩 클래스와 내부 클래스는 컴파일 시 '$'로 구분되어 파일 명이 생성된다.

 

'Language > Kotlin' 카테고리의 다른 글

Kotlin 데이터 클래스  (0) 2021.01.08
Kotlin 열거형 클래스  (0) 2021.01.08
Kotlin 함수 파라미터  (0) 2021.01.06
Kotlin null 값  (0) 2021.01.06
Kotlin 제네릭  (0) 2021.01.06