개발자의 생활

중첩 클래스, 내부클래스 본문

kotlin

중첩 클래스, 내부클래스

Developer성현 2025. 9. 8. 00:11

Kotlin 에서도 중첩 클래스와 내부클래스 를 사용할 수 있습니다

 

중첩 클래스 는 클래스 내부에 또다른 클래스를 포함시키는 것입니다. 중첩 클래스는 큰 범위에 속하는 개념으로 내부적으로 다양한 방식이 존재합니다.

 

1. 중첩 클래스

fun main(){
    val inClass = OutClass.InClass("중첩 클래스")

    inClass.inClassPrint()
}

class OutClass(
){

    class InClass(
        private var inValue: String
    ){
        fun inClassPrint(){
            println(inValue)
        }
    }
}

Kotlin 에서 중첩 클래스를 만드는 방법은 아주 간단합니다. 클래스 내부에 동일한 방법으로 클래스를 하나 더 만들어 주면 됩니다.

간단하긴 해도 내부적으로 조금 더 들어가 보겠습니다.

 

중첩 클래스는 외부클래스에 종속되어 있지 않기 때문에 독립적으로 사용할 수 있습니다. 즉 사용할 때는 외부클래스 의 객체를 생성할 필요없이 독립적으로 객체를 생성할 수 있습니다.

다만 외부 클래스와는 연결할 수 없습니다.

 

중첩 클래스를 사용하는 이유

이는 하나의 기능을 담당하는 A 라는 클래스가 특별한 기능을 담당하는 B라는 클래스와 강하게 연결되어 있으면서도 B 클래스는 다른 클래스와는 연관성이 전혀 없는 경우 A클래스 내부에 만들어서 연관성을 강하게 나타내기 위함 입니다.

 

2. 내부 클래스

내부 클래스는 static 이 없는 클래스 입니다. 즉 외부 클래스와 강하게 종속 되어 있다는 것입니다.

그래서 내부클래스 를 만들때는 외부클래스의 인스턴스가 반드시 필요합니다.

 

그럼 Kotlin 에서 내부클래스 를 만드는 방법은 클래스 앞에 inner 키워드를 붙여주면 됩니다.

 

실제 코드로 보겠습니다

fun main(){
    val outClass = OutClass("외부 클래스")
    val inClass = outClass.InClass()

    inClass.inClassPrint()
}

class OutClass(
    private var outValue: String
){

    inner class InClass(
    ){
        fun inClassPrint(){
            println(this@OutClass.outValue)
        }
    }
}

inner 을 붙여주면 컴파일 시 static 없이 클래스만 그대로 생성됩니다.

그러면 위에서 말씀드렸다 싶히 외부 클래스와 강하게 종속되기 때문에 외부 클래스의 필드 와 메서드에 접근할 수 있습니다.

그런데 접근하는 방법이 조금 특이합니다. this@외부클래스명.필드명( this@외부클래스명.메소드명 ) 으로 접근해야 합니다.

 

사용할때는 객체를 생성한 뒤 인스턴스를 통해 내부클래스 의 객체를 만들어야 합니다.

 

내부클래스의 위험성

Kotlin 은 기본적으로 내부 클래스는 외부 클래스 를 참조하지 못하게 되어 있습니다. 

이는 메모리 누수 를 방지하기 위함 입니다.

메모리 누수가 발생하는 이유는 내부클래스가 외부 클래스의 인스턴스와 연결하고 있기 때문에 외부클래스가 필요가 없어지더라도 내부클래스가 살아있다면 GC가 외부클래스 를 정리하지 못하게 되기 때문입니다.

 

 

사실 중첩클래스와 내부클래스 는 많이 사용되지 안는다고 합니다. 그래서 저도 간단하게만 공부하고 넘어가겠습니다.

'kotlin' 카테고리의 다른 글

Enum Class  (0) 2025.09.14
data class  (2) 2025.09.12
object 키워드(정적 변수, 정적 함수)  (1) 2025.08.31
상속  (1) 2025.08.22
class(클래스)  (4) 2025.08.14