Skip to content

Latest commit

 

History

History
78 lines (66 loc) · 2.38 KB

nested, open, inner.md

File metadata and controls

78 lines (66 loc) · 2.38 KB
  • java kotlin
    Nested classes static class InnerClass class InnerClass
    inner classes class InnerClass inner class InnerClass
  • 코틀린은 기본은 Nested Class
  • Nested Class 필요할때
    • Outer의 멤버를 참조할 필요가 없다면 굳이 inner 키워드를 사용치 않아야 한다.
    • Inner classes를 보호하고 싶다면 private를 명시해라.
    • 수정 가능한 상태로 두고 싶다면 open 키워드를 명시할 수 있다.
  • android에서 ViewHolder는 왠만해서는 nested 로 지정하는것이 좋다.

open

  • java kotlin
    default 모두 상속가능 모두 상속불가
    기본 지정자(final) X O
  • 상속이 불가능한 코틀린 언어에서 상속이 가능하도록 하는 키워드
  • open -> 상속, 오버라이드

inner

  • 코틀린에서는 한 클래스안에 다른 클래스를 정의하면 기본적으로는 중첩 클래스(static nested class) 가 되고, 내부 클래스로 만들고 싶다면 inner 키워드로 클래스를 선언해야 한다
  • 기본적인 static nested class 로 되기에 다음과 같이 OuterClass 변수에 접근이 필요하거나 두 가지 해결방법이 있다. - 출처
    • class Outer {
      
          private val outer = "Outer"
      
          class InnerClass {
      
              init {
                  print(outer) // <------- 에러 발생
              }
          }
      }
      
    • 해결책 1
      class Outer {
      
          private val outer = "Outer"
      
          inner class InnerClass {
      
              init {
                  print(outer)
              }
          }
      }
    • 해결책 2
      class Outer {
      
          private val outer = "Outer"
      
          class InnerClass(
              private val out: Outer
          ) {
      
              init {
                  print(out.outer)
              }
          }
      }
  • 주의점
    • Outer 클래스를 참조하기에 메모리 누수가능성이 있다.
  • // inner class 내부 클래스
    class Outer {
        private val bar: Int = 1
        inner class Inner {
            fun foo() = bar
        }
    }
    
    val demo = Outer().Inner().foo() // == 1
    
    // Inner 클래스가 Outer 클래스를 참조하기 때문에 bar 를 바라본다.