본문 바로가기

안드로이드/알아두기

[코틀린] inner class(내부 클래스)와 nested class(중첩 클래스)에 대하여

어제 면접을 갔다 왔다. 정말 많은 방면에서 질문이 들어왔다.
다만 나는 준비가 많이 덜 되있고 부족하다는 생각이 들었다. 내가 안해서 부족한걸 어떡하겠는가. 더 열심히 준비해야지
그래서 면접에서 받은 기술면접 질문 중 내가 멍.... 하게 만든 간단(?) 하면서도 나는 솔직하게 몰라서 제대로 대답하지 못한 질문에 대해서 알아볼 것이다.

inner class에 대해서 질문을 받았을 때, 나중에 면접자 분께서 Java에 대해 질문을 하려고 하셨는데, 자바를 잘 모른다고 답해서 해당 질문은 들어오지 않았다. 다만 그 질문이 뭔지 내부 클래스를 찾아보면서 추측할 수 있었다.

자바 프로젝트에서 A 클래스가 있고 B 클래스가 A 클래스 안에 선언되어 있다고 가정해보자. 이렇게 되면 B클래스는 A클래스의 내부 클래스가 되어서 A클래스 안의 객체를 참조할 수 있게 된다.

이것과 반대로 코틀린에서는 A 클래스 내부에 B 클래스가 아무 키워드 없이 class라는 키워드만으로 선언된다면 B클래스는 A클래스의 객체를 참조할 수 없다. 대신 inner 라는 키워드를 사용하여 B 클래스가 A클래스의 내부 클래스로 선언되면, B클래스에서는 A클래스의 객체를 참조할 수 있게 된다. 아래 코드 블록은 간단한 예시이다. 그리고 그 밑에 사진은 내부 클래스에서는 상위 클래스의 객체를 읽을 수 있고, 중첩 클래스에서는 상위 클래스의 객체를 읽을 수 없는 것을 볼 수 있다.

 class AnotherMotherClass { private val canRead: Boolean = true class SonClass { fun temp() = "Can't Read Instance $canRead" } inner class AnotherSonClass { fun printMotherInstance() = "Can read Mother's Instance value : $canRead" } }