[코틀린기초] 33. 내부 클래스
내부 클래스 기법들
자바의 내부 클래스 종류는 정적 클래스, 멤버 클래스, 지역 클래스, 익명 클래스가 있다.
코틀린의 내부 클래스 종류로는 중첩(Nested) 클래스와 이너(inner) 클래스가 있다.
자바의 정적 클래스 == 코틀린 중첩 클래스
멤버 클래스 == 이너 클래스
익명 클래스 == 익명 객체(object) 가 된다.
자바와 코틀린의 내부 클래스 비교
자바와 코틀린 이너 클래스는 다음과 같다.
// 자바
class A {
class B{
// 외부 클래스 A의 필드에 접근 가능
}
}
// 코틀린
class A{
inner calss B{
// 외부 클래스 A의 필드에 접근 가능
// 바깥 클래스의 private 멤버도 접근이 가능하다.
}
}
자바와 코틀린 정적 클래스는 다음과 같다.
// 자바
class A{
static class B{ //정적 클래스를 위해 static 키워드 사용
...
}
}
// 코틀린
class B{
class A{ // 중첩 클래스이며, 정적 클래스처럼 사용된다.
... // 외부 클래스 A의 프로퍼티, 메서드에 접근 불가!
} // 단 컴페니언 객체는 static처럼 접근이 가능하다.
}
지역 클래스
- 특정 메서드 블록이나 init블록과 같이 블록 범위에서만 유효한 클래스
- 블록 범위를 벗어나면 더 이상 사용되지 않음
fun powerOn(): String {
class Led(val color: String){ // 지역클래스 선언
fun blink(): String = "Blinking $color" // 외부의 프로퍼티도 접근 가능하다.
}
val powerStatus = Led("RED") // 지역클래스 사용
return powerStatus.blick()
}
익명 객체
자바에서는 익명 이너 클래스라는 것을 제공해 일회성으로 객체를 생성해 사용
코틀린 에서는 object 키워드를 사용하는 익명 객체로 같은 기능을 수행
interface Switcher{ // 1. 인터페이스 선언
fun on(): String
}
class SmartPhone(val model: String){
...
fun powerOn(): String{
class Led(var color:String){
fun blink(): String = "Blinking $color on $model"
}
val powerStatus = Led("Red")
val powerSwitch = object : Switcher{ // 2. 익명 객체를 사용해 on()을 구현
override fun on(): String{
return powerStatus.blink()
}
}
return powerSwitch.on()
}
}