Glacier's Daily Log

코틀린 SAM-constructor 란? 그리고 코틀린에서 clickListener를 간단하게 쓸 수 있는 이유 본문

Coding/Android

코틀린 SAM-constructor 란? 그리고 코틀린에서 clickListener를 간단하게 쓸 수 있는 이유

h__glacier_ 2024. 4. 9. 16:58
반응형

코틀린 작업중 발생하는 제안사항인 SAM-constructor 가 뭘까?

SAM conversions (Single Abstract Method)

  1. 기존 Java에서 클릭 리스너를 만들 때 사용한 익숙한 코드
    btnTest.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // Do something
                }
            });
  2. 람다식을 사용하지 않은 Kotlin으로 만든 클릭 리스너
    btnTest.setOnClickListener(object: View.OnClickListener {
                override fun onClick(v: View) {
                    // Do something
                }
            })
  3. 여기서 OnClickListener는 아래와 같이 구현되어 있음.
    public interface OnClickListener { void onClick(View v); }
  4. OnClickListener는 onClick, 단 하나의 추상 메소드만을 가지는데 이걸 SAM(Single Abstract Method) 라고 부른다.
    따라서, 우리가 OnClickListener를 구현했다는 것은, 하나뿐인 무조건 override하여 구현해야하는 onClick을 구현할 것이고,
    컴파일러도 이를 당연히 여기고 있기 때문에 이를 생략할 수 있음.
  5. 이후 아래 코드까지 생략을 한다.
    btnTest.setOnClickListener(View.OnClickListener { v: View -> println("Do something") })

  6. 그러면 이렇게 SAM-constructor를 제거하라고 검게 표시해 버린다.
    그 의미는, 실제로 setOnClickListener를 사용한 순간 OnClickListener를 생성자로 넣을 수 밖에 없는 상황이기 때문에, 컴파일러도 미리 알고 생략을 추천하는 것이다.

  7. 이후 아래 코드까지 생략을 할 수 있고,
     btnTest.setOnClickListener({ v: View -> println("Do something") })
  8. 파라미터가 여러 개 있어도 가장 마지막 파라미터가 람다식이면 소괄호 바깥으로 빼낼 수 있는 코틀린 문법 때문에 
    이후 btnTest.setOnClickListener() { v: View -> println("Do something") } 로 만들 수 있고, 빈 괄호는 생략 가능해서 최종적으로 우리에게 익숙한
    btnTest.setOnClickListener { v: View -> println("Do something") }
    이 되는 것이다.

이러한 Redundant SAM-constructor는 자바코드를 코틀린에서 사용할 때 만 적용이 되었지만, 최근 코틀린 신규버전에도 적용이 되어서 모두 사용할 수 있다.

 

 

반응형
Comments