(생초, 코틀린,안드로이드) val listener = CompoundButton.OnCheckedChangeListener { buttonView, isChecked -> ...} 에서 질문입니다.
조회수 549회
val listener = CompoundButton.OnCheckedChangeListener { buttonView, isChecked -> ...}
이 코틀린 코딩 한줄에서 총체적 멘붕이 옵니다.
위의 "listener" 를 안드로이드스튜디오에서 ctr+q로 찍어보면 타입이 "CompoundButton.OnCheckedChangeListener " 라고 나옵니다. 그리고 "CompoundButton.OnCheckedChangeListener "는 인터페이스라고 나옵니다.
- 인터페이스가 변수의 타입이 될 수 있나요?
- 위 인터페이스에 붙은 람다식은 인터페이스의 단일 추상메소드에 대한 오버라이딩인가요?
- 그러면 결국 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() } })
늦었지만 도움이 되셨으면 좋겠네요.
-
(•́ ✖ •̀)
알 수 없는 사용자
-
댓글 입력