지금까지 코틀린을 이용하여 앱개발을 하면서도 코틀린이란 무엇인지에 대해서 명확히 알고 넘어가지는 않았던 것 같다.
그래서 이번에는 코틀린에 대해서 공부를 해보자.
코틀린이란 무엇인가
코틀린은 안정성, 간결성, 상호 운용성을 강조하는 다중 패러다임, 다중 플랫폼 프로그래밍 언어이다. 2010년 하반기에 처음 생겨서 2016년 2월 처음으로 공개 릴리스되었으며, 안드로이드 개발, 데스크톱 애플리케이션, 서버 측 솔루션 등 여러 개발 분야에서 유망한 도구로 꾸준히 인기를 얻고 있다.
2019년 11월 코틀린 1.3이 나왔고, 2021년 5월 1.5.0이 나왔다. 지금 현재는 1.8.21.이다(2023년 8월 21일 기준)
원래 언어를 만든 목적, 즉 자바에 대해 더 나은 대안을 제공하려는 목적을 넘어 코틀린이 크게 성장하면서, 이제 코틀린은 자바 가상 머신, 안드로이드, 자바스크립트, 네이티브 애플리케이션 등과 같은 여러 플랫폼을 지원한다. 2017년 구글은 안드로이드 플랫폼의 공식 지원 언어로 코틀린을 선택하였다.
언어의 철학은 2010년 코틀린이 마주했던 문제에서 기인한다. 그 당시 젯브레인에는 인텔리J 플랫폼을 중심으로 하는 자바 코드 기반이 누적돼 있었는데, 여기에는 가장 잘 알려져 있는 인텔리J IDEA뿐만 아니라 웹스톱, Php스톰, 루비마인 등의 마이너한 IDE도 포함됐다.
코드 기반의 성장과 유지보수는 자바 언어 자체로 인해 방해 받기 시작했는데, 이유는 자바의 발전 속도가 느렸고, 2010년 당시 스칼라나 C# 등의 언어에서 사용할 수 있었던 유용한 기능이 자바에는 없었기 때문이다. 당시 사용 가능한 JVM 언어를 검토해본 젯브레인즈는 자신의 필요를 충족할 만한 언어가 없다는 결론을 내리고, 그에 따라 자원을 투입해 자신만의 언어를 개발하기로 하였다.
새로운 언어에는 개발 팀원의 상당수가 위치했던 러시아 상트페테르부르크 근처의 섬인 '코틀린' 이라는 이름이 붙었다.
코틀린의 특징
1. 안정성
코틀린의 설계 목표 중 하나는 황금비를 찾아내는 것 이었다. 즉, 자바보다 더 안정성을 보장하는 언어를 설계하되, 개발자의 생산성을 덜 해치는 언어를 만드는 것이었다. 그리고 코틀린은의 해법은 어떤 측면에서든 절대적인 것이 아니었으나, 실질적으로 효율적인 선택임을 반복적으로 증명해 왔다.
- 타입추론으로 인해 개발자가 명시적으로 타입을 지정하지 않아도 된다.
- 널이 될 수 있는 타입을 통해 null의 사용을 제한할 수 있고, 악명 높은 NullPointException 예외를 좀 더 쉽게 방지할 수 있다.
- 스카트 캐스트를 통해 타입을 안전하게 변환할 수 있고, 실행 시점에 타입 캐스트 오류를 방지할 수 있다.
2. 다중 패러다임
초기에 코틀린이 다중 패러다임이라는 말의 의미는 자바와 같은 전형적인 주류 프로그래밍 언어가 지원하는 일반적인 객체지향 패러다임 외에 함수형 프로그래밍을 지원한다는 뜻이었다.
함수형 프로그래밍
함수형 프로그래밍은 함수를 다른 값과 마찬가지로 다룬다는 생각에서 비론된 프로그래밍 방법이다.
그래서 함수를 다른 함수의 인수로 넘기거나, 지역적으로 함수를 선언하거나, 변수에 저장하거나, 함수가 함수를 반환하는 등의 일이 가능하다. 함수형 프로그래밍의 또 다른 측면으로 불변성이 있다. 이는 개발자가 만든 객체는 내부 상태를 바꿀 수 없고, 함수는 부수효과를 만들어 낼 수 없다는 말이다.
이에 코틀린은 함수형 프로그래밍에 필요한 도구를 처음부터 제공했다.
특히 함수 타입을 부드럽게 조화시킨 타입 시스템과 함수 타입의 값을 코드 블록에서 만들어낼 수 있는 람다를 처음부터 제공했다.
표준 라이브러리나 외부 프레임워크도 함수형 프로그래밍 스타일을 장려하는 방대한 API를 제공한다.
또한 코틀린 언어가 성장해 나가면서, 두 가지 프로그래밍 패러다임을 더 지원하기 시작했다. API를 도메인 특화 언어(Domain Specific Language, DSL)로 정의할 수 있는 기능 덕분에 코틀린을 선언적인 스타일로 코딩할 수 있다.
또 다른 패러다임으로는 동시성 프로그래밍이다. 코루틴을 도입하면서 코틀린도 동시성 프로그래밍을 지원하기 시작했다.
3. 간결성과 표현력
개발자의 생산성은 다른 사람이 짠 코드를 얼마나 빨리 이해하느냐에 달려있다. 다른사람이 짠 코드를 얼마나 빠르게 읽고 이해할 수 있는 코드를 작성할 수 있는지와 주로 연관된다.
코틀린은 필드 게터(getter)나 세터(setter), 익명 클래스, 명시적인 위임 등과 같은 자바의 악며 높은 불필요한 준비 코드를 제거하고 언어를 가능한 한 간결하게 만들기 위해 노력했다. 또한 간결성을 너무 과용하지 못하게 주의도 기울였다. 예를들어, 스칼라와 달리 코틀린에서는 커스텀 연산자를 정의할 수 없고 기존의 연산자만 재정의할 수 있다. 이는 새 연산자로 인해 연산의 의미가 혼란스러워지기 때문이다.
4. 상호 운용성
코틀린은 독립적으로 존재하는 언어가 아니며 가능한 한 기존의 자바 코드 기반과 부드럽게 협력해야만 했으므로, 자바 상호 운용성은 코틀린 설계 시 중요한 목적이었다.
또한 JVM을 능가하고 다른 플랫폼으로 퍼져 나감에 따라 상호 운용성 보장은 자바스크립트, 즉 JS플랫폼이나 네이티브 애플리케이션인 C/C++/오브젝티브 C/스위프트 코드와의 상호 작용까지 포함하는 범위로 확장했다.
5. 다중 플랫폼
4번과 같은 이유로 다중 플랫폼 지원의 필요성이 제기되었다. 여전히 JVM과 안드로이드가 코틀린 개발의 주 대상이지만 아래와 같은 플랫폼도 지원한다.
- 브라우저나 노드(Node.js) 애플리케이션, 자바스크립트 라이브러리까지 포함하는 자바스크립트 지원
- macOS나 리눅스, 윈도우 라이브러리 및 애플리케이션을 포함하는 네이티브 지원
코틀린 1.3 버전부터 다중 플랫폼 개발을 지원하며, 주된 용례로는 안드로이드와 iOS 애플리케이션 사이에 코드 기반을 공유하거나 JVM/JS/네이티브 세계에서 사용할 다중 플랫폼 라이브러리를 만드는 것이 있다.
코틀린 개발
1. 코루틴
일시 중단 가능한 계산(suspendable computation)이라는 개념 덕분에 코틀린은 async/await, 퓨처(future), 프라미스(promise), 액터(actor) 등의 동시성 관련 프로그래밍 패턴을 지원할 수 있다.
- 스레드에 대한 더 가벼운 대안
- 유연한 스레드 디스패치 메커니즘
- 일시 중단 가능한 시퀀스와 이터레이터
- 채널을 사용한 메모리 공유
- 액터를 통해 메세지 전송 방식으로 상태 공유
2. 테스트
테스트를 정의하거나 객체를 모킹(mocking)하고 싶을 때 Junit, TestNG, 모키토(mockito) 같은 익숙한 자바 테스트 프레임워크 중 일부를 거의 아무런 노력도 기울이지 않고 코틀린에 적용할 수 있다.
- 모키토-코틀린은 유명한 모키토 프레임워크를 확장한 것으로 코틀린 객체 모킹을 단순화해서 준다.
- 스펙은 행위주도 테스트 프레임워크로, 자스민이나 저킨 스타일의 테스트 케이스 정의를 지원한다.
- 코테스트는 스칼라테스트에 의해 영감을 얻은 프레임워크로, 유연한 테스트 정의와 단언문을 지원한다.
3. 안드로이드 개발
안드로이드는 코틀린의 주된 응용 분야이자 가장 활발하게 성장하는 분야이다.
안드로이드 개발자는 대거(Dagger), 버터나이프(ButterKnife), DB플로(DBFlow)등 여러 유명한 프레임워크와의 원활한 상호 운용성을 얻을 수 있다. 코틀린에 특화된 안드로이드 개발 도구 중에서는 안코(Anko)와 코틀린 안드로이드 확장(Kotlin Android Extension)등이 있었고, 현재는 구글이 제공하는 젯팩(JetPack)을 주목할만 하다.
4. 웹 개발
웹/엔터프라이즈 애플리케이션 개발자들도 코틀린의 이점을 살릴 수 있다. 스프링 5.0이나 Vert.x 3.0과 같은 유명한 프레임워크들은 자신의 기능을 좀 더 코틀린다운 방식으로 활용할 수 있게 해주는 코틀린용 확장을 제공한다.
- Ktor는 젯브레인즈에서 만든 비동기 서버와 클라이언트 애플리케이션 작성을 위한 프레임워크다.
- kotlix.html은 HTML 문서를 만들기 위한 DSL이다.
- Kodein은 의존 관계 주입 프레임워크다.
5. 데스크톱 애플리케이션
JVM 플랫폼상의 데스크톱 애플리케이션 개발자는 자바FX 기반의 토네이도 FX를 사용할 수 있다. 토네이도 FX는 CSS를 통해 스타일을 지정하고 GUI를 쉽게 만들 수 있는 영역 특화 언어를 제공하며, FXML 마크업과 MVC/MVP 아키텍처를 지원한다.
참고 서적
https://www.yes24.com/Product/Goods/107698728
'Programming Language > Kotlin' 카테고리의 다른 글
[Kotlin] Kotlin Coroutines에서 Launch 와 Async (0) | 2024.03.01 |
---|---|
[Kotlin] coroutineScope와 supervisorScope (0) | 2024.01.20 |
[Kotlin] var, val 차이 간단 정리 (0) | 2023.07.04 |
[Kotlin] static, object, companion object 정리 (0) | 2023.01.14 |
[Kotlin] Scope Function 정리 (let, run, with, apply, also) (0) | 2023.01.01 |