[Kotlin in Action] 1. Kotlin: What and Why

주영진·2025년 7월 17일

Kotlin 스터디

목록 보기
1/4

1. Kotlin이란

Kotlin은 JVM(자바 가상머신) 플랫폼과 JVM외의 다른 플랫폼에서 돌아가는 현대 프로그래밍 언어이다

kotlin은 처음에 '더 나은 자바'의 목적으로 처음 개발된 언어이다. 그 후 최근 10년간, 코틀린은 단순 JVM을 훨씬 뛰어넘어 cross-platform 솔루션을 만들 수 있는 기술을 포함해, 더 많은 타깃을 제공해왔고, 안드로이드는 이제 코틀린 우선 플랫폼이다. 아래는 간단한 코틀린 코드의 예시이다.

data class Person( //data class
    val name: String, //읽기 전용 property
    val age: Int? = null //null이 될 수 있는 타입과 parameter 기본값
)

fun main() { //최상위 함수
    val persons = listOf( //이름붙은 파라미터
        Person("영희", age = 29),
        Person("철수"), //, -> 트레일링 comma
    )

    val oldest = persons.maxBy{ //lambda식
        it.age ?: 0 // null에 적용하는 엘비스 연산자
    }
    println("가장 나이가 많은 사람: $oldest") //문자열 템플릿
}

2. Kotlin의 주요 특성

정적 타입 지정으로 인해 코틀린 성능, 신뢰성, 유지 보수성이 모두 좋아진다

정적 타입 지정 언어의 핵심적인 장점은, 프로그램의 모든 식의 타입을 complile 시점에 알 수 있다는 점이다. Kotlin은 정적 타입 언어로, 모든 종류의 버그를 runtime에 프로그램이 갑자기 중단되면서 발견하는 대신, 컴파일 시점에 미리 발견함으로써 에러를 미리 방지할 수 있어, 더 빠른 메서드 호출, 더 좋은 신뢰성과 유지 보수성을 보장한다. 반대로 동적 타입 지정 언어에는 Python이나 JavaScript가 있다.

더 좋은 점은, 그렇다고 해서 프로그래머가 미리 모든 변수의 타입을 명시할 필요는 없다.

val x: Int = 1
val y = 1 

위의 예시 코드에서처럼, 코틀린은 컴파일러가 문맥을 고려해 변수 타입을 결정하는 타입 추론(Type Inference)를 제공해, 프로그래머가 직접 타입을 선언해야 함에 따라 생기는 불편함을 없앨 수 있다.

함수형 프로그래밍과 객체지향 프로그래밍의 조합을 활용해 안전성과 유연성을 보장한다

함수형 프로그래밍은 함수를 일반 값처럼 다룰 수 있다(first-class). 또한, 일단 만들어지고 나면 내부 상태가 절대로 바뀌지 않는 점(immutability, 불변성), input이 같으면 항상 같은 값을 출력하는 특징(no side effect)을 지닌다.

함수형 접근 방식을 선택하면 일단 코드 중복을 피할 수 있다. 그리고 또 다른 유익성은 안전한 동시성이다. 앞서 언급한 불변성과 순수 함수를 사용한다면 안전하지 못한 데이터 변경이 발생하지 않는다고 확신할 수 있으니 복잡한 동기화 방식을 적용하지 않아도 된다.

마지막으로, 테스트하기도 쉽다.

Coroutine을 제공해 동시성, 비동기 코드를 자연스럽고 구조적으로 사용한다

애플리케이션을 만들 때, 동시성을 배제할 수는 없다. 백그라운드에서 오래 계산이 실행되는 동안에도 user interface는 반응성을 계속 유지해야 한다. 이에 따라 서버 측에서는 특정 요청이 평소보다 훨씬 오래 걸리더라도 자신에게 들어오는 다른 요청들을 처리해야 한다.

동시성 처리에는 callback, future, Promise와 같은 다양한 방식들이 있지만, 코틀린은 coroutine이라고 불리는 suspendable computation을 사용해 접근해, 자신의 실행을 잠시 중단시키고, 나중에 중단했던 지점부터 작업을 계속 수행할 수 있게 해준다.

이 부분에 대한 자세한 내용은 뒤에서 다룰 예정이니까 일단 넘어ㄱ

Kotlin은 Open Source이다

코틀린은 오픈 소스이며, Apache2 라이선스에 제공된다. 개발은 깃허브를 통해 열린 방식으로 이루어지고 있다.

3. 코틀린이 자주 쓰이는 분야

3.1. 백엔드 지원: 서버 프로그래밍

서버 프로그래밍이라고 하면 크게 다음과 같은 것들을 이야기 할 수 있다.

  • 브라우저에 HTML 페이지를 돌려주는 웹 애플리케이션
  • HTTP를 통해 모바일 애플리케이션에게 JSON API를 제공하는 백엔드 애플리케이션
  • RPC 프로토콜이나 메시지 버스를 통해 서로 통신하는 작은 서비스들로 이루어진 마이크로서비스

보통 백앤드 프로그래밍을 할 때 자바를 많이 사용한다. 코틀린의 가장 큰 장점 중 하나는, 자바 코드와 매끄럽게 상호운용할 수 있다는 점이다. 자바 클래스를 코틀린으로 확장해도 아무 문제가 없으며, 코틀린 클래스 안의 메서드나 필드에 특정 어노테이션을 붙여야 하는 경우에도 아무 문제가 없다.

또 다른 큰 장점은 코틀린 타입 시스템은 null을 정확히 추적하기 때문에 null pointer 예외로 인한 문제의 영향을 덜 받게 된다. 자바에서라면 실행 시점에 NullPointerException을 발생시켰을 대부분의 코드는 코틀린에서 컴파일 자체를 실패하기 때문에 오류를 확실히 수정할 수 있다.(오 이건 좋ㄷ

Spring과 같은 현대적인 프레임워크도 처음부터 코틀린을 일급 시민으로 지원한다. 코틀린 자체 라이브러리 생태계 Ktor 프레임워크도 존재하며, 스페이스, 툴박스, 어도비 같은 회사가 이를 활용하고 있다. 케이토는 XML 파일이나 annotation을 활용해 경로 라우팅을 지정하는 대신, 케이토가 제공하는 DSL을 통해 서버 애플리케이션 라우팅을 설정할 수 있다.

이처럼 검증된 업계 표준 프레임워크를 쓰든, 마이크로서비스를 위한 경량 프레임워크를 쓰든, 코틀린 생태계는 다양한 프레임워크를 지원한다.

3.2. 모바일 개발

세계에서 가장 널리 쓰이는 모바일 운영체제인 안드로이드는 2017년부터 kotlin을 앱 빌딩을 위한 언어로 공식 지원하기 시작했다.

코틀린은 모바일 앱에 적합하다. 흔한 안드로이드 개발 작업을 훨씬 더 적은 코드로 달성할 수 있으며, 안드로이드 팀이 만든 안드로이드 KTX 라이브러리를 사용하면 수많은 안드로이드 API에 대한 코틀린 adapter를 제공받을 수 있어 안드로이드 프로그래밍 경험을 더 개선할 수 있다. 기본적으로 자바보다 40% 가량 더 적은 코드양을 보장해 가독성 또한 뛰어나다.

코틀린은 특정 플랫폼에 국한되지 않는, 다중 플랫폼 언어이다.

  • 코틀린은 JS로 컴파일 할 수 있으며, node.js같은 런타임에서도 코틀린을 활용할 수 있다
  • 코틀린/네이티브를 활용해 코틀린 코드를 이진 코드로 컴파일하여 iOS나 다른 플랫폼에서 스스로 실행되는 프로그램을 만들 수 있다
  • 코틀린/와즘을 통해 코틀린 코드를 바이너리 형식으로도 컴파일 할 수 있다/

4. 코틀린의 철학

실용적 언어

코틀린은 대규모 시스템을 개발해본 다년간의 IT 업계 경험을 바탕으로 이뤄졌으며, 이에 따라 코틀린의 특성은 수많은 SW 개발자들의 사용에 잘 들어맞을 수 있도록 주의깊게 선택됐다. 더 나아가 이제는 10여년간의 피드백이 현재 최종 코틀린 버전에 반영돼 있다. 그러한 이유로 실제 프로젝트에서 문제를 해결할 때 코틀린이 큰 도움이 될 것이다.

코틀린은 어느 특정 프로그래밍 스타일이나 패러다임을 사용할 것을 강제로 요구하지 않는다. 프로그래머는 자신이 익숙한 프로그래밍 스타일이나 기법을 활용할 수 있다.

간결한 언어

코틀린은 코드의 의미를 최대한 전달하고, 프로그램 언어가 요구하는 구조를 만족시키기 위해 많은 노력을 기울였다. 자바에서 getter, setter, 생성자 파라미터 필드에 대입하기 위한 로직 등 OOP에 존재하는 여러가지 번거로운 준비 코드를 코틀린은 암시적으로 제공하기에 이러한 준비 코드로 지저분해질일이 없다.

안전한 언어

흔히 프로그래밍 언어가 안전하다는 것은, 프로그램에서 발생할 수 있는 오류 중에서 일부 유형의 오류를 프로그램 설계가 원칙적으로 방지해준다는 뜻이다.

기본적으로 JVM에서 실행한다는 사실 자체가 이미 상당한 안정성을 보장해준다는 뜻이다. 메모리 안정성을 보장하며, 버퍼 오버플로우를 방지하고, 타입 안정성을 확보해준다. 앞서 언급했듯이 NullPointerException 오류를 방지해주며, smart cast(안전한 캐스팅 지원)을 지원한다.

좋은 상호운용성

코틀린은 라이브러리가 어떤 API를 제공하던지 코틀린에서 그 API를 활용할 수 있다.

자바 코드에서 코틀린 코드를 호출할 때도 아무런 노력 없이 이를 실현할 수 있다. 코틀린의 클래스나 메서드를 자바에서도 그대로 똑같이 사용할 수 있다. 이는 결국 자바와 코틀린 코드를 같은 프로젝트 안에서 원하는 대로 섞어쓸 수 있는 궁극적인 유연성을 제공해준다.

5. 코틀린 도구 사용

자바-코틀린 변환기는 코틀린을 막 처음 배우기 시작했을 때, 자바로 코드를 작성한 후에 이를 코틀린으로 통째로 변환하고 싶을 때 유용하게 활용할 수 있다. 인텔리제이 IDEA에서 변환기를 쉽게 활용할 수 있다.

5.1. 코틀린 컴파일

기본적인 코틀린의 컴파일 과정은 다음과 같다.
코틀린 소스 코드를 분석해서 .class 파일을 만들어내면, java 명령으로 해당 코드를 실행시킨다. 하지만 마지막에 이를 실행시키기 위해서는, Kotlin runtime library가 필요하다. 이 안에는 Int나 String과 같은 코틀린 기본 클래스 정의가 들어가 있고, 표준 자바 API에 대한 확장이 들어가 있다.

실제로 코틀린으로 개발을 진행하게 되면 프로젝트를 컴파일하기 위해 Maven, gradle 등의 빌드 시스템을 사용하게 된다. 이들은 IDE 없이도 커맨드 한 줄로 빌드, 테스트, 배포까지 자동으로 해주는 자동화 도구로, 다음과 같은 기능을 제공한다.

1.	코드 컴파일 (source → .class/.jar)
2.	외부 라이브러리(의존성) 자동 다운로드 및 연결
3.	테스트 자동 실행
4.	패키징 & 배포 준비
5.	동일한 방식으로 어디서나 빌드 가능하게 환경 통일
profile
'개발사(社)' (주)영진

0개의 댓글