[코틀린기초] 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처럼 접근이 가능하다.
  }
  

지역 클래스

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()
    }
  
  }