Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

DOing

[kotlin] 중첩 클래스와 내부 클래스 차이 본문

Java & Kotlin

[kotlin] 중첩 클래스와 내부 클래스 차이

mangdo 2022. 3. 26. 01:01

 코틀린에서 중첩 클래스(Nested Class)와 내부 클래스(Inner Class)를 혼용해서 사용하고 있는 것같다는 느낌을 받게되었고 차이를 명확하게 알아보고자 포스팅하게 되었다.


✏️  중첩 클래스(Nested Class)

 주의해서 볼 것은 클래스 타입이 "바깥 클래스.중첩 클래스"라는 점과 생성자를 호출할때도 "바깥 클래스.중첩 클래스()"라는 점이다.

Nested 클래스는 Nested라는 식별자만 Outer 클래스에 속해있을 뿐, 실제로는(물리적으로는) 완전히 분리된 장소에 있다. 따라서 Nested 클래스의 멤버함수는 Outer 클래스의 프로퍼티나 멤버 함수에 접근할 수 없다.

 

중첩 클래스 인스턴스 메모리 위치

 

✏️  내부 클래스 (Inner Class)

 중첩 클래스의 경우 바깥 클래스의 인스턴스와 중첩 클래스의 인스턴스는 서로 어떠한 프로퍼티나 멤버 함수도 공유하지 않으며 완전히 별개의 클래스로 취급되었다. 중첩 클래스가 단순히 식별자만 속해있는 것이었다면, 내부 클래스는 인스턴스가 바깥 클래스의 인스턴스에 완전히 소속된다. 

 내부 클래스의 인스턴스를 생성하려면, "클래스_이름.생성자()"가 아닌, "참조_변수.생성자()"를 해야한다. 내부 클래스는 바깥 클래스의 인스턴스로부터만 생성할 수 있다. 내부 클래스의 인스턴스는 자신이 속해있는 바깥 클래스의 인스턴스를 가리키는 참조변수(this@Outer)를 내부적으로 가지고 있다. 이러한 특성 때문에 내부 클래스의 인스턴스는 반드시 "바깥_클래스_인스턴스.생성자()"형태로 생성해야한다.

내부 클래스 인스턴스 메모리 위치

 

 

Reference :

초보자를 위한 kotlin 200제(엄민석 저)

kotlin in action(드미트리 제메로프, 스베트라나 이사코바 저)