학교에서 모바일프로그래밍 수업을 들으면서 코틀린의 존재 정도는 알고 있었다. 그러다가 요즘 자바를 사용하는 서버상의 코드(특히 백엔드), 안드로이드 기반에 모바일 어플리케이션과 같은 영역은 현업에서 대부분 코틀린으로 넘어갔다는 말을 듣고 관심이 가 더 알아보고자 한다.
코틀린은 2011년 7월 IntelliJ, PyCharm 등을 만든 JetBrains 사에서 개발한 JVM에서 동작하는 프로그래밍 언어다. JVM 기반 언어이기에 2017년에 구글에서 코틀린을 안드로이드 공식 언어로 지정하고 2021년 부터 신규 앱 개발시 코틀린으로 개발할 것을 권장하는 등 점점 자바를 대체해가는 추세이다.
Q: 왜 구글은 코틀린을 안드로이드 공식 언어로 지정했을까?
Java는 제임스 고슬링이라는 사람으로 부터 만들어진 언어이다. 하지만 고슬링이 회사를 떠나면서 썬 마이크로시스템즈를 인수한 오라클이 Java를 관리하게 되었다.
그 후 오라클은 Java JDK 유료화 정책을 펼치게 되는데 여기서 구글과 충돌이 일어나게 된다. 구글은 이전에 Java JDK를 사용하여 안드로이드의 핵심 프레임워크와 서비스들을 개발한 상태였기에 오라클은 구글을 상대로 어마무시한 금액을 요청했다.
이에 구글은 오라클과의 분쟁을 피하고 앞으로 서술할 여러 장점들을 가지고 있는 코틀린을 Java 언어를 대체하기 위한 공식 언어로 채택하였다.
코틀린은 자바와 마찬가지로 정적 타입 지정 언어이다. 정적 타입 지정 언어란 모든 프로그램 구성요소의 타입을 컴파일 시점에 알 수 있고 객체의 필드나 메소드를 사용할 때마다 컴파일러가 타입을 검증해 주는 언어를 의미이다.
이에 반대되는 동적 타입 지정 언어(Groovy, JRuby)는 타입과 관계없이 모든 값을 변수에 넣을 수 있고 메소드나 필드 접근에 대한 검증이 실행 시점에 일어나는 언어를 의미한다. 이에 따라 코드가 간결해지고 데이터 구조를 더 유연하게 생성하고 사용할 수 있지만 컴파일 시점이 아닌 실행 시점에 오류가 확인되는 단점이 있다.
코틀린은 자바와 같이 정적 타입 지정언어이지만 자바와 달리 변수 타입을 자동으로 유추(타입 추론)이 가능하기에 타입 선언을 생략해도 된다.
var n = 1 // n을 자동으로 정수로 초기화
또한 null이 될 수 있는 타입을 지원하여 컴파일 시점에 널 포인트 익셉션이 발생할 수 있는지 여부를 검사할 수 있다.
var a: String? = null
var b: String? = "hello"
b = null // 다 가능
정적 타입 지정의 장점은 다음과 같다.
함수형 프로그래밍은 일급 객체인 함수, 불변성, side effect 없음 세가지 개념으로 이해할 수 있다.
일급 객체(first-class)인 함수
함수를 일반 값처럼 다룰 수 있다는 뜻이다. 함수를 변수에 저장하고 인자로 다른 함수에 전달할 수 있으며 함수에서 새로운 함수를 반환할 수 있다.
불변성 (immutability)
만들어 지면 내부 상태가 절대 바뀌지 않는 불변 객체를 사용하여 프로그램을 사용한다.
side effect 없음
입력이 같으면 항상 같은 출력을 내놓고 다른 객체 상태를 변경하지 않으며, 함수 외부나 다른 바깥 환경과 상호작용하지 않는 순수 함수를 사용한다. (함수 외부 변수나 환경과 상호작용하지 않는다는 뜻)
이를 통해 가지는 장점은 다음과 같다.
간결성
함수형 코드와 상응하는 명령형 코드에 비해 간결하다. 함수를 값처럼 활용하여 더 강력한 추상화가 가능하고 이를 통해 코드 중복을 막을 수 있다.
Thread Safe
멀티쓰레드를 안전하게 사용할 수 있다. 동기화 없이 같은 데이터를 여러스레드가 변경하는 Critical Section 문제를 불변성이라는 특징을 통하여 해결할 수 있다.
테스트 용이
side effect가 없기 때문에 그 함수를 독립적으로 테스트 할 수 있다.
코틀린 언어와 컴파일러, 라이브러리 및 코틀린과 관련된 모든 도구는 무료 오픈소스이기에 언제나 무료로 사용할 수 있다.
https://incheol-jung.gitbook.io/docs/study/kotlin-in-action/1