[Kotlin] Object Expressions and Delarations

래림·2022년 11월 18일

Kotlin

목록 보기
3/3

object 용도

어떤 class에서 조금 변경된 객체를생성할 때
새로운 subclass의 명시적인 선언 없이 객체 생성

Object Expressions

객체 표현식

  • java에서는 익명 내부 클래스를 사용해서 처리했다.
  • Kotlin에서는 object expressions를 이용한다.
    java코드
btn.setOnClickListener(new OnClickListener(){
	public void onClick(View v){
			...
}
});

객체 표현식 문법

  • 어떤 클래스를 상속받은 익명 객체를 생성
    코틀린코드
window.addMouseListener(object : MouseAdapter(){
	override fun mouseClicked(e : MouseEvent){}
    override fun mouseEntered(e: MouseEvent){}

})

객체 표현식 상속

  • 슈퍼타입에 생성자가 있는 경우, 반드시 값을 전달 해 주어야 한다.
open class A(x:Int){
	public open val y:Int = x
}
interface B {...}

val ab: A =object : A(1),B{
	override val y = 15
}

객체 표현식 예시

다음은 thread를 하나 만들어서, Runnable interface를 상속받은걸 override해서 넘겨주는 코드이다. run()이라는 함수 하나만 override할건데, 코드가 너무 길어진다.

class MyRunnable:Runnable{
    override fun run() {
      println("hello kotlin")
    }

}

fun main(args:Array<String>){
    val t=Thread(MyRunnable())
    t.run()

}

코틀린에선, 다음과 같이 할 수 있다. 위의 MyRunnable클래스를, main함수의 Thread인자로 넘겨줄 수 있다. 이때 class MyRunnable이라는 이름을 지우고 object키워드를 사용하면 된다.

fun main(args:Array<String>){
    val t=Thread(object:Runnable{
        override fun run() {
            println("hello kotlin")
        }

    })
    t.run()

}

특별히 상속받을 supertypes가 없는경우, 간단하게 작성 가능


fun main(args:Array<String>){
    val data = object{
        var x= 111
        var y=111
    }
    println("${data.x}, ${data.y}")

}

객체 표현식 제약사항

  • 익명 객체가 local이나 private으로 선언될 때만 type으로 사용 될 수 있다. (public인 경우 사용 불가)
  • 익명 객체가 public function이나 public property에서 리턴되는 경우, 익명객체의 슈퍼타입으로 동작된다. 이런경우, 익명 객체에 추가된 멤버에 접근이 불가능하다.
class MyClass{
    public fun publicFun()=object {
        var x = 111

    }
    private fun privateFun()=object {
        var x = 222

    }

    fun print(){
        println(publicFun().x) // 이 경우에 에러가 난다.
        println(privateFun().x)// 이 경우는 문제가 없다.
    }
}
fun main(args:Array<String>){
    MyClass().print()

}

Object Declarations

싱글턴

객체 선언 용도

  • 매우 유용한 Singleton 패턴을 kotlin에서는 object delarations을 이용해서 만들 수 있다.

객체 선언 문법

  • object 키워드 뒤에 항상 이름이 있어야 한다.
  • object declaration은 object expression이 아니다.
  • 그래서 할당 구문의 우측에 사용 될 수가 없음.
  • object declaration의 객체를 참조하려면, 해당 이름으로 직접 접근하면 된다.
  • 슈퍼타입을 가질 수 있다.(상속가능)
    object CountManager{
       var count = 0
    }
    fun main(args: Array<String>){
       CountManager.count++
       print(CountManager.count) // 이름을 부르면 객체가 반환이 된다.
    }

Companion Object

싱글턴 + Class method (static) 코틀린엔 static이 없다.

동반자 객체

  • 클래스 내부의 object declaration은 companion 키워드를 붙일 수 있다.
  • companion object의 멤버는 클래스 이름을 통해서 호출 할 수 있다.
class MyClass{
	companion object Factory{
    	fun create() : MyClass = MyClass()
    }
}

원래는 호출 시 MyClass.Factory.MyClass()하고 호출해야ㅎ한다.

0개의 댓글