코틀린의 장점. 그만 좀 물어봐!!
728x90
반응형

 

 

 

자고로 제목은 (적당히) 자극적으로 쓰는게 재밌다. 지나친 어그로가 아니라면 조회수도 오르고 쓰고 읽는 맛도 나니깐.

 

이번 제목은 단순한 어그로는 아니다. 개발자끼리 대화, 구직중 면접 등에서 코틀린의 장점을 수도 없이 물어보고 답하게 된다. 지난 1년간 수십번은 이 얘기를 한 것 같다. 그래서 누군가 물어볼 때 차라리 보고 읽도록 정리를 하려고 포스팅 소재를 "코틀린의 장점"으로 정했다. 자잘해보이는 장점도 다루고자 한다. 이번 글은 요즘 필자가 공부하는 서적인 "코틀린 프로그래밍 쿡북"을 많이 참고 하였다.

 

구글이 안드로이드 개발을 위한 공식언어로 코틀린을 지정했다.

기술적 접근이 아니지만 구글이 채택했다는 것은 장점으로서 매우 큰 부분이다. 안드로이드는 전세계 모바일 환경을 양분하는 시장 중 하나이다. 안드로이드의 주인인 구글이 코틀린을 공식 채택을 했다는 것은 전세계 개발환경에서 해당 언어의 생태계가 장기적으로 생존할 수 있음을 보장한 것이나 마찬가지이며 그것이 학습하고 시장에 내 놓는 중요한 요소가 될 수 밖에 없다. 2011년에 공개되었지만 2017년 구글이 공식화한 시점부터 코틀린 생태계가 급성장한 이유가 바로 이런 것이 아닐까. 게다가 안드로이드 개발 IDE인 안드로이드 스튜디오가 구글, JetBrains가 같이 만들었다. 이 JetBrains에서 공개한 언어가 코틀린이다. 코틀린은 크게될 아이(만 9세)였다. (어거지인가. 하지만 인텔리제이와 안드로이드 스튜디오에서 자바-코틀린간 코드변환이 이렇게 잘되는거 보면 완전 어거지는 아니라고 본다. - 내생각)

 

 

Java와 100% 상호 호환 및 JVM에서 동작

물론 코틀린만의 장점은 아니다. 스칼라도 JVM에서 실행된다.(참고로 필자는 스칼라는 잘 모른다. 아니 그냥 모른다.) 스칼라 말고도 JVM에서 동작하는 다른 언어들이 있다. 하지만 이미 Java 생태계는 광범위한 곳에 영향을 끼치고 있어서 JVM에서 동작할 수 있다라는 사항은 이 Java 생태계와 함께 할 수 있다라는 장점으로 작용한다. JVM에서 실행이 되는데 Java보다 러닝커브가 낮으며 안드로이드 앱부터 웹개발까지 가능하다. 참고로 스칼라가 코틀린보다 안좋은 점을 찾으라면 컴파일 속도가 낮다는 점이다. 이와 관련한 더 자세한 사항은 보다 잘 정리한 아래 링크의 블로그를 참고하자.

 

스칼라 vs 코틀린 : 더 나아진 자바를 목표로 경쟁하는 2개의 언어. [번역]

아주 비슷한 느낌을 주는 두 언어 스칼라와 코틀린에 대한 비교 글이 있어서 번역해 보았습니다 이런 글을 읽고 이 언어가 무엇인지 정확히 감을 잡는것은 불가능합니다. 가볍게 읽으세요. 또

hamait.tistory.com

 

 

객제치향 프로그래밍이자 함수형 프로그래밍 (하이브리드형 언어)

 

위키피디아에서는...

 

객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다.

함수형 프로그래밍은 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 하나이다.

 

객체 지향 프로그래밍(절차지향과 대척)으로서 코틀린은 자바와 비교해서 다음과 같은 장점을 가진다.

 

  • new 키워드를 사용할 필요가 없다. 생각보다 개꿀(?)이다.
  • 코틀린의 객체는 기본적으로 final이다.(== 닫혀있다) 이로서 스마트 캐스트(프로그래머가 굳이 원하는 타입으로 캐스팅 하지 않더라도, 컴파일러가 알아서 캐스팅해주는 것)가 가능하다. 프로퍼티가 final이 아니라면 그 프로퍼티를 다른 클래스가 상속하면서 커스텀 접근자를 정의함으로써 스마트 캐스트의 요구 사항을 깰 수 있다. (관련하여 더 궁금하다면 : 12bme.tistory.com/577)
  • 함수를 다른 함수의 매개변수로 사용할 수 있다. 함수가 객체처럼 사용해서 메모리 오버헤드가 발생할 수 있는데 인라인 함수를 사용하여 개선이 가능하다. 모든 인스턴스는 힙 메모리의 공간을 차지하고, 또한 인자로 넘어간 함수를 호출하는 또 다른 메소드가 필요하기 때문에 오버헤드가 발생한다. 인라인 키워드는 함수 내용이 호출 위치에 직접 삽입됨을 의미한다.
  • 위임 속성을 가진다. 대표적으로 lazy. 이 객체에 접근하기 전까지 객체를 생성하지 않고 대기한다. DB 인스턴스를 만들때와 같이 시간이 많이 걸리는 큰 사이즈의 객체를 이용하여 작업할 때 유용하다. 또한 이 속성이 적용된 값은 처음 호출시 계산되고, 그 값을 저장하고 있다가 getValue()를 통한 후속 요청이 있을 때 동일한 값을 제공한다. 마치 캐시처럼.
  • 인터페이스 내 메소드 구현이 가능하다. (그런데 제대로 활용해본적이 없어서 실질적으로 얼마나 유용한지는 모르겠다.)

 

var a = 6 // new가 필요없다

// 호출 시점에 by lazy 정의에 의해서 초기화를 진행한다.
val sampleAdapter: SampleAdapter by lazy {
	SampleAdapter(ImageLoaderAdapterViewModel(this, 3))
}

 

이제 함수형 프로그래밍(명령형과 대척)으로서 장점을 살펴보자.

  • 일급함수.(일급수 아님) 혹은 일급객체. 일급객체는 변수에 담을 수 있고, 함수의 인자로 전달이 되며, 함수의 반환값에 사용할 수 있다. 함수가 일급객체이면 일급함수이다. 이와 유사한 고차함수라는 개념도 있다. 이는 위에 객체 지향 프로그래밍 장점 중 세번째와 겹친다.
  • 람다식을 사용할 수 있다. 비슷한 개념으로 익명함수라는 것도 있다. (물론 Java8부터도 람다 사용할 수 있지만)
  • (흔한 함수형 프로그래밍 장점 1) 코드는 읽기 쉽고 테스트하기 쉽다.
  • (흔한 함수형 프로그래밍 장점 2) 상태(state)와 부수 효과(side effect)가 신중하게 계획된다.
  • (흔한 함수형 프로그래밍 장점 3) 동시성이 좀 더 안전해지며 더 자연스러워진다.

 

// 함수를 매개변수로 전달
val funcMultiply = { a: Int, b: Int -> a * b } // 람다식 적용
println(funcMultiply(44, 3))

 

 

 

Null safety, 널 안정성

Java에서는 NPE(NullPointerException)에 대처하기 위해 항상 null값을 대비하여 프로그래밍을 해야 한다. 코틀린은 자바와 다르게 Nullable, Non-nullable 타입을 따로 지정하여, Non-nullable 타입의 객체는 null check가 필요없도록 할 수 있다. 

 

 

 

 

코루틴을 쉽게 표현한 GIF

 

동시성 프로그래밍, 코루틴(Coroutine)

코루틴은 관계 관련한 하나의 개념으로 시작했다. 수십년 전에 나온 이 개념은 고급 프로그래밍 언어를 만나면서 실체화하게 되었다. 그렇게 실체화된 코루틴을 설명하자면 Context Switching 오버헤드가 적은 Non-blocking 일종의 경량 스레드이다. (스레드는 아니다.) 프로그램이 실행 중일 때 특정 시점에 코루틴으로 이동하여 그 전에 실행하던 루틴을 정지하도록 하게 할 수 있다. Go나 자바스크립트에서도 사용되기에 코틀린만의 장점이라고 할 수 없지만 장점이라는 점은 확실하다.

 

 


 

그 외 크고 작은 장점들이 많을 것이다. 혹시나 놓친 부분이 있다면 누구든 가감없이... 아니 살살 알려주길 바란다.

 

 

 

 

🧀

 

 

 

728x90
반응형