daehwan2yo / dig-up-kotlin

1 stars 0 forks source link

kotlin inner class and nested class #5

Open daehwan2yo opened 1 year ago

daehwan2yo commented 1 year ago

Test 를 구성하고 있는데, @ Nested 가 반영되지 않고 테스트가 한번에 수행되지 않아서 inner 와 nested 마다 테스트가 실행되는
방식을 이해할 필요가 있다.
-> 한번에 되지 않은 이유는 Java 에서 자연스럽게 inner class 로 명시해서 활용한 부분이 kotlin 에서는 nested 로 적용되어
@ Nested 가 적용되지 않았다. -> inner 를 명시해주면 해결된다.

https://kotlinlang.org/docs/nested-classes.html

Nested 와 Inner 를 사용하는 이유

객체의 생명주기와 연관이 있다.

Nested

중첩 클래스

class Outer {
  private cal var : Int = 1

  // 별도의 맴버 명시 없이 사용하면 nested 의 역할을 수행하는 클래스
  class Nested {
     fun foo() = 2
   }
}

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

Inner

내부 클래스, members if its outer class

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

val demo = Outer().Inner().foo // ==1 
daehwan2yo commented 1 year ago

java 에서는 class 내부에 class 를 선언해주면, 자동으로 내부 클래스 (inner class) 가 되었다. {OuterClass}.{InnerClass}()

스크린샷 2022-12-04 오후 10 57 38

위와 같이 Inner class 를 외부에서도 사용이 가능하나, Inner class 는 외부 class 의 필드도 갖고있기 때문에 외부 클래스의 객체까지 다 지워져야 할당이 해제될 수 있다.

daehwan2yo commented 1 year ago

kotlin 에서는 java 와 반대로 적용되어진다.

kotlin 에서는 단순히 클래스 내 클래스를 명시하면 중첩 클래스 (nested class) 가 된다. 내부 클래스로 명시하기 위해서는 inner 라는 키워드가 필요하다.