Kotlin 중첩 클래스

Kotlin 중첩 클래스

중첩 클래스

  • 클래스안에 만드는 클래스를 중첩클래스라고 부른다.
  • 중첩 클래스에서는 각 클래스의 정의한 멤버를 사용할 수 있는가를 숙지 해야 한다.
  • Inner 클래스는 OuterClass의 멤버변수를 사용하기가 쉬워진다.
class Outer1 {
inner class Inner {

}
}

Inner Class , Outer Class

  • 내부클래스는 외부 클래스로 부터 생성된 객체를 통해서만 객체 생성이 가능하다.
  • 외부클래스는 내부클래스의 멤버를 자유롭게 사용할 수 없지만, 내부 클래스는 외부 클래스의 멤버를 자유롭게 사용할 수 있다.
fun main() {
var obj2 = Inner1() // Error
}
class Outer1 {
inner class Inner1 {

}
}
Kotlin: Unresolved reference: Inner1

내부클래스를 직접적으로 객체를 생성할 수 없기때문에, 에러가 발생한다.

fun main() {
var obj1 = Outer1()
var obj2 = obj1.Inner1()
}

class Outer1 {
inner class Inner1 {

}
}
외부클래스의 객체를 먼저 생성한뒤, 내부 클래스의 객체를 생성 할 수 있다.

fun main() {
var obj1 = Outer1()
var obj2 = obj1.Inner1()
}
class Outer1 {
val outerMember1 = 100
fun outerMethod1() {
println("Outer Method")
println(innerMember1) // Error
innerMethod1() // Error
}
inner class Inner1 {
val innerMember1 = 100
fun innerMethod1() {
println("Inner Method")
}
}
}
클래스 선언 부에서도 내부 클래스의 멤버변수, 메서드를 호출 할 수 없다. 
중첩클래스의 사용 목적은 내부 클래스에서 외부 클래스의 멤버 변수, 메서드 사용을 쉽게 하기 위해서 사용한다.

익명 중첩 클래스

  • 이름이 없는 클래스를 익명 중첩 클래스라고 한다.
  • 인터페이스나 추상클래스를 사용할 때 이용한다.
  • 인터페이스를 구현한 클래스나 추상 클래스를 상속받은 클래스를 만듬과 동시에 메서드를 Overriding 하고 객체를 생성하는 것 까지 수행한다.
  • 이름이 없으므로 다시는 객체를 생성 할 수 없다.

fun main() {
var obj1 = object : TestClass1() {
override fun testMethod1() {
println("testMethod1")
}
}
obj1.testMethod1()
}
abstract class TestClass1{
abstract fun testMethod1()
}

 추상클래스는 해당 클래스를 객체로 바로 사용할 수 가 없는데, 추상클래스를 상속받는 Class를 선언한뒤 그 클래스를 사용하여 추상클래스의 메서드를 사용 할 수 있다.

 하지만, 익명 중첩 클래스를 사용하면, 추상클래스의 메서드를 추상클래스를 상속받는 또다른 Class 선언하지 않고 사용이 가능하다.

 object 키워드를 통해서 사용 할 수 있으며, 익명 중첩 클래스는 주로 이벤트 핸들러, 콜백 함수 등을 구현할 때 유용하게 사용됩니다.










댓글

이 블로그의 인기 게시물

Intel® HAXM installation failed 해결하기

Kotlin Interface

Kotlin this, super