[kotlin] SAM & typealias

SAM 전환

SAM(Single Abstract Method)는 자바 API를 코틀린에서 활용할 때 람다 표현식을 이용해 쉽게 이용할 수 있게 제공해주는 기법이다. 안드로이드 프로그래밍이나 서버 측 웹 애플리케이션을 코틀린으로 작성할 때 코틀린 코드에서 자바 API를 자주 활용해야 하는데, 이 때 SAM은 유용하게 활용되는 기법이다.

SAM은 단어 뜻 그대로 하나의 추상 함수를 가지는 인터페이스 활용을 목적으로 한다. 인터페이스와 그 인터페이스를 등록하는 setter 함수가 자바에 작성되어 있다면, 코틀린에서 setter 함수를 이용하여 인터페이스를 구현한 객체를 등록할 때 람다 함수를 이용하여 쉽게 등록하는 방법을 제공한다.

    public interface JavaInterface1 {
    	void callback();
    }
    
    public class SAMTest{
    	JavaInterface1 callback;
    	public void setInterface(JavaInterface1 callback){
    		this.callback = callback;
    	}
    }
    
    // 이용하는 부분
    SAMTest obj = SAMTest();
    obj.setInterface(new JavaInterface1() {
    	@Override
    	public void callback() {
    		System.out.println("hello java");
    	}
    });
    
    // 아래의 함수는 사실 람다로 줄일 수 있다.
    obj.setInterface((JavaInterface1) () -> System.out.println("hello java"))

코틀린에서 위의 자바 인터페이스를 사용하면 SAM을 이용하여 다음과 같이 사용할 수 있다.

    fun main(args: Array<String>){
    	val obj = SAMTest()
    
    	obj.setInterface(object: JavaInterface1{
    		override fun callback() {
    			println("hello kotlin")
    		}
    	})
    	obj.callback.callback()
    }
    
    // SAM 적용
    
    fun main(args: Array<String>){
    	val obj = SAMTest()
    
    	obj.setInterface { println("hello sam") }
    }

코드가 굉장히 간결해진다. 인터페이스의 추상 함수 내부 코드 구현만 람다 식으로 표현해 주면 된다. 마치 고차함수를 인수로 받는 함수를 사용하는 것 같은 모양새가 된다.

typealias

타입 에일리어스란 타입의 이름을 변경하는 방법을 이야기한다. 여기서 타입은 클래스명 혹은 인터페이스명을 가리킨다. 프로퍼티의 타입으로 지정할 수 있는 것에 대한 이름 변경을 제공한다는 의미이다.

    typealias MyInt = Int
    typealias MList<T> = MutableList<T>
    typealias MC = MyClass
    typealias MI = MyInterface
    typealias MyType = (Int) -> Boolean
    val myFun: MyType = { it > 10 }
    
    class MyClass: MY
    
    // inner class에 대한 타입을 재정의하는 데도 사용가능
    class Super {
    	inner class Sub
    
    	fund getSubInstance(): MySub {
    		return Sub()
    	}
    }
    
    typealias MySub = Super.Sub