(생초, 코틀린,안드로이드) val listener = CompoundButton.OnCheckedChangeListener { buttonView, isChecked -> ...} 에서 질문입니다.

조회수 526회

val listener = CompoundButton.OnCheckedChangeListener { buttonView, isChecked -> ...}

이 코틀린 코딩 한줄에서 총체적 멘붕이 옵니다.

위의 "listener" 를 안드로이드스튜디오에서 ctr+q로 찍어보면 타입"CompoundButton.OnCheckedChangeListener " 라고 나옵니다. 그리고 "CompoundButton.OnCheckedChangeListener "인터페이스라고 나옵니다.

  1. 인터페이스가 변수의 타입이 될 수 있나요?
  2. 위 인터페이스에 붙은 람다식은 인터페이스의 단일 추상메소드에 대한 오버라이딩인가요?
  3. 그러면 결국 listener는 인터페이스를 상속하고 구현한 object인건가요?

독학중인데 어렵네요.. 역시 자바를 먼저 배워야했나봅니다..

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 인터페이스는 당연히 인스턴스화할 수 없습니다. 근데 3번에서 질문하셨듯이 인터페이스를 상속하고 구현한 Object가 맞습니다. 이게 대체 무슨 말일까요?

    원래 Java 8에서 람다 함수가 처음으로 등장하기 이전, 실행할 내용을 전달하는 방식으로 Listener 인터페이스를 이용했습니다. 이 때 전달하는 것은 '익명 클래스'라는 것으로 인터페이스를 구현하는 익명의 클래스를 만들어서 전달하는 것입니다.

    view.setOnClickListener(new View.OnClickListener() {
        @override
        public void onClick(View view) {
            doSomething();
        }
    })
    

    동일한 동작의 Kotlin 코드:

    view.setOnClickListener { view ->
        doSomething()
    }
    

    말씀하신대로 이 람다식은 단일 추상 메서드에 대한 오버라이딩이 맞습니다. 이것을 SAM(Single Abstract Method) Conversions라고 하는데, 오직 한 개의 추상 메서드를 가진 인터페이스에 한해 람다식 형태로 코드를 쓸 수 있게 해줍니다. https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions

    또한 Kotlin에서 SAM Conversions를 사용하지 않고도 같은 동작의 코드를 쓸 수 있습니다.

    view.setOnClickListener(object: View.OnClickListener {
        override fun onClick(v: View?) {
            doSomething()
        }
    })
    

    늦었지만 도움이 되셨으면 좋겠네요.

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)