코틀린[Kotlin] #01_코틀린이란?
안녕하세요. 문범우입니다.
최근 팀 동료분들과 함께 Kotlin 스터디를 하게 되었습니다. 빠르게 관련 서적을 함께 공부하고 이후 무언가를 만들어보기로 목표를 가지고 진행합니다. 우선적으로는, 책의 내용을 공부하며 블로그에 포스팅을 진행할 예정입니다. 서적은 [Kotlin in Action, 드미트리 제메로프/스베트라나 이사코바 지음, 오현석 옮김, 에이콘출판사]를 참고합니다.
잘못된 내용이나 궁금한 사항에 대해서는 언제든 연락주시면 감사하겠습니다.
1. 코틀린이란 무엇인가?
코틀린(Kotlin)이란 기존의 자바 플랫폼에서 돌아가는 새로운 프로그래밍 언어이다.
앞으로 함께 알아보겠지만 코틀린은 간결하고, 실용적이면서도 자바 코드와 상호운용성(interoperability)을 중요시한다. 즉, 현재 자바가 사용되는 곳에서는 거의 대부분 코틀린을 적용시킬 수 있다.
우선 코틀린에 대한 짧은 코드를 살펴보자.
https://try.kotlinlang.org/ 에 접속하면 빠르게 코드를 작성하여 테스트해볼 수 있다.
1 2 3 4 5 6 7 8 9 10 | // data 클래스 data class Person(val name: String, val age: Int? = null) // null값이 허용되는 int타입(Int?), 디폴트 값은 null fun main(args: Array<String>) { // 최상위 함수 val persons = listOf(Person("영희"), Person("철수", age=29)) val oldest = persons.maxBy {it.age ?: 0} // 람다 식과 엘비스 연산자 println("나이가 가장 많은 사람: $oldest") // 문자열 템플릿 } | cs |
물론 위의 코드에 대해서 명확하게 파악되지 않는 것이 당연하다. 그냥 이러한 것들도 있구나 정도로 가볍게 받아들이면 좋다.
나중에 더 자세하게 다루겠지만, 코틀린에서는 프로그래머가 직접 타입을 지정하지 않는다. 그렇다면 동적 프로그래밍 언어로 생각할 수 있지만, 코틀린은 정적 프로그래밍언어이다. 프로그래머가 직접 타입을 지정하지 않아도 컴파일러가 문맥을 고려하여 변수의 타입을 결정하는, 타입추론(type inference)가 지원된다.
또한, 코틀린의 타입 시스템은 Null이 될 수 없는 값을 추적하며, 실행 시점에 NullPointerException이 발생할 수 있는 연산을 골라낸다. 특정 타입이null이 될 수 있는지는 ?기호를 추가하면 된다.
위 코드에서 잠시 등장한 엘비스 연산자라고 부르는 ?: 는 age가 null인 경우에 0을 반환한다는 의미이다.
이제 이러한 코틀린에 대해 몇가지 특성을 함께 알아보자.
2. 코틀린의 특성
2-1. 정적 타입 지정 언어
앞에서 잠깐 언급하였듯이 코틀린은 자바와 같이 정적 타입(statically typed) 지정 언어이다. 정적 타입 지정 언어라는 것은 컴파일 시점에 구성 요소의 타입을 알 수 있고, 컴파일러가 타입을 검증해준다는 것이다.
대표적으로 파이썬(python)언어는 동적 타입 지정 언어이다. 동적 타입 지정 언어는 타입과 관계 없이 모든 값을 변수에 넣을 수 있고, 이로 인해 코드가 더 간결해지고 데이터 구조 자체를 유연하게 사용할 수 있다. 하지만 파이썬 언어를 다뤄본 사람이라면 알 수 있듯이, 컴파일시 타입에 대한 검증이 없기 때문에 실행 시점(run time)에 에러가 발생할 수 있다.
한편 코틀린은 정적 타입 지정언어 임에도 불구하고 자바와는 달리 모든 변수의 타입을 프로그래머가 직접 명시해주지 않아도 된다. 컴파일러가 문맥을 고려하여 변수 타입을 결정한다. 그리고 이러한 기능을 타입 추론(type inference)이라고 부른다.
정적 타입 지정 언어의 장점은 다음과 같다.
- 성능: 실행 시점에서 어떤 메소드를 호출할지 알아야하는 과정이 필요 없기에 메소드 호출이 더 빠르다.
- 신뢰성: 컴파일러가 프로그램의 정확성을 검증하기 때문에 실행 시 프로그램이 오류로 중단될 가능성이 더 적다.
- 유지보수성: 코드에서 다루는 객체가 어떤 타입에 속하는지 알 수 있기 때문에 유지보수가 편리하다.
- 도구지원: 정적 타입 지정을 활용하면 더 안전하게 리팩토링(refactoring) 할 수 있고, 도구는 더 정확한 코드 완성 기능을 제공할 수 있다.
또한 코틀린은 널이 될 수 있는 타입, nullable type을 지원한다. 널이 될 수 있는 타입을 지원함에 따라서 컴파일 시점에 널 포인터 예외(Null pointer exception)가 발생할 수 있는지 여부를 검사할 수 있고, 이는 프로그램의 신뢰성이 높아지는 것을 의미한다.
2-2. 함수형 프로그래밍
자바와 달리 코틀린의 타입 시스템에 있는 새로운 내용은 함수 타입(function type)이다.
자바 개발자라면 일반적으로 객체지향(object oriented) 프로그래밍의 핵심 개념에 잘 이해하고 있을 것이다. 코틀린은 객체지향 뿐 아니라 함수형 프로그래밍을 잘 지원하고 있다.
함수형 프로그래밍의 핵심 개념은 다음과 같다.
- 일급 시민인(first-class) 함수: 함수를 일반 값처럼 다룰 수 있다. 함수를 변수에 저장할 수 있으며, 함수를 다른 함수에 인자로 전달할 수도 있다. 또한 함수에서 새로운 함수를 만들어서 반환할 수 있다.
- 불변성(immutability): 함수형 프로그래밍에서는 일단 만들어지고 나면 내부 상태가 절대로 바뀌지 않는 불변 객체를 사용하여 프로그램을 작성한다.
- 부수 효과(side effect) 없음: 함수형 프로그래밍에서는 입력이 같으면 항상 같은 출력을 내놓고 다른 객체의 상태를 변경하지 않는다. 또한 함수 외부나 다른 바깥 환경과 상호작용하지 않는 순수 함수를 사용한다.
이러한 핵심개념을 가진 함수형 프로그래밍 스타일로 프로그램을 작성하면, 간결성과 다중 스레드 사용시 안정성을 얻을 수 있다.
3. 코틀린의 철학
처음에 이야기 하였듯, 코틀린은 자바와의 상호운용성에 초첨을 맞춘 언어이고, 실용적이며 간력한 언어라고 하였다. 그렇다면 코틀린의 철학은 무엇일까? 4가지 키워드, 실용성/간결성/안전성/상호운용성으로 알아보도록 하자.
3-1. 실용성
코틀린은 어느 특정 프로그래밍 스타일이나 패러다임을 사용할 것을 강제로 요구하지 않는다. 특히, 자바에서 사용해 온 익숙한 프로그래밍 스타일이나 기법을 코틀린에서도 사용할 수 있다.
3-2. 간결성
코틀린은 만들어지면서 프로그래머가 작성하는 코드에서 의미가 없는 부분을 줄이고 언어가 요구하는 구조를 만족하기 위해, 별 뜻은 없지만 프로그램에 꼭 넣어야하는 부수적인 요소를 줄이기 위해 많은 노력이 가해졌다.
다른 최신 언어와 마찬가지로 코틀린은 기능이 다양한 표준 라이브러리를 제공하기 때문에 반복되거나 길어질 수 있는 코드를 라이브러리 함수 호출로 대치할 수 있다.
3-3. 안전성
코틀린은 우선 JVM에서 실행한다는 사실 자체에서 이미 상당한 안전성을 보장할 수 있다는 의미를 갖는다. JVM을 사용함으로써 메모리 안전성을 보장하고, 버퍼 오버플로우를 방지하며, 동적으로 할당한 메모리를 잘못 사용함으로 인해 발생할 수 있는 다양한 문제를 예방할 수 있다. 또한 정적 타입 지정언어로서 타입 안전성을 보장하지만, 타입 추론을 통해 더 적은 비용으로 그러한 안전성을 가질 수 있다.
3-4. 상호운용성
코틀린은 기존 라이브러리를 그대로 사용할 수 있다. 자바 메소드를 호출하거나 자바 클래스를 상속하거나 인터페이스를 구현하거나 자바 어노테이션을 코틀린 코드에 적용하는 등의 모든 일이 가능하다.
또한 자바코드에서 코틀린 코드를 호출할 때에도 아무런 노력이 필요 없다. 코틀린의 클래스나 메소드를 일반적인 자바 클래스나 메소드와 똑같이 사용할 수 있다. 이에 따라 자바와 코틀린 코드를 프로젝트에서 원하는 대로 섞어 쓸 수 있다는 궁극적인 유연성을 지닌다.
4. 코틀린 코드 컴파일
코틀린 소스코드는 .kt라는 확장자를 파일에 붙인다. 코틀린 컴파일러는 자바 컴파일러가 자바 소스코드를 컴파일 할 때와 마찬가지로 코틀린 소스코드를 분석하여 .class 파일을 만들어낸다.
코틀린 컴파일러로 컴파일한 코드는 코틀린 런타임 라이브러리(kotlin runtime library)에 의존한다. 런타임 라이브러리에는 코틀린에서 자바 API의 기능을 확장한 내용과, 코틀린 자체 표준 라이브러리 클래스 내용으로 이루어져 있다. 코틀린으로 컴파일한 애플리케이션을 배포할 때는 런타임 라이브러리도 함께 배포해야 한다.
참고 서적 및 링크
* [Kotlin in Action] - 드미트리 제메로프/스베트라나 이사코바 지음, 오현석 옮김, 에이콘 출판사
* 코틀린 온라인 놀이터 - https://try.kotlinlang.org/