Summary


안드로이드 개발 언어의 트렌드는 바뀌었다. 최근 Google I/O에서 나오는 샘플 코드들은 Kotlin으로 짜여져 있었다. 또한 안드로이드 개발 컨퍼런스의 주제는 Kotlin으로 개발한 경험담이 주를 이루고 있다.

Kotlin으로 개발하는 것이 낫다는 내용을 많이 보기도 하였고 개발에 욕심이 있다보니, 이번에는 기존에 JAVA로 개발되어 있던 코드에 Kotlin을 적용하여 새로 구성하거나 변경하는 클래스를 Kotlin으로 구성해보았다.

다음은 이런 과정을 거치면서 느낀 장점과 단점에 대한 고찰이다.

고찰


Kotlin의 장점을 느끼기 전에는 치명적인 단점(?)과 싸워야만 한다.

무엇보다 가장 크게 힘들었던 점은 손에 익은 Java 대신에 인내하며 억지로 Kotlin으로 작성해야된다는 점이었다. 개발자가 새로운 기술을 받아들여야 할 때 나타나는 문제점이었다. 기존에 잘하는 것으로 개발하면 바로 끝낼 수 있지만 새로운 것을 받아들이면 공부하고 적용하는데까지 시간이 몇배로 들기 때문이다. 이런 경우에 기술을 받아들일지는 상황에 따라 결정하게 된다. 상급자의 명령에 따라 빠른 퍼포먼스를 보여줘야하는 경우에는 기존의 기술을 택한다. 반면에 중간중간에 공부를 해두어서 적용할 수 있는 단계가 된 경우이거나 개발의 주체가 기술에 대한 욕심이 있고 새로운 것에 대해 무리없이 받아들이는 경우에는 새로운 기술을 택한다. 솔직히 후자라고 주장하고 싶지만 지난 몇번의 시도를 하였지만 다시 Java로 개발했었다. 편하게 살고싶은 마음을 이겨내는 것이 제일 힘들었다.

이번에는 마음을 먹고 .kotlin으로 파일을 생성하여 .java는 생성하지도 않았다. 여러 언어를 접하면서, 공부하면 기본은 비슷하기 때문에 적응만 하면 배울 수 있다는 것을 깨달았기 때문이다.

Kotlin을 적용하는 것은 만만하지 않았다. Java에선 타입을 먼저 지정하고 그에 대한 private / public / protected와 같은 scope를 정하며, 객체를 통해 모든 데이터를 전달하고 Interface를 통해 메서드들을 정했었다. 여태까지 자연스러운 행위였다.

Kotlin에서는 var / val를 통한 변수 선언만이 존재했다. 처음엔 익숙하지 않았다. 먼저 객체 타입을 지정하였던 이전과 비교하여 콜론 다음에 타입을 지정할 수 있었다. 게다가 콜론 다음에 타입을 지정하는 것은 필수가 아니었다. 어색했다. 하지만 이것을 이겨내는 방법은 간단하였다. Kotlin이 이런 방식을 택한 이유에 대해 Java로 개발할 때보다 불편하게 만들기 위한 것이 아니라는 것만 생각하면 되었다.

코틀린에서는 변수 선언과 동시에 값을 할당 할 때에는 타입을 지정할 필요가 없었다. 왜냐하면 바로 뒤에 해당 객체의 형을 볼 수 있기 때문이다. 만약 변수선언과 동시에 값을 할당하지 않는다면, 타입을 콜론한 다음에 지정해주면 된다. 예제는 다음과 같다.

private var str = "SOME STRING" // 할당된 값을 통해 간단히 타입을 추론할 수 있다.
private var str : String        // 값이 할당되지 않을 때

변수 선언과 관련해서 바뀐점은 특별히 편하다는 생각은 많이 들지 않았다. 하지만 람다식이나 inner anonymous를 구현함에 있어서 코드를 아주 간결하게 표현할 수 있다.

자바에서는 다음과 같이 표현했다.

new Thread(new Runnable() {
    @override
    public void run() {
        // RUN SOME CODES
    }
}).start()

// OR

new Thread(() -> {
    // RUN SOME CODES
}).start()

이를 코틀린으로 작성하면 다음과 같다.

Thread({
    // RUN SOME CODES
}).start()

코드가 java보다 간결하게 표현된 것을 확인할 수 있다. 람다식으로 표현된 것보다도 간결해진다. 하지만 이것만으로는 간결해졌다고 볼 수 없다.

무엇보다 Kotlin에서 가장 매력적으로 느꼈던 부분은 functional programming의 특징이다. Java에서 Callback을 구현하기 위해서는 다음과 같은 프로세스로 진행해야한다.

  1. callback으로 사용할 메서드가 정의된 AInterface를 생성
  2. Async하게 동작하는 AClass에서 AInterface를 parameter로 받는 aMethod 메서드 생성
  3. aMethod를 호출하는 BClass에서 AInterface를 내부익명으로 새로 구현하던지 상속받아 this를 파라미터로 넘겨 실행 (물론 더 다양한 방법도 존재하지만 이게 흔한 방법이다.)

글로 표현하기도 참 쉽지 않다. 헷갈린다. 하지만 Kotlin으로 작성하면 아주 간단하다. 파라미터를 함수로 받고 그것을 실행만 하면된다. 물론 이 함수는 별도로 정의되어 있는 인터페이스나 클래스가 아니다. Javascript로 개발한 적이 있다면 이러한 Callback 기법이 편안하게 다가올 것이다. 상세하게 알고 싶다면 다음의 링크를 참고하면 된다.

Higher-Order Functions and Lambdas


위처럼 Kotlin에 적응하기 위한 일련의 과정을 거치니 점점 개발 퍼포먼스가 증가하였다. Kotlin으로 작성하면 코드의 무게가 작아지는 것도 있고, 자잘한 Interface를 선언할 일도 줄어들었기 때문이다. 덕분에 순수하게 타자를 치는 시간도 줄었다.

이렇게만 말하니 조금 안타깝지만 언어 선택이 개발에 있어서 엄청난 향상으로 나타나지 않는다는 것은 모두가 알 것이다. 웹서버 개발을 할 때에도 C, C#, PHP, JAVA, Go, Nodejs, Python 등등 다양한 방법이 있다. 그럼에도 불구하고, 우리가 최근에는 Go, Nodejs, C#, Python등으로 개발하는 이유가 있다. C가 익은 사람이라도 이제는 C로 웹서버를 개발하지 않는다. 왜냐하면 지속적인 개발을 위한 퍼포먼스에서 크게 차이가 나타나기 때문이다. 비록 처음에는 배움에 대한 문턱이 있다 할지라도, 결국에는 유지보수의 단계에서 비용절감의 결과로 나타날 것이다.

개발 속도에 문제가 생기지 않도록 유지가능한 코드를 위해 Kotlin을 적극 도입하기를 추천한다.