코틀린 언어의 특징

정적 타입 지정 언어

  • 코틀린은 정적 타입 지정 언어로, 모든 프로그램 구성 요소의 타입을 컴파일 시점에 알 수 있고 프로그램 안에서 객체의 필드나 메소드를 사용할 때마다 컴파일러가 타입을 검증해준다.

  • 그루비를 비롯한 동적 타입 지정 언어는 타입과 관계 없이 모든 값에 변수를 넣을 수 있고 메서드나 필드 접근에 대한 검증이 런타임에 일어나기 때문에 컴파일 타임에 타입 오류를 잡지 못할 가능성이 높다.

  • 코틀린에서는 컴파일러가 타입 추론 기능을 제공하기 때문에 아래와 같이 타입 선언을 생략해도 된다.

var x = 1
  • 정적 타입 지정의 장점은 아래와 같다.

    • 성능 : 실행 시점에 어떤 메소드를 호출할지 알아내는 과정이 필요 없으므로 메소드 호출이 더 빠르다.

    • 신뢰성 : 컴파일러가 프로그램의 정확성을 검증하기 때문에 실행 시 프로그램이 오류로 중단될 가능성이 더 적어진다.

    • 유지 보수성 : 코드에서 다루는 객체가 어떤 타입에 속하는지 알 수 있기 때문에 처음 보는 코드를 다룰 때도 더 쉽다.

    • 도구 지원 : 정적 타입 지정을 활용하면 더 안전하게 리팩토링 할 수 있고, 도구는 더 정확한 코드 완성 기능을 제공할 수 있으며, IDE의 다른 지원 기능도 더 잘 만들 수 있다.

Nullable

  • 코틀린은 nullable 타입을 지원하여 컴파일 시점에 NullPointerException의 발생 여부를 검사할 수 있다.

함수형 프로그래밍

  • 함수형 프로그래밍에서는

    • 함수를 일급 시민으로 간주하여 일반 값처럼 다룰 수 있다. 함수를 인자로 다른 함수에 전달하고, 함수에서 새로운 함수를 만들어서 반환할 수 있다.

    • 한번 생성되면 내부 상태가 변하지 않는 불변 객체를 사용해 프로그램을 작성한다.

    • 입력이 같으면 항상 같은 출력을 반환하고 다른 객체의 상태를 변경하지 않으며, 함수 외부나 다른 바깥 환경과 상호작용하지 않는 순수 함수를 사용한다.

    • 불변 객체를 사용하며 순수 함수를 사용하기에 다중 스레드를 사용해도 안전하다.

    • 부수 효과가 없는 함수를 테스트할 때 미리 준비할 사항이 없기 때문에 독립적으로 테스트할 수 있다.

  • 코틀린은 함수형 프로그래밍을 지원하기 위해

    • 함수 타입을 지원하여 함수를 파라미터로 받거나 반환할 수 있다.

    • 람다 식을 지원하여 코드 블록을 쉽게 정의하여 사용할 수 있다.

    • 데이터 클래스를 제공하여 불변 객체를 간편하게 만들 수 있다.

    • 코틀린 표준 라이브러리에서 객체와 컬렉션을 함수형 스타일로 다룰 수 있는 API를 제공한다.

자바와의 비교

  • 자바 클래스를 코틀린이 상속받을 수 있고, 코틀린 클래스의 메서드나 필드에 자바 어노테이션을 붙일 수도 있다.

  • 코틀린 컴파일러가 생성한 바이트코드는 일반적인 자바 코드와 동일하게 효율적으로 실행된다.

  • 코틀린 런타임 시스템은 상당히 작으므로 컴파일 후 패키징한 애플리케이션 크기도 자바에 비해 크게 늘어나지 않는다.

  • 대부분의 코틀린 표준 라이브러리 함수는 인자로 람다를 받으면 인라이닝 하기 때문에 새로운 객체가 생성되지 않아 GC 문제와는관련이 없다.

코틀린의 철학

  • 실용성

    • 언어의 복잡도가 낮고 이미 알고 있는 기존의 개념을 사용하므로 학습에 어려움이 없고, 대규모 시스템에서 사용하기에 적합하다.

    • IDE의 언어 지원을 적극적으로 하여 인텔리제이의 자동 수정 기능 등을 대폭 활용할 수 있다.

  • 간결성

    • 자바에 존재하는 여러 번거로운 보일러 플레이트 코드(getter, setter, 생성자 파라미터 대입 로직 등)를 묵시적으로 제공한다.

    • 람다를 지원하여 작은 코드 블록을 라이브러리 함수에 쉽게 전달할 수 있다. 일반적인 기능을 라이브러리 안에 캡슐화하고 작업에 따라 달라져야 하는 개별적인 내용을 사용자가 작성한 코드 안에 남겨둘 수 있다.

  • 안전성

    • 컴파일러가 프로그램 코드와 작동 의도가 일치하는지 검증하려면 자세한 프로그램 작동 정보를 전달받아야 한다. 이렇게 안전성을 보장하기 위해서는 프로그램에 많은 정보를 덧붙여야 하여 생산성이 떨어진다.

    • 코틀린은 JVM에서 실행되는 정적 타입 지정 언어로 타입 안전성이 보장된다.

    • 프로그램의 NullPointerException을 없애기 위해 null이 될 수 없는 값을 추적하며, 실행 시점에 NullPointerException가 발생할 수 있는 연산을 사용하지 못하도록 한다.

    • 타입 검사와 캐스팅이 한 연산자에 의해 이뤄지므로 ClassCastException을 방지한다.

  • 상호 운용성

    • 자바 코드에서 코틀린 코드를 호출할 수 있다.

    • 코틀린은 자체 컬렉션 라이브러리 대신 자바 표준 라이브러리 클래스를 확장해 사용한다.

    • 자바 메서드 리팩토링 시 해당 메서드와 관련된 코틀린 코드도 변경된다. 반대 방향도 마찬가지이다.

컴파일

  • 코틀린 컴파일러는 .kt 확장자를 가진 코틀린 소스코드를 .class 파일로 변환한다. 이는 자바의 컴파일과 동일하다.

  • 아래와 같이 코틀린 컴파일러로 코틀린 런타임을 포함한 jar 파일을 만들고 실행시킬 수 있다.

kotlinc <파일 혹은 디렉토리> -include-runtime -d <jar 이름>
java -jar <jar 이름>
  • 코틀린 컴파일러로 생성한 코드는 코틀린 런타임 라이브러리를 통해 실행할 수 있으므로 코틀린으로 컴파일한 애플리케이션을 배포하기 위해서는 런타임 라이브러리도 함께 배포되어야 한다.

Last updated