코틀린 언어의 특징
정적 타입 지정 언어
코틀린은 정적 타입 지정 언어로, 모든 프로그램 구성 요소의 타입을 컴파일 시점에 알 수 있고 프로그램 안에서 객체의 필드나 메소드를 사용할 때마다 컴파일러가 타입을 검증해준다.
그루비를 비롯한 동적 타입 지정 언어는 타입과 관계 없이 모든 값에 변수를 넣을 수 있고 메서드나 필드 접근에 대한 검증이 런타임에 일어나기 때문에 컴파일 타임에 타입 오류를 잡지 못할 가능성이 높다.
코틀린에서는 컴파일러가 타입 추론 기능을 제공하기 때문에 아래와 같이 타입 선언을 생략해도 된다.
정적 타입 지정의 장점은 아래와 같다.
성능 : 실행 시점에 어떤 메소드를 호출할지 알아내는 과정이 필요 없으므로 메소드 호출이 더 빠르다.
신뢰성 : 컴파일러가 프로그램의 정확성을 검증하기 때문에 실행 시 프로그램이 오류로 중단될 가능성이 더 적어진다.
유지 보수성 : 코드에서 다루는 객체가 어떤 타입에 속하는지 알 수 있기 때문에 처음 보는 코드를 다룰 때도 더 쉽다.
도구 지원 : 정적 타입 지정을 활용하면 더 안전하게 리팩토링 할 수 있고, 도구는 더 정확한 코드 완성 기능을 제공할 수 있으며, IDE의 다른 지원 기능도 더 잘 만들 수 있다.
Nullable
코틀린은 nullable 타입을 지원하여 컴파일 시점에 NullPointerException의 발생 여부를 검사할 수 있다.
함수형 프로그래밍
함수형 프로그래밍에서는
함수를 일급 시민으로 간주하여 일반 값처럼 다룰 수 있다. 함수를 인자로 다른 함수에 전달하고, 함수에서 새로운 함수를 만들어서 반환할 수 있다.
한번 생성되면 내부 상태가 변하지 않는 불변 객체를 사용해 프로그램을 작성한다.
입력이 같으면 항상 같은 출력을 반환하고 다른 객체의 상태를 변경하지 않으며, 함수 외부나 다른 바깥 환경과 상호작용하지 않는 순수 함수를 사용한다.
불변 객체를 사용하며 순수 함수를 사용하기에 다중 스레드를 사용해도 안전하다.
부수 효과가 없는 함수를 테스트할 때 미리 준비할 사항이 없기 때문에 독립적으로 테스트할 수 있다.
코틀린은 함수형 프로그래밍을 지원하기 위해
함수 타입을 지원하여 함수를 파라미터로 받거나 반환할 수 있다.
람다 식을 지원하여 코드 블록을 쉽게 정의하여 사용할 수 있다.
데이터 클래스를 제공하여 불변 객체를 간편하게 만들 수 있다.
코틀린 표준 라이브러리에서 객체와 컬렉션을 함수형 스타일로 다룰 수 있는 API를 제공한다.
자바와의 비교
자바 클래스를 코틀린이 상속받을 수 있고, 코틀린 클래스의 메서드나 필드에 자바 어노테이션을 붙일 수도 있다.
코틀린 컴파일러가 생성한 바이트코드는 일반적인 자바 코드와 동일하게 효율적으로 실행된다.
코틀린 런타임 시스템은 상당히 작으므로 컴파일 후 패키징한 애플리케이션 크기도 자바에 비해 크게 늘어나지 않는다.
대부분의 코틀린 표준 라이브러리 함수는 인자로 람다를 받으면 인라이닝 하기 때문에 새로운 객체가 생성되지 않아 GC 문제와는관련이 없다.
코틀린의 철학
실용성
언어의 복잡도가 낮고 이미 알고 있는 기존의 개념을 사용하므로 학습에 어려움이 없고, 대규모 시스템에서 사용하기에 적합하다.
IDE의 언어 지원을 적극적으로 하여 인텔리제이의 자동 수정 기능 등을 대폭 활용할 수 있다.
간결성
자바에 존재하는 여러 번거로운 보일러 플레이트 코드(getter, setter, 생성자 파라미터 대입 로직 등)를 묵시적으로 제공한다.
람다를 지원하여 작은 코드 블록을 라이브러리 함수에 쉽게 전달할 수 있다. 일반적인 기능을 라이브러리 안에 캡슐화하고 작업에 따라 달라져야 하는 개별적인 내용을 사용자가 작성한 코드 안에 남겨둘 수 있다.
안전성
컴파일러가 프로그램 코드와 작동 의도가 일치하는지 검증하려면 자세한 프로그램 작동 정보를 전달받아야 한다. 이렇게 안전성을 보장하기 위해서는 프로그램에 많은 정보를 덧붙여야 하여 생산성이 떨어진다.
코틀린은 JVM에서 실행되는 정적 타입 지정 언어로 타입 안전성이 보장된다.
프로그램의 NullPointerException을 없애기 위해 null이 될 수 없는 값을 추적하며, 실행 시점에 NullPointerException가 발생할 수 있는 연산을 사용하지 못하도록 한다.
타입 검사와 캐스팅이 한 연산자에 의해 이뤄지므로 ClassCastException을 방지한다.
상호 운용성
자바 코드에서 코틀린 코드를 호출할 수 있다.
코틀린은 자체 컬렉션 라이브러리 대신 자바 표준 라이브러리 클래스를 확장해 사용한다.
자바 메서드 리팩토링 시 해당 메서드와 관련된 코틀린 코드도 변경된다. 반대 방향도 마찬가지이다.
컴파일
코틀린 컴파일러는 .kt 확장자를 가진 코틀린 소스코드를 .class 파일로 변환한다. 이는 자바의 컴파일과 동일하다.
아래와 같이 코틀린 컴파일러로 코틀린 런타임을 포함한 jar 파일을 만들고 실행시킬 수 있다.
코틀린 컴파일러로 생성한 코드는 코틀린 런타임 라이브러리를 통해 실행할 수 있으므로 코틀린으로 컴파일한 애플리케이션을 배포하기 위해서는 런타임 라이브러리도 함께 배포되어야 한다.
Last updated