Kotlin 과의 첫 만남

최근 1차 마무리를 지은 웹 기반 프로젝트를 Kotlin 을 사용하여 개발하였다. 새로운 언어에 대한 학습과 적용을 개인적으로 즐기는 쪽이라 프로젝트를 수행하는 내내 재미있기도 했고, (아직 보완해야 할 점이 많긴 하지만..) 나름 괜찮은 결과물이 나온 듯 하여 스스로 만족스러워 하는 프로젝트였다.

Kotlin 을 사용해 본 경험상 느낌 좋은 프로그래밍 언어라는 생각(매우 주관적인 생각임.)이 들어 관련 주제로 글들을 한번 정리 해보려한다. 과연 내가 꾸준하게 쓸 수 있을까..? 란 스스로에 대한 의구심이 순간 순간 내 의식을 지배하지만...

"에이~ 몰라! 일단 시작해보는거지!!"

Kotlin 의 탄생

Kotlin 은 IntelliJ IDEA(이하 인텔리제이) 로 유명한 젯브레인즈(JetBrains) 라는 회사에서 개발한 언어이다. 인텔리제이를 회사에서 주로 사용하고 있긴 했지만, 이 회사가 체코에 본사를 둔 회사라는 걸 Kotlin 을 공부하면서 처음 알았다.

더구나, Kotlin 개발팀의 대부분이 살고 있는 곳이 러시아 상트페테르부르크이며, Kotlin 이란 이름은 이곳 근처에 있는 섬 이름에서 차용해왔다는 것도 처음 알게 된 사실이었다. "크고 유명한 소프트웨어 회사는 미국에 있겠지~" 라는 나의 편협한 생각을 단번에 깨부숴주는 기회였달까..

여기가 Kotlin 섬. (출처: https://alchetron.com/Kotlin-Island)Kotlin 섬

Kotlin 이 외부에 첫 모습을 드러낸 건 2011년 JVM Language Summit 에서다. 이후 정식 1.0버전이 발표되기까지 5년 정도의 시간이 더 필요하긴 했지만, 지금까지 거의 10년 정도의 시간동안 개발되어 온 언어이다. 내가 모르고 있었을 뿐이지 갑자기 툭~ 튀어나온 그런 언어는 아니란 얘기다.

Kotlin 의 철학

새로운 언어를 공부할 때 그 언어가 가진 컨셉이나 철학을 먼저 정리하고, 이를 염두에 두면서 공부하면 언어에 대한 이해가 좀 더 수월하다 생각한다. 그런 의미에서 Kotlin 의 철학을 먼저 정리해보자.

(참고: 아래의 내용은 Kotlin in Action 에 정리되어 있는 내용을 요약한 것입니다.)

실용성

Kotlin 은 연구를 위한 언어가 아닌 실제 문제를 해결하기 위해 만들어진 실용적인 언어다. 따라서, 학계에서 연구 중인 혁신적인 아이디어를 채택하기 보단, 이미 성공적으로 검증된 해법과 기능에 의존한다.
또한, Kotlin 은 어떤 하나의 스타일이나 패러다임에 얽매이지 않는 언어이다. 최근 주목받고 있는 함수형 프로그래밍은 물론, 기존 OOP 의 특성도 완벽하게 지원하고 있다. 언어 차원에서 강제하는 것이 없으니, 소프트웨어를 개발하는 개발자가 선호하는 방식을 활용하여 간결하게 코드를 작성할 수 있으며, 따라서, Kotlin 을 처음 활용하는 개발자도 쉽고 빠르게 Kotlin 을 활용할 수 있다.

간결성

Kotlin 의 코드는 상당히 간결하다. 게터(getter), 세터(setter), 생성자 파라미터를 필드에 대입하는 로직 같은 자바의 번거로운 준비 코드를 묵시적으로 제공해주고 있어서 이런 준비 코드로 인해 지저분해지지 않는다.
이 외에도, 타입 추론 지원과 다양한 표준 라이브러리의 제공으로 자바와 비교해 Kotlin 의 코드는 상당히 간결해졌다.

안전성

Kotlin 을 JVM 에서 실행한다는 사실 자체만으로 이미 상당한 안전성을 보장한다는 것을 알 수 있다. 이 뿐만 아니라, Kotlin 자체적인 타입 시스템을 통해 자바에 비해 높은 안전성을 보장해주는데 대표적으로 다음과 같은 내용들이 있다.

NullPointerException 억제

Kotlin 의 타입 시스템은 null 이 될 수 없는 값을 추적하여, 실행 시점에 NullPointerException 이 발생할 수 있는 코드를 금지한다. (컴파일 시점에 오류 발생)
개발자가 어떤 타입에 대해 null 값이 될 수 있는지의 여부를 명시해줘야 하긴 하지만, 코드에 안전성을 더하는 효과에 비해 그 비용은 아주 미미하다.

val s: String? = null       // 널이 될 수 있음  
val s2: String = ""         // 널이 될 수 없음  

ClassCastException 억제

어떤 객체를 다른 타입으로 변환(casting) 하기 전에 미리 검사하지 않으면 런타임에 ClassCastException 이 발생할 수 있다. 자바에서는 타입 검사와 그 후에 수행하는 타입 캐스트에서 같은 타입 이름을 반복 사용하는 것이 귀찮아 타입 검사를 생략하는 개발자가 많다. 이는 결과적으로 오류를 발생할 수 있는 여지를 남겨두게 된다.
반면, Kotlin 에서는 타입 검사와 캐스트가 한 연산자에 의해 이뤄지기때문에 이러한 오류가 발생할 가능성을 확실히 줄여준다.

if (value is String)               // 타입을 검사  
   println(value.toUpperCase())    // 검사에 성공하면, 해당 타입의 메소드나 필드에 바로 접근 가능 

상호운용성

Kotlin 은 기존 자바 라이브러리를 100% 그대로 사용할 수 있다. 자바 메소드 호출, 자바 클래스 상속, 자바 인터페이스 구현, 심지어, 자바 애노테이션도 적용할 수 있다.
개인적으로 이 점이 Kotlin 의 매우 큰 장점 중 하나라 생각하는데, 특히, 개발 언어로 자바가 대부분을 차지하고 있는 국내에서 자바와는 다른 컨셉의 개발 언어를 사용하고자하는 개발자가 본인이 속한 회사를 상대로 "나 자바 말고 이거 써보고 싶어요~" 하고 설득(?)하는데 결정적인 한방(!)으로 사용할 수 있다.

마무리

Kotlin 은 JVM 언어이다. 다른 JVM 언어와는 다르게 자바와의 호환성이 아주 좋은 언어이기도 하며, 다른 언어들이 가지고 있는 장점들을 Kotlin 나름의 문법으로 잘 버무려 제공해주기도 한다. 개인적으로는 정말 잘 만들어진 언어라 생각하며, 다른 개발자에게 주저없이 사용해보길 추천해주고 싶다.

여기서는 Kotlin 이 어떤 개발 언어인지 개략적으로 설명했는데, 앞으로는 Kotlin 언어의 문법이나 이를 어떻게 활용할 수 있는지에 대한 내용으로 글을 이을 수 있도록 노력해보려한다.