프로그래밍 기초/Kotlin

코틀린 완벽 가이드 - 1장 강력하고 실용적인 코틀린

sumni0530 2023. 4. 3. 21:41

최근 사내에서 백엔드 개발 표준 언어로 자바와 코틀린을 선정하였다. 자바는 널리 사용하고 있지만 코틀린을 같이 개발 표준 언어로 사용했다는 것이 조금은 놀라웠다. 이 기회에 코틀린을 공부하고자 코틀린 완벽 가이드를 읽게 되었다. 

코틀린 완벽 가이드를 읽은 이유는 아래와 같다.

  1. 처음 접하는 책으로 코틀린에 대한 흥미를 유발 시킬 수 있는 책
  2. 최신 릴리즈 버전 및 플러그인 & 라이브러리에 대해 설명되어 있는 책
  3. 저자가 안드로이드 프로그래밍이 아닌 서버 프로그래밍에 대해서도 지식이 있다고 느껴지는 책

여러 후보군들이 있었지만 위의 내용을 종합해보니 코틀린 완벽 가이드가 가장 적합하다고 생각하여 책을 샀다. 


1장 - 강력하고 실용적인 코틀린

이 장에서는 코틀린이 휼륭하고 효율적인 언어인 이유와 코틀린을 배워야하는 이유에 대해서 설명한다. 이와 더불어 코틀린 설계를 뒷받침하는 기본적인 사상과 응용하여 사용할 수 있는 라이브러리와 프레임워크를 전반적으로 살펴본다. 저자가 코틀린 개발에 참여하고, 코틀린을 주언어로 사용하며 느낀 부분들을 들을 수 있는 부분이다. 

 

1.1 코틀린이란 무엇인가?

코틀린의 원래의 목적은 자바에 대해 더 나은 대안을 제공하려는 목적으로 만들어졌다. 코드 기반의 성장과 유지 보수는 발전이 느리고, 스칼라나 C# 등의 언어에서 사용할 수 있었던 유용한 기능을 제공하지 않는 자바로 인해 방해가 되었다. 이로 인해 안정성, 간결성, 상호 운용성을 강조하는 다중 패러다임, 다중 플랫폼 프로그래밍 언어인 코틀린이 개발되었다.

 

1.1.1 안정성

프로그래밍 언어의 안정성은 프로그래머의 오류 방지와 관계가 깊다. 오류를 방지하기 위해 프로그램에 대한 정보를 더 자세히 알려주거나 컴파일러가 더 오랫동안 프로그램이 올바른지 추론하게 해야하는데, 이렇게 안전성을 고려해 언어를 설계하는 것은 트레이트오프 문제이다. 코틀린의 원래 목적인 자바보다 더 안전성을 보장하도록 설계하되, 자바보다 개발자의 생산성을 덜 해치는 언어를 만드는 것이 목적이다. 

코틀린의 안정성과 관련된 중요한 특징은 아래와 같다.  

  • 타입 추론(type inference)으로 인해 개발자가 명시적으로 타입을 지정하지 않아도 됨
  • 널이 될 수 있는 타입을 통해 null의 사용을 제한할 수 있고, NullPointerException 예외를 좀 더 쉽게 방지 가능.
  • 스마트 캐스트(smart cast)를 통해 타입을 안전하게 변환할 수 있고, 실행 시점에 타입 캐스트 오류를 방지 가능

 

1.1.2 다중 패러다임

코틀린에서는 다중 패러다임을 제공하므으로써 언어의 표현력을 많이 늘려주며, 언어를 더 유연하고 다용도에 사용할 수 있는 도구로 만들어 준다. 코틀린에서 지원하는 다중 패러다임은 아래와 같다.

  • 자바와 같은 전형적인 주류 프로그래밍 언어가 지원하는 일반적인 객체지향 패러다임 + 함수형 프래그래밍
    자바에서도 함수형 프로그래밍을 지원하지만 코틀린의 표현력에 비해 상당히 떨어짐
  • 도메인 특화 언어(Domain Specific Language, DSL)로 정의할 수 잇는 기능 제공 → 선언적 스타일로 코딩
    선언적 스타일에 대한 내용은 여기를 참고하면 좀 더 이해하기 좋을 것 같아 링크를 남겨둔다.
  • 코루틴 도입을 통한 동시성(concurrent) 프로그래밍 지원

 

1.1.3 간결성과 표현력

개발자의 생산성은 임의의 사람(본인 포함)이 작성한  코드를 빠르게 읽고 이해할 수 잇는 코드를 작성할 수 있는 능력과 크게 연관되어 있다. 의미를 이해하려면 그 코드 조각이 프로그램의 다른 부분과 어던 관계인지 빠르게 이해해야 한다. 그래서 새로 코드를 작성하는 것보다 기존 코드의 의미를 파악하는 것이 더 오래 걸린다. 

코틀린 설계자들은 불필요한 준비 코드를 제거하고 언어를 가능한 간결하게 만들기 위해 노력했다. (ex. 필드 게터, 세터, 익명 클래스, 명시적 위임 등을 제거) 또한 간결성을 너무 과용하지 못하게 주의를 기울였다. 

 

1.1.4 상호 운영성

코틀린은 독립적으로 존재하는 언어가 아니며 가능한 한 기존의 자바 코드 기반과 부드럽게 협력해야했다. 이로 인해 자바 상호 운영성은 코틀린 설계 시 중요한 목적이였다. 기존 자바 코드를 코틀린에서 사용할 수 있게 했을 뿐만아니라, 코틀린 코드를 자바에서 사용할 수 있도록 보장하기 위해 많으 노력을 하였다.

 

1.1.5 다중 플랫폼

코틀린 언어가 진화함에 따라 개발자 커뮤니티에 의해 다중 플랫폼 지원의 필요성이 제기 되었다. 이로 인해 아래와 같은 플랫폼도 지원한다. 이러한 다중 플랫폼을 지원하는 것은 코틀린 1.3 버전 이후 부터이다. 

  • 브라우저나 노드(Node.js) 애플리케이션, 자바스크립트 라이브러리까지 포함하는 자바스크립트 지원
  • macOS나 리눅스, 윈도우 라이브러리 및 애플리케이션을 포함하는 네이티브 지원

 

 

1.2 코틀린 생태계

코틀린을 위한 풍부한 라이브러리와 프레임워크가 이미 많이 만들어져있으며, 사용 가능한 도구를 전반적으로 설명한다. 시간이 지남에 따라 사용 가능한 리스트가 달라질 수 있기 때문에 https://kotlin.link/ 에서 계속 업데이트 하고 있다. 

Awesome Kotlin의 Libraries/Frameworks 카테고리

1.2.1 코루틴

일시 중단 가능한 계산(suspendable computation)이라는 개념 덕분에 코틀린은 async/await, futre, promise, actor 등의 동시성 관련 프로그래밍 패턴을 지원한다. 코루틴에 포함된 주요 기능은 아래와 같다. 

  • 스레드에 대한 더 가벼운 대안
  • 유연한 스레드 디스패치 메커니즘
  • 일시 중단 가능한 sequence와 iterator
  • channel을 사용한 메모리 공유
  • actor를 통해 메시지 전송 방식으로 상태 공유

 

1.2.2 테스트

자바 테스트 프레임워크 중 일부를 약간의 변경을 통해 코틀린에 적용할 수 있으며, 코틀린 맞춤용 테스트를 위해 유용한 DSL을 제공하는 프레임워크를 사용할 수 있다.

  • Mockito-Kotlin은 모키토 프레임워크를 확장한 것으로 코틀린 객체 모킹을 단순화 가능
  • Spek은 행위 주도 테스트 프레임워크로, Jasmine이나 Gherkin 스타일의 테스트 케이스 정의를 지원
  • KoTest는 ScalaTest에 의해 영감을 얻은 프레임워크로, 유연한 테스트 정의와 assertion을 지원

 

1.2.3 안드로이드 개발

크게 관심이 없는 부분이라 생략하였다..ㅎㅎ 

 

1.2.4 웹 개발

스프링 5.0 이나 Vert.x 3.0과 같은 유명한 프레임워크들은 자신의 기능을 좀 더 코틀린다운 방식으로 활용할 수 있게 해주는 코틀린용 확장을 제공한다. 그 외에도 다양한 프레임워크를 사용하는 순수 코틀린을 사용할 수 있다.

  • Ktor는 젯브레인즈에서 만든 비동기 서버와 클라이언트 애플리케이션 작성을 위한 프레임워크
  • kotlinx.html은 HTML 문서를 만들기 위한 DSL이다.
  • Kodein은 의존 관계 주입 프레임워크

 

1.2.5 데스크톱 애플리케이션

이것도 안드로이드 개발과 마찬가지로 생략... ㅎㅎ

 

 

1.3 코틀린 시작하기 

IntelliJ에서 코틀린을 설정하는 법에 대해서 알아보자.

 

준비 - IntelliJ IDEA (15부터는 코틀린 지원이 기본으로 포함)

 

우선 프레임워크를 쓰지 않고 코틀린 프로젝트를 만들기 위해서는 JDK가 다운로드 되어있어야하며, 없다면 다운로드하자.

Language - Kotlin, Build system - 필요에 따라 선택한다. 현재는 기본 라이브러리를 통해서 테스트를 진행할 것이기 때문에 IntelliJ 빌드 시스템을 사용하였다. 

 

코틀린 소스 파일은 kt 확장자를 사용하며, 위와 같이 코틀린 애플리케이션 진입점 역할을 하는 main 함수를 선언하면 아래 작성된 코드가 실행된다. 자바의 경우 JVM 진입점을 반드시 정적 클래스 메서드(static class method)로 지정해야하지만, 코틀린의 경우 컴파일러가 자동으로 클래스를 하나 만들고 그 안에 작성한 main() 함수를 호출하는 진입점에 넣어준다. 

파라미터가 없는 경우 main 함수에 아무것도 작성하지 않아도 되며, 있는 경우는 사용할 수 있다. (1.3 릴리즈 버전 이후부터 가능하며, 그전에는 String<Array> 타입 파라미터가 반드시 필요)

 

 

REPL 사용하기

IntelliJ 코틀린 플러그인은 대화형 쉘을 제공한다. 코드를 빨리 테스트하거나 라이브러리 함수를 테스트할 때 유용한 도구이다. 이러한 대화형 쉘을 REPL(Read/Evaluate/Print Loop)라고 한다. Tools -> Kotlin -> Kotlin REPL을 선택하면 사용 가능하다. 콘솔에 입력시에는 Command + Enter 를 누르면 작성된 코드가 실행된다.