ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [KOTLIN IN ACTION] 코틀린이란 무엇이며, 왜 필요한가?
    KOTLIN/KOTLIN IN ACTION 2021. 12. 4. 00:09

    코틀린

     

    특징

    • 자바 플랫폼에서 돌아가는 새로운 프로그래밍 언어.
    • 간결하고 실용적이며, 자바 코드와의 상호 운용성을 중시한다.
    • 자바가 사용 중인 곳이라면 거의 대부분 코틀린을 활용할 수 있다.
    • 기존 자바 라이브러리나 프레임워크와 함께 잘 작동하며, 성능도 자바와 같은 수준이다.

    주요 특성

     

    코트린의 대상 플랫폼

    서버, 안드로이드 등 자바가 실행되는 모든 곳을 대상으로 하는 언어이다.

    자바보다 더 간결하고 생산적이며 안전한 대체 언어를 제공하는 목적을 가지고 있다.

    현재 자바는 세계적으로 다양한 환경에서 사용되고 있다. 그런 환경에서 코틀린을 도입한다면 더 적은 코드로 더 편하게 프로그래머의 목표를 달성할 수 있다. ex ) 서버상의 코드 (웹 백엔드, 안드로이드 어플리케이션 등)

    코틀린은 이런 환경뿐 아니라 다른 환경에서도 작동한다. 인텔의 멀티OS엔진을 사용하면 iOS 디바이스에서도 코틀린을 동작할 수 있다. 또한 코틀린 1.1부터는 자바스크립트를 공식적으로 지원하여 브라우저나 노드에서도 코틀린을 실행할 수 있다.

     

    코틀린은 정적 타입 지정 언어이다.

    자바와 마찬가지로 코틀린도 정적 타입 지정 언어이다.

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

    반대로 JVM에서 그루비나 JRuby와 같은 동적 타입 지정 언어들은 타입과 관계없이 모든 값을 변수에 넣을 수 있고, 메소드나 필드 접근에 대한 검증이 실행 시점에 일어나며, 그에 따라 코드가 더 짧아지고 데이터 구조를 더 유연한게 생성할 수 있다.

    하지만 반대로 프로그래밍 실수가 있다면 컴파일 시 걸러내지 못하고 실행 시점에 오류가 발생한다.

     

    하지만 자바와 다르게 코틀린은 모든 변수 타입을 직접 명시할 필요는 없다. 대부분 코틀린 컴파일러가 문맥으로 부터 변수 타입을 자동으로 유추할 수 있기 때문에 생략이 가능하다. 이렇게 컴파일러가 문맥을 고려해 변수 타입을 경정하는 기능을 타입추론이라고 한다.

     

    정적 타입 지정의 장점

    • 실행 시점에 어떤 메소드를 호출할지 알아내는 과정이 필요 없으므로 메소드 호출이 더 빠르다 / 성능 up
    • 컴파일러가 프로그램의 정확성을 검증하기 때문에 실행 시 프로그램이 오류로 중단될 가능성이 더 적다 / 신뢰 up
    • 코드에서 다루는 객체가 어떤 타입에 속하는지 알 수 있기 때문에 처음 보는 코드를 다루기 더 쉽다 / 유지 보수성 up
    • 정적 타입 지정을 활용하면 더 안전하게 리팩토링 할 수 있고, 도구는 더 정확한 코드 완성 기능을 제공할 수 있으며, IDE의 다른 기능도 더 잘 만들 수 있다.  / 도구 지원

    코틀린의 타입 시스템 중 자바와 다른 가장 중요한 특성은 코틀린이 널이 될 수 있는 타입을 지원한다는 점이다. 널이 될 수 있는 타입을 지원함에 따라 컴파일 시점에 널 포인터 예외가 발생할 수 있는지 여부를 검사할 수 있어 좀 더 프로그램의 신뢰성을 높일 수 있다. 또 다른 중요한 점은 함수 타입에 대한 지원(함수형 프로그래밍 지원)이다.

     

    함수형 프로그래밍과 객체지향 프로그래밍

    함수형 프로그래밍의 핵심 개념

    • 일급 시민인 함수 - 함수를 일반 값처럼 다룰 수 있다. 함수를 변수에 저장할 수 있고, 함수를 인자로 다른 함수에 전달할 수 있으며, 함수에서 새로운 함수를 만들어 반환할 수 있다.
    • 불변성 - 함수형 프로그래밍에서는 일단 만들어지고 나면 내부 상태가 절대로 바뀌지 않는 불변 객체를 사용해 프로그래밍을 작성한다.
    • 부수 효과 없음 - 함수형 프로그램에서는 입력이 같으면 항상 같은 출력을 내놓고 다른 객체의 상태를 변경하지 않으며, 함수 외부나 다른 바깥 환경과 상호작용하지 않는 순수 함수를 사용한다.

    함수형 프로그래밍 스타일의 이점

    • 간결성 - 함수를 값처럼 활용할 수 있으면 더 강력한 추상화를 할 수 있고 강력한 추상화를 사용해 코드 중복을 막을 수 있다.
    • 안전성 - 불변 데이터 구조와 순수 함수를 사용함으로써 다중 스레드에서도 같은 데이터를 여러 스레드가 변경할 수 없다. 때문에 복잡한 동기화를 적용하지 않아도 된다.
    • 테스트 용이성 - 부수효과가 있는 함수는 그 함수를 실행할 때 필요한 전체 환경을 구성하는 준비 코드가 필요하지만 순수 함수는 그런 준비 코드 없이 독립적으로 테스트를 할 수 있다. (모듈느낌)

    무료 오픈소스

    코틀린 언어와 컴파일러, 라이브러리 및 코틀린과 관련된 모든 도구는 모두 오픈소스이다.

    개발은 github를 통해 이뤄지고 있다. ( https://github.com/jetbrains/kotlin )


    코틀린의 철학

    코틀린은 자바와의 상호운용성에 초점을 맞춘 실용적이고 간결하며 안전한 언어이다.

     

    실용성

    코틀린은 혁신적 기술을 추가하기 보다는 다른 프로그래밍 언어가 채택한 이미 성공적으로 검증된 해법과 기능에 의존한다. 때문에 언어의 복잡도가 줄어들고 이미 알고 있는 기존 개념을 통해 코틀린을 더 쉽게 배울 수 있다.

     

    간결성

    코드를 새로 작성하는 것보다 기존의 코드를 읽는 것이 시간이 더 걸린다. 코드가 간결할수록 이런 시간을 줄일 수 있다. 코틀린은 개발과정에서 코드에서 의미 없는 부분을 줄이고, 언어가 요구하는 구조를 만족시키기 위해 별 뜻은 없지만 프로그램에 꼭 넣어야하는 부수적인 요소를 줄이기 위해 노력했다. 예를 들어 자바의 클래스에서 게터와 세터, 생성자 파라미터를 필드에 대입하기 위한 로직 등을 묵시적으로 제공한다.

     

    안전성

    안전한 프로그램을 작성하기 위해서는 컴파일러가 프로그램 코드와 프로그램의 작동 의도에 대한 정보가 일치하는지를 검증할 수 있다. 따라서 더 큰 안전성을 얻기 위해서는 프로그램에 더 많은 정보를 덧붙여야 하므로 생산성이 하락한다.

    코틀린은 더 높은 수준의 안전성을 달성하면서도 전체 비용은 더 적게 지불하겠다는 목표가 있다. 코틀린이 JVM에서 실행한다는 사실만으로도 이미 상당한 안전성을 보장한다는 뜻이다. JVM을 사용하면 메모리 안전성을 보장하고, 버퍼 오버플로를 방지하며, 동적으로 할당한 메모리를 잘못 사용함으로 인해 발생할 수 있는 다양한 문제를 예방할 수 있다. 이는 자바와 같고 자바보다 더 적은 비용으로 안전성을 보장하는 방법이 추가로 존재한다. 예를 들어 코틀린 컴파일러는 타입을 자동으로 추론해주고, 실행 시점에 오류를 발생시큰는 대신 컴파일 시점 검사를 통해 오류를 더 많이 방지해준다. 가장 중요한 특징은 NullPointException을 없애기 위한 노력이다. 코틀린의 타입 시스템은 null이 될 수 없는 값을 추적하며, 실행 시점에 NullPointException이 발생할 수 있는 연산을 사용하는 코드를 금지한다. 또한 ClassCastException을 방지하는 기능도 있다. 자바에서 캐스트를 하기 전에 타입을 검사하여야 하지만 이 과정이 귀찮아 검사를 생략하는 경우가 있다. 하지만 코틀린은 타입 검사와 캐스트를 한 연산자에 이해 이루어 진다. 때문에 타입 검사후에 객체를 검사한 클래스로 인식하고 사용할 수 있다.

    if(value is String)
    	println(value.topUpperCase()) // UpperCase는 String의 메소드이다.

    상호운용성

    이제는 말하기 지긋지긋하다. 코틀린은 자바와의 상호운용성을 굉장히 중요시한다.

    코틀린은 기존 자바 라이브러리를 그대로 사용할 수 있다. 기존 라이브러리가 어떤 API를 제공하던 코틀린에서 그 API를 사용할 수 있다. 자바 메소드를 호출하거나 자바 클래스를 상속하거나 인터페이스를 구현하거나 자바 어노테이션을 코틀린 코드에 적용하는 등의 일은 코틀린에서 모두 가능하다. 뿐만 아니라 자바가 사용되는 거의 모든 곳에서 사용이 가능하다.


    코틀린 도구 사용

    자바와 마찬가지로 코틀린도 컴파일 언어이다. 따라서 코틀린 코드를 실행하기 전에 코드를 컴파일해야만 한다.

     

    코틀린 코드 컴파일

    코틀린 소스코드를 저장할 때는 보통 .kt라는 확장자를 사용한다. 코틀린 컴파일러는 자바 컴파일러가 자바 소스코드를 컴파일할 때와 마찬가지로 코틀린 소스코드를 분석해서 .class 파일을 만들어낸다. 만들어진 .class 파일은 개발 중인 애플리케이션의 유형에 맞는 표준 패키징 과정을 거쳐 실행될 수 있다. 가장 간단한 방식은 커맨드라인에서 kotlinc 명령을 통해 코틀린 코드를 컴파일한 다음 java 명령으로 그 코드를 실행하는 것이다.

    kotlinc <소스코드 또는 드렉터리> -include-runtime -d <jar 이름>
    java -jar <jar 이름>

    코틀린 빌드 과정

    코틀린 컴파일러로 컴파일한 코든는 코틀린 런타임 라이브러리에 의존한다. 런타임 라이브러리에는 코틀린 자체 표준 라이브러리 클래스와 코틀린에서 자바 API의 기능을 확장한 내용이 들어간다. 코틀린으로 컴파일한 애플리케이션을 배포할 때는 런타임 라이브러리도 함께 배포해야 한다.

    실제로 개발을 진행한다면 프로젝트를 컴파일하기 위해 maven, gradle, ant 등의 빌드 시스템을 사용할 것이다. 코틀린은 그런 빌드 시스템과 호환된다. 이런 빌드 시스템은 모두 코틀린과 자바가 코드베이스에 함께 들어있는 혼합 언어 프로젝트를 진원한다. 메으븐과 그레이들은 어플리케이션을 패키지 할때 알아서 코틀린 런타임을 포함시켜준다.

     

    인텔리J IDEA와 안드로이드 스튜디오 코틀린 플러그인

    인텔리 J IDEA와 안드로이드 스튜디오는 코틀린 개발 환경에서 다양한 기능을 제공하며 특정 버전 이하에서는 플러그인을 설치해야하고 그 이후 버전부터는 특별히 코틀린 플러그인을 설치하지 않아도 사용 가능하다.

     

    대화형 셸

    대화형 셸에서도 kotlin을 사용할 수 있다.

    kotlin repl을 검색하면 자세한 정보를 얻을 수 있다. repl은 대화형 셸을 의미한다.

     

    이클립스 플러그인

    이클립스 IDE에서도 코틀린을 사용할 수 있다.

     

    자바-코틀린 변환기

    코틀린 숙련도가 부족해서 자바로 작성하여 코틀린 코드를 만들수도있고 기존에 작성된 자바 코드를 코틀린으로 변환할 수 있다. 자바 코드를 복사하여 코틀린 파일에 붙여넣으면 자동으로 코틀린 코드를 제안한다. 변환기가 항상 완벽한 코드를 제공해주지는 않지만 작동하는 코틀린 코드를 알려주기 때문에 편리하게 사용할 수 있다.

    일부 IDE에서는 자바 코드 조각을 변환하고 싶을때는 그냥 자바코드를 복사해서 코틀린 파일에 붙여넣으면 되고 자바 파일 하나를 통재로 변환하고 싶으면 메뉴에서 자바 파일을 코틀린 파일로 변환이라는 메뉴를 선택하면 된다.

Designed by Tistory.