Nested Class

쀑첩 (nested) ν΄λž˜μŠ€λŠ” 클래슀 μ•ˆμ— μžˆλŠ” 클래슀둜 정적인 쀑첩 클래슀λ₯Ό λ§ν•œλ‹€. μ•„λž˜ μ½”λ“œμ—μ„œ λ§ν•˜λŠ” Outer Class 내뢀에 μžˆλŠ” Nested Class 와 같은걸 λ§ν•œλ‹€.

class OuterClass {
  // statement
  class NestedClass {
    // statement
  }
}

쀑첩 ν΄λž˜μŠ€λŠ” 크게 두 μ’…λ₯˜λ‘œ λ‚˜λ‰ μˆ˜ μžˆλ‹€.

  • Static Nested Class (정적 쀑첩 클래슀)
  • Non-Static Nested Class (λΉ„ 정적 쀑첩 클래슀 :: Inner Class)

Static Nested Class (정적 쀑첩 클래슀)

정적 쀑첩 클래슀의 νŠΉμ§•μ€ λ‹€μŒκ³Ό κ°™λ‹€.

  • Outer Class 의 μ§€μ—­λ³€μˆ˜ 접근이 λΆˆκ°€λŠ₯
  • μ™ΈλΆ€μ—μ„œ OuterClass.NestedClass 둜 객체 생성 κ°€λŠ₯

μžλ°”μ—μ„œ μ‚¬μš©ν•  경우 μ•„λž˜μ™€ 같이 μ‚¬μš©

class OuterClass {
  // statement
  static class StaticNestedClass {
    // statement
  }
}

μ½”ν‹€λ¦°μ—μ„œ μ‚¬μš©ν•  경우 μ•„λž˜μ™€ 같이 μ‚¬μš©

class OuterClass {
  // statement
  class StaticNestedClass {
    // statement
  }
}

μœ„ μŠ€μΌˆλ ˆν†€μ½”λ“œμ—μ„œ κ΅¬ν˜„ λ‚΄μš©μ„ μΆ”κ°€ν•˜λ©΄ μ•„λž˜μ™€ κ°™λ‹€.

class OuterClass {
  val outerValue = 10
  class StaticNestedClass {
    private val innerValue = 20
    fun printItems() {
      println("value: $innerValue")
    }
  }
}

fun main(args: Array<String>) {
  val nested = OuterClass.StaticNestedClass()
  nested.printItems()
}

Non-Static Nested Class

λΉ„ 정적 쀑첩 ν΄λž˜μŠ€λŠ” 일반적으둜 Inner Class 라고 ν•˜λ©° νŠΉμ§•μ€ λ‹€μŒκ³Ό κ°™λ‹€.

  • OuterClass 의 μ§€μ—­λ³€μˆ˜ 접근이 κ°€λŠ₯
  • μ™ΈλΆ€μ—μ„œ OuterClass.NestedClass 둜 객체 생성이 λΆˆκ°€λŠ₯

μžλ°”μ˜ μ‚¬μš©ν•  경우 μ•„λž˜μ™€ 같이 μ‚¬μš©

class OuterClass {
  // statement
  class InnerClass {
    // statement
  }
}

μ½”ν‹€λ¦°μ—μ„œλŠ” μ•„λž˜μ™€ 같이 μ‚¬μš©

class OuterClass {
  // statement
  inner class InnerClass {
    // statement
  }
}

μ½”ν‹€λ¦°μ—μ„œλŠ” inner class 둜 μ‚¬μš©ν•˜λ €λ©΄ inner ν‚€μ›Œλ“œλ₯Ό κΌ­ λΆ™μ—¬μ€˜μ•Ό ν•œλ‹€.

μœ„ μŠ€μΌˆλ ˆν†€ μ½”λ“œμ—μ„œ κ΅¬ν˜„ μ½”λ“œλ₯Ό μΆ”κ°€ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

class OuterClass {
  val outerValue = 10
  
  inner class InnerClass {
    private val innerValue = 20
    fun printItems() {
      println("inner: $innerValue, outer: $OuterValue")
    }
  }

  fun printItems() {
    val inner = InnerClass()
    inner.printItems()
  }
}

fun main(args: Array<String>) {
  val outer = OuterClass()
  outer.printItems()
}