왜 코틀린을 사용하는가?

devdo·2021년 12월 22일
0

코틀린

목록 보기
1/1

코틀린이 좋은 이유

현재 혹은 차후 프로젝트 진행에 있어 코틀린을 선택해야 하는 일이 많은 것 같다. 당근 마켓 지부인 당근페이에서 채용 설명회를 봤는데 점차 서버 사이드에서 자바에서 코틀린으로 리팩토링을 하고 있다고 한다. 안드로이드 공식 언어로서 코틀린이 쓰이고 있다고만 들었지, 서버사이드에서도 이런 대우?를 받을 줄 몰랐다.

과연 코틀린의 어떤 이점이 있기에 이같은 일이 벌어지고 있는 것일까?


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

2011년에 공개되었지만 2017년 구글이 공식화한 시점부터 코틀린 생태계가 급성장한 이유가 바로 이런 것이 아닐까. 게다가 안드로이드 개발 IDE인 안드로이드 스튜디오가 구글, JetBrains가 같이 만들었다. 이 JetBrains에서 공개한 언어가 코틀린이다. 코틀린은 크게될 아이(만 9세)였다.

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

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

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

자바와 비교해서 코틀린은 다음과 같은 장점을 가진다.

  • 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))

4. Null safety, 널 안정성

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

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

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


코틀린 패러다임

번 코틀린을 시작하고 나면, 코틀린이 잡다하게 뒤섞인 칵테일보다는 제각각의 기능을 다하는 스위스 군용 칼에 가깝게 느껴질 것이다. 코틀린을 이용하면 아주 많은 일을 아주 적은 코드로 할 수 있다. 코틀린은 다양한 패러다임을 지원한다. 코틀린은 아주 강력한 타입추론 능력을 갖춘 정적 타입 언어다. Java 바이트코드로 컴파일될 수도 있고 자바스크립트로 트랜스파일될 수도 있다. 코틀린 네이티브를 이용하면 네이티브 바이너리도 될 수 있다. 코틀린은 아주 풍부하고 우아하고 함께 일하기에 매력적인 언어이다. 코틀린을 도입해야 하는 더 많은 이유를 알아보자.

1) 다양한 프로그래밍 패러다임

코틀린은 다양한 선택지를 주고 해결하려는 문제에 가장 적합한 해법을 선택할 수 있도록 한다. 아주 어른답게 문제를 처리할 수 있는 것이다. 코틀린에는 몇 가지 양식이 있다. 클래스에서 모든 것을 작성할 필요도 없고 모든 코드를 컴파일할 필요도 없다. 코틀린은 독선적이지 않다. 다양한 프로그래밍 패러다임을 제공하기 때문에 그것 중에 하나를 선택하거나 섞어서 사용하면 된다. 코틀린의 장점은 아이디어를 빠르게 프로토타이핑할 수 있다는 점과 어떤 디자인 패턴을 적용하면 좋을지 금방 확인해 볼 수 있고 다른 언어들이 강요하는 양식은 필요 없다는 점이다. 이런 장점은 당신의 아이디어를 데 모로 만드는 데 걸리는 시간을 최소화한다.

코틀린에서도 Java처럼 클래스를 만들 수도 있고 객체지향으로 코드를 만들 수도 있다. 하지만 코틀린에서는 보일러플레이트 코드(Boilerplate Code)*가 필요 없다. 코틀린은 더 적은 코드로 Java와 같은 결과물을 만들 수 있다. 코틀린은 클래스의 계층을 어쩌다 보니 만드는 게 아니고 계획적으로 만들도록 가이드 해준다. 클래스는 파이널(final)을 기본값으로 갖고 있다. 만약에 클래스를 베이스클래스로서 사용하고 싶다면 해당 클래스에 명시적으로 표시해야만 한다. 델리게이션은 언어 수준의 문법을 가지고 있으므로 상속과 델리게이션(delegation, 위임) 사이에서 신중한 선택을 거쳐 사용할 수 있다.

2) 타입추론으로 사용하는 정적 타입

정적 타입 언어는 컴파일 시간에서 타입 안정성을 제공한다. 그러나 코틀린은 다른 정적 타입 언어들보다 몇 발자국 더 나아가서 오류를 방지한다. 예를 들면 코틀린 타입시스템은 널 불가(non-nullable) 타입과 널 가능(nullable) 타입을 구분한다. 그리고 Scala, F#, Haskell처럼 아주 강력한 타입추론을 할 수 있다. 더 이상 타입을 입력하느라 시간을 쓸 필요가 없다. 동시에 타입이 100% 명확하지 않은 경우 코틀린은 개발자에게 타입을 명시할 것을 요청한다. 타입추론을 올바르게 하기 때문에 우리는 개발에만 집중할 수 있고, 코드는 타입 안정성을 갖추게 된다.

3) 풀스택 개발을 위한 하나의 언어

javac 컴파일러가 Java 소스 코드를 자바 가상 머신(JVM)에서 실행시키기 위해 바이트코드로 컴파일하는 것처럼, kotlinc-jvm은 코틀린 코드를 가상 머신에서 실행시키기 위해서 바이트코드로 컴파일한다. 코틀린은 서버사이드 코드, 안드로이드 애플리케이션 개발에도 사용이 가능하며 특정 버전의 가상머신을 위한 배포도 가능하다. 백엔드에서 스프링을 사용하고, 디바이스로 안드로이드나 iOS 네이티브 코드가 필요할 때 코틀린 하나로 코딩이 가능하다. 필요할 때 코틀린 코드와 Java코드를 섞어서 사용할 수도 있다. 더 이상 레거시 코드가 없을 것이다.

4) 자연스럽고 우아함

코틀린은 당신을 위해서 필드(field), 접근자 메소드(getter, setter), Java Bean 컨벤션에서 제시하는 필수적인 요소들을 통합했다. 더 적은 노력으로 더 좋은 결과를 얻을 수 있다.

코틀린은 몇 가지를 선택사항으로 만들었다. 예를 들면, 세미콜론(;)이 선택사항이다. 세미콜론을 강제하지 않는 것이 보기 좋은 구문을 만들고 내부 DSL을 더 읽기 좋게 만들어준다. 그리고 코틀린은 infix 어노테이션을 제공한다. infix 어노테이션은 온점(.)과 중괄호({})를 선택사항으로 만들어둔다. 이러한 능력으로 우리는 다음과 같은 자연스럽고 우아한 코드를 만들 수 있다.


참고

https://ydot.tistory.com/678 [출판사 영진닷컴 블로그]

https://devvkkid.tistory.com/164 [개발자입니까?]

profile
배운 것을 기록합니다.

0개의 댓글