Java & Kotlin 의 inner / nested class

김민재의 잡학사전·2023년 12월 26일

이번 포스트에서는 자바와 코틀린에서 사용하는 inner class, nested class 에 대해 정리해 보겠습니다.

Java

inner class (default)

class Outer {
    private String outer = "Outer";

    class Inner {
        public Inner() {
            // ⭕️ 내부 클래스에서 외부 클래스의 outer 에 접근 가능.
        }
    }
}
  • 자바는 기본적으로 클래스 안에 클래스를 만들면 inner class 로 정의됩니다.
  • inner class 는 outer class 의 필드에 자유롭게 접근 가능합니다.

nested class

class Outer {
    private String outer = "Outer";

    static class Inner {
        public Inner() {
            // ❌ 내부 클래스에서 외부 클래스의 outer 에 접근 불가능.
        }
    }
}
  • nested class 로 변경하려면 static 을 추가해야 합니다.
  • nested class 는 참조하고 있던 outer 의 정보를 가져올 수 없습니다.
class Outer {
    private String outer = "Outer";

    static class Inner {
        public Inner(Outer outerClass) {
            // outerClass.outer 에 접근 가능.
        }
    }
}
  • nested class 에서는 outer class 를 참조하기 위해선 위와 같이 생성자에
    outer 객체를 넘기거나 inner class 로 변경해야 합니다.


Kotlin

nested class (default)

class Outer {
	private val outer = "Outer"

    class Inner {
    	init {
        	// ❌ 내부 클래스에서 외부 클래스의 outer 에 접근 불가능.
    	}
	}
}
  • 코틀린은 기본적으로 클래스 안에 클래스는 Nested class 로 정의됩니다.
  • 자바와 다르게 outer class 에 대한 기본적인 참조를 가지지 않습니다.

inner class

class Outer {
	private val outer = "Outer"

    inner class Inner {
    	init {
			// ⭕️ 내부 클래스에서 외부 클래스의 outer 에 접근 가능.    	
        }
	}
}
  • inner class 로 만들기 위해선 inner 를 추가해야 합니다.
  • nested class 에서 outer class 참조를 위해선 자바와 동일하게 처리할 수 있습니다.



코틀린에서 nested class 가 default 인 이유

  • Inner class 내부에서 Outer class 정보를 보관하고 참조를 해지하지 못하는 경우가 생기면 메모리 누수가 생길 수도 있습니다.
  • 자바는 Inner class 를 허용하기 때문에 Outer를 참조하지 않아도 불필요한 메모리 낭비와 성능 이슈를 가질 수 있습니다.
profile
Android developer

0개의 댓글