ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Kotlin] Kotlin 시작하기 전 - 특성, 장점 그리고 철학
    프로그래밍 언어/자바 & 코틀린 2019. 11. 28. 23:41

    코틀린을 카카오에서 처음 사용해봤는데, 그 간결성과 편리함에 완전 빠졌다. 코틀린의 특징, 장점 그리고 철학들을 정리해두자.

     

    특성

    1. 대상 플랫폼 : 서버, 안드로이드 등 자바가 실행되는 모든 곳

    • 서버상의 코드(특히 웹 애플리케이션의 백엔드)
    • 안드로이드 디바이스에서 실행되는 모바일 애플리케이션

    2. 정적 타입 지정 언어

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

     

    동적 타입(dynamically typed) 지정 언어는 Groovy, JRuby, Javascript 등이 있는데, 타입과 관계없이 모든 값을 변수에 넣을 수 있고, 메소드나 필드 접근에 대한 검증이 실행 시점에 일어나며, 그에 따라 코드가 더 짧아지고 데이터 구조를 더 유연하게 생성하고 사용할 수 있다. 하지만, 반대로 이름을 잘못 입력하는 등의 실수도 컴파일 시 걸러내지 못하고 실행 시점에 오류가 발생한다.

     

    한편 코틀린은 자바와 달리 모든 변수의 타입을 개발자가 직접 명시할 필요가 없다. 코틀린 컴파일러가 문맥으로부터 변수 타입을 자동으로 유추할 수 있기 때문에 개발자는 타입 선언을 생략해도 된다. 이런 기능을 타입 추론(type inference)이라고 한다.

    정적 타입 지정의 장점

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

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

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

    타입 시스템에서 새로운 점

    • 널이 될 수 있는 타입을 지원한다.
      • 컴파일 시점에 널 포인터 예외가 발생할 수 있는지 여부를 검사할 수 있어서 신뢰성을 높임
    • 함수 타입에 대한 지원(아래 - 함수형 프로그래밍 참조)

    3. 함수형 프로그래밍

    일급시민인(first-class) 함수: 함수(프로그램의 행동을 나타내는 코드조각)을 일반 값처럼 다룰 수 있다. 함수를 변수에 저장할 수 있고, 인자로 다른 함수에 전달할 수 있으며, 함수에서 새로운 함수를 만들어서 반환할 수 있다.

     

    불변성: 함수형 프로그래밍에서는 일단 만들어지고 나면 내부 상태가 절대로 바뀌지 않는 불변 객체를 사용해 프로그램을 작성한다.

     

    부수효과(side effect) 없음: 함수형 프로그래밍에서는 입력이 같으면 항상 같은 출력을 내놓고 다른 객체의 상태를 변경하지 않으며, 함수 외부나 다른 바깥 환경과 상호작용하지 않는 순수 함수(pure function)을 사용한다.

     

    간결성 : 함수를 값처럼 활용하면 더 강력한 추상화를 할 수 있고, 강력한 추상화를 통해 코드 중복을 막을 수 있다.

     

    다중 스레드에 대한 안전성: 다중 스레드 프로그램에서는 적절한 동기화 없이 같은 데이터를 여러 스레드가 변경하는 경우 가장 많은 문제가 생긴다. 불변 데이터 구조를 사용하고 순수 함수를 그 데이터 구조에 적용한다면 다중 스레드 환경에서 같은 데이터를 여러 스레드가 변경할 수 없다. 따라서 복잡한 동기화를 적용하지 않아도 된다.


    철학

    1. 실용성

    • 코틀린은 연구를 위한 언어가 아니다. 최신 프로그래밍 언어 설계를 앞서 채택하거나 전산학계에서 연구중인 혁신적인 아이디어를 코틀린을 통해 탐구하려고 하지 않는다. 대신, 코틀린은 다른 프로그래밍 언어가 채택한 이미 성공적으로 검증된 해법과 기능에 의존한다. 이로 인해 언어의 복잡도가 줄어들고 이미 알고 있는 기존 개념을 통해 코틀린을 더 쉽게 배울 수 있다.
    • 도구를 강조한다. 코틀린의 경우 인텔리J 아이디어의 개발과 컴파일러의 개발이 맞물려 이뤄져 왔다. 그리고 코틀린 언어의 특성은 항상 도구의 활용을 염두에 두고 설계돼 왔다.

     

    2. 간결성

    • getter, setter, 생성자 파라미터를 필드에 대입하기 위한 로직 등 자바에 존재하는 여러 가지 번거로운 준비 코드를 코틀린은 묵시적으로 제공한다.
    • 다양한 표준 라이브러리를 제공해서 반복되거나 길어질 수 있는 코드를 라이브러리 함수 호출로 대치한다.

     

    3. 안정성

    • 일반적으로 프로그래밍 언어가 안전하다는 말은 프로그램에서 발행할 수 있는 오류 중에서 일부 유형의 오류를 프로그램 설계가 원천적으로 방지해준다는 뜻이다.
    • 코틀린을 JVM에서 실행한다는 사실은 이미 상당한 안정성을 보장할 수 있다는 뜻이다. JVM을 사용하면 메모리 안전성을 보장하고, 버퍼 오버플로를 방지하며, 동적으로 할당한 메모리를 잘못 사용함으로 인해 발생할 수 있는 다양한 문제를 예방할 수 있다.
    • 자바보다 더 적은 비용으로 타입 안전성을 사용할 수 있다. 코틀린 컴파일러가 대부분 타입을 자동으로 추론해주기 때문에 직접 타입 정보를 지정할 필요가 없다.
    • 실행 시점에 오류를 발생시키는 대신 컴파일 시점 검사를 통해 오류를 더 많이 방지해준다.
      • 코틀린은 프로그램의 NullPointerException을 없애기 위해 노력한다. 코틀린의 타입 시스템은 null이 될 수 없는 값을 추적하며, 실행 시점에 NullPointerException이 발생할 수 있는 연산을 사용하는 코드를 금지한다.
      • ClassCastException을 방지해준다. 자바에서는 타입 검사와 그 직후 이뤄지는 타입 캐스트에서 같은 타입이름을 반복하기 귀찮아서 타입 검사를 생략하는 개발자가 많다. 코틀린에서는 타입 검사와 캐스트가 한 연산자에 의해 이뤄진다. ('is'를 사용해서)

     

    4. 상호운용성

    • 자바 메소드를 호출하거나 자바 클래스를 상속-inherit(확장-extend)하거나 인터페이스를 구현하거나 자바 애노테이션을 코틀린 코드에 적용하는 등의 일이 모두 가능하다.
    • 코틀린은 기존 자바 라이브러리를 가능하면 최대한 활용한다는 점이다. 코틀린은 자체 컬렉션 라이브러리를 제공하지 않고 자바 표준 라이브러리 클래스에 의존한다.
    • 코틀린은 자바와 코틀린 소스 파일이 임의로 섞여 있어도 제대로 프로그램을 컴파일 할 수 있다.

     

     

    출처: Kotlin in action - 드미트리 제메로프, 스베트라나 이사코바 저/오현석 역(에이콘 출판사)

Designed by Tistory.