nested class, inner class

sumi Yoo·2022년 9월 23일
0

자바에서는,,

자바에서는 A 클래스 안에 B 클래스를 정의하면 B 클래스는 자동으로 A 클래스의 내부 클래스가 되어서 A 클래스 안의 객체를 참조할 수 있다. 하지만 코틀린에서는 기본적으로 중첩 클래스가 된다. 내부 클래스로 만들고 싶다면 inner 키워드를 사용해서 클래스를 선언해야 한다. 내부 클래스는 기본적으로 외부 클래스를 참조하여 객체에 접근이 가능하지만 중첩 클래스는 그렇지 않다.

이제 코틀린의 코드를 봐보자!

중첩 클래스

class Outer {
    private val bar: Int = 1
    class Nested {
        fun foo() = 2
    }
}

val demo = Outer.Nested().foo() // == 2

Nested() 클래스는 중첩 클래스로 선언했기 때문에 Outer().Nested().foo() 에서 오류가 발생한다. Nested()는 Outer() 클래스의 내부 클래스가 아니기 때문에 참조 불가라는 오류가 발생한다. 그리고 Nested() 클래스는 Outer() 클래스의 내부 클래스가 아니기 때문에 아래처럼 bar 멤버변수에 접근할 수 없다.

class Outer {
    private val bar: Int = 1
    class Nested {
        fun foo() = bar
    }
}

내부 클래스

class Outer {
    private val bar: Int = 1
    inner class Inner {
        fun foo() = bar
    }
}

val demo = Outer.Nested().foo() // == 1

Inner() 클래스는 외부 클래스의 멤버 변수를 참조할 수 있다.

사용하는 이유

그렇다면 왜 사용할까?

내부클래스는 클래스 내에 선언된 클래스로서 두 클래스가 서로 긴밀한 관계에 있기 때문에 사용한다. 서로 관련있는 코드를 묶어서 코드의 캡슐화를 증가시킨다. 외부에서는 내부 클래스에 접근할 수 없기 때문에 코드의 복잡성을 줄일 수 있다.

메모리 누수의 위험성

내부 클래스의 경우 바깥 클래스에 대한 참조를 항상 가지고 있기 때문에 메모리 누수가 발생할 여지가 있다. 바깥 클래스는 더 이상 사용되지 않지만 내부 클래스의 참조로 인해 GC가 수거하지 못해서 바깥 클래스의 메모리 해제를 하지 못하는 경우가 발생할 수 있다.

0개의 댓글

관련 채용 정보