본문 바로가기
코틀린

코틀린(21) - 중첩 클래스, 내부 클래스

by 왈레 2022. 3. 23.

코틀린에서 지원하는 클래스 유형중에 클래스 안에 클래스가 중첩되는 가지 유형의 클래스를 알아보자.

중첩클래스(Nested Class)

코틀린에서는 기본적으로 클래스 안에 클래스를 하나 넣을 있는 중첩클래스 하나의 클래스가 다른 클래스의 기능과 강하게 연관되어 있다는 의미를 전달하기 위해 만들어진 형식으로 사용할때는 외부클래스 dot 내부 클래스이름으로 사용하게 된다.

Outer.Nested( ) // 중첩클래스 생성자 호출방법

class Outer{
	class Nested{...}
}

*중첩 클래스는 형태만 내부에 존재할 실질적으로는 서로 내용을 직접 공유할 없는 별개의 클래스이다.

 

내부클래스(inner)

중첩클래스 대신 내부클래스라는 것을 사용할 수도 있다.

중첩 클래스에 "inner"라는 키워드를 붙힌 내부클래스는 혼자서 객체를 만들 수 는 없고 외부 클래스의 객체가 있어야만 생성과 사용이 가능한 클래스이다.

*내부클래스는 외부클래스 객체 안에서 사용되는 클래스 이므로 외부 클래스 객체의 속성이나 함수를 사용할 수 있다.

fun main(){
    Outer.Nested().introduce()
    val outer = Outer()
    val inner = outer.Inner()

    inner.introduceInner()
    inner.introduceOuter()

    outer.text = "change Outer class"
    inner.introduceOuter()
}

class Outer{
    var text = "Outer Class"

    class Nested{ // 중첩클래스
        fun introduce(){
            println("Nested Class")
        }
    }

    inner class Inner{ // 내부클래스
        var text = "Inner Class"

        fun introduceInner(){
            println(text) // Inner Class가 출력된다!
        }

        fun introduceOuter(){
            println(this@Outer.text) // Outer Class가 출력된다!
            //Outer 클래스와 inner 클래스에 같은 이름의 속성이나 함수가 있다면 this@바깥클래스이름 으로 참조하면 된다.
        }
    }
}

*출력결과
Nested Class
Inner Class
Outer Class
change Outer class

 

중첩 클래스와 내부 클래스는 클래스간의 연계성을 표현하여 코드의 가독성 작성 편의성이 올라갈 있으므로 적절한 상황에서 사용하는 것이 좋다.

댓글