언어(Language)/Kotlin

[Kotlin] 코틀린이란 무엇이며, 왜 필요한가? - Kotlin In Action

잇트루 2023. 9. 6. 20:27
반응형

코틀린은 무엇인가?

코틀린은 자바 플랫폼에서 돌아가는 새로운 프로그래밍 언어로 간결하고 실용적이며, 자바 코드와의 상호운용성(Interoperability)을 중시한다. 현재 자바가 사용 중인 곳이라면 거의 대부분 코틀린을 활용할 수 있다.

대표적으로 서버 개발, 안드로이드 앱 개발 등의 분야에서 코틀린을 쓸 수 있다.

 

 

코틀린 맛보기

코틀린의 첫인상

data class Person (
    val name: String,
    val age: Int? = null
)

fun main(args: Array<String>) {
    val persons = listOf(
        Person("Alice"),
        Person("Bob", age = 29)
    )

    val oldest = persons.maxBy { it.age ?: 0 }
    println("The oldest is: $oldest")
}
  • name과 age라는 프로퍼티(Property)가 들어간 간단한 데이터 클래스(Data class)이다.
  • age 프로퍼티의 디폴트 값은 null

 

 

코틀린의 주요 특성

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

코틀린의 주목적은 현재 자바가 사용되고 있는 모든 용도에 적합하면서 더 간결하고 생산적이며 안전한 대체 언어를 제공하는 것이다.

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

코틀린은 자바스크립트로도 컴파일할 수 있어 브라우저나 노드에서 실행할 수 있다.

 

 

정적 타입 지정 언어

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

JVM에서 자바(Java)와 코틀린(Kotlin)이 대표적인 정적 타입 지정 언어다.

 

한편 자바와는 달리 코틀린에서는 컴파일러가 문맥으로부터 변수 타입을 자동으로 유추할 수 있기 때문에 프로그래머는 타입 선언을 생략해도 된다. 이를 타입 추론이라고 부른다.

// 타입 추론
// x를 정수(Int) 값으로 초기화한다.
var x = 1

 

동적 타입 지정 언어

동적 타입 지정 언어에서는 타입과 관계없이 모든 값을 변수에 넣을 수 있고, 메서드나 필드 접근에 대한 검증이 실행 시점에 일어나며, 그에 따라 코드가 더 짧아지고 데이터 구조를 더 유연하게 생성하고 사용할 수 있다. 하지만, 실행 시점이 돼서야 오류가 확인되는 위험이 있다.

JVM에서 그루비(Groovy)나 JRuby가 대표적인 동적 타입 지정 언어다.

 

정적 타입 지정의 장점

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

 

 

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

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

일급 시민(first-class citizen) 함수

함수를 일반 값처럼 다룰 수 있다. 함수를 변수에 저장할 수 있고, 함수를 인자로 다른 함수에 전달할 수 있으며, 함수에서 새로운 함수를 만들어 반환할 수 있다.

 

불변성

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

 

부수 효과(side effact) 없음

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

 

함수형 프로그래밍의 장점

간결성

함수를 값처럼 활용하여 강력한 추상화를 할 수 있고 코드 중복을 막을 수 있다.

fun findAlice() = findPerson { it.name == "Alice" }
fun findBob() = findPerson { it.name == "Bob"}

 

안전한 멀티스레딩(safe multithreading)

멀티 스레드 프로그램에서는 적절한 동기화 없이 같은 데이터를 여러 스레드가 변경하는 경우 문제가 발생한다. 불변 데이터 구조와 순수 함수를 적용한다면 다중 스레드 환경에서 같은 데이터를 여러 스레드가 변경할 수 없다. 따라서 복잡한 동기화를 적용하지 않아도 된다.

 

쉬운 테스트

함수형 프로그램은 테스트하기 쉽다. 부수 효과가 있는 함수는 그 함수를 실행할 때 필요한 전체 환경을 구성하는 준비 코드가 따로 필요하지만, 순수 함수는 그런 준비 코드 없이 독립적으로 테스트할 수 있다.

 

코틀린 함수형 프로그래밍

자바에서도 함수형 프로그래밍이 가능하다. 하지만 모든 언어가 함수형 프로그래밍을 편하게 사용하기에 충분한 라이브러리와 문법을 제공하지는 않는다. 그에 반면에 코틀린은 함수형 프로그래밍을 풍부하게 지원해 왔다.

  • 함수 타입 지원 : 어떤 함수가 다른 함수를 파라미터로 받거나 함수가 새로운 함수를 반환할 수 있다.
  • 람다 식 지원 : 준비 코드를 작성하지 않아도 코드 블록을 쉽게 정의하고 전달할 수 있다.
  • 데이터 클래스 : 불변적인 값 객체(VO: Value Object)를 간편하게 만들 수 있다.
  • 코틀린 표준 라이브러리 : 객체와 컬렉션을 함수형 스타일로 다룰 수 있는 API를 제공한다.

물론 함수형 프로그래밍을 지원할 뿐 이를 강제하지는 않는다. 객체지향과 함수형 접근 방법을 함께 종합해서 문제에 가장 적합한 도구를 사용하면 된다.

 

무료 오픈소스

코틀린 언어와 컴파일러, 라이브러리 및 관련된 모든 도구는 무료 오픈소스며, 어떤 목적에든 무료로 사용할 수 있다.

코틀린 개발 코드(깃허브) : https://github.com/jetbrains/kotlin

 

GitHub - JetBrains/kotlin: The Kotlin Programming Language.

The Kotlin Programming Language. . Contribute to JetBrains/kotlin development by creating an account on GitHub.

github.com

 

 

코틀린 응용

코틀린은 주로 서버와 안드로이드 개발에서 널리 사용되고 있다.

코틀린 서버 프로그래밍

  • 브라우저에 HTML 페이지를 돌려주는 웹 애플리케이션
  • 모바일 애플리케이션에게 HTTP를 통해 JSON API를 제공하는 백엔드 애플리케이션
  • RTC 프로토콜을 통해 서로 통신하는 마이크로서비스

자바 코드와 매끄럽게 상호운용할 수 있어 어노테이션을 붙이거나 자바에서 사용하는 프레임워크 등을 이용해도 아무런 문제가 없다. 시스템 코드는 더 간결해지고 더 신뢰성이 높아지며, 유지보수하기 쉬워질 것이다.

 

코틀린 안드로이드 프로그래밍

모바일 애플리케이션은 전형적인 엔터프라이즈 애플리케이션과 많이 다르다. 코틀린 언어의 특성과 안드로이드 프레임워크의 플러그인 지원을 조합하면 안드로이드 애플리케이션 개발의 생산성을 높일 수 있다.

 

 

코틀린의 철학

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

실용성

  • 코틀린은 연구를 위한 언어가 아니다. 다른 프로그래밍 언어가 채택한 이미 성공적으로 검증된 해법과 기능에 의존한다.
  • 코틀린은 어느 특정 프로그래밍 스타일이나 패러다임을 사용할 것을 강제로 요구하지 않는다. 자바에서 사용한 프로그래밍 스타일이나 기법을 활용할 수 있다.
  • IntelliJ IDEA의 개발과 컴파일러의 개발이 맞물려 이루어져 왔다. 코틀린 언어의 특성은 항상 도구의 활용을 염두에 두고 설계되어 왔다.

 

간결성

  • 코틀린은 프로그래머가 작성하는 코드에서 의미가 없는 부분을 줄이고, 언어가 요구하는 구조를 만족시키기 위해 별 뜻은 없지만 프로그램에 꼭 넣어야 하는 부수적인 요소를 줄이기 위해 많은 노력을 기울였다.
  • getter, setter, 생성자 파라미터를 필드에 대입하기 위한 로직 등 자바에 존재하는 여러 가지 번거로운 준비 코드를 묵시적으로 제공한다.
  • 다양한 표준 라이브러리를 제공해 반복되거나 길어질 수 있는 코드를 함수 호출로 대치할 수 있다.

 

안전성

  • 프로그래밍 언어가 안전하다는 말은 프로그램에서 발생할 수 있는 오류 중에서 일부 유형의 오류를 프로그램 설계가 원천적으로 방지해 준다는 뜻이다.
  • 정적 타입 지정 언어로서 코틀린은 애플리케이션의 타입 안전성을 보장한다. 대부분의 경우 코틀린 컴파일러가 타입을 자동으로 추론해 준다.
  • 실행 시점에 오류를 발생하는 대신 컴파일 시점 검사를 통해 오류를 더 많이 방지해 준다.
  • NullPointerException을 방지하기 위해 널(null)이 될 수 없는 값을 추적하며 실행 시점에 오류가 발생할 수 있는 연산을 사용하는 코드를 금지한다.
  • 어떤 객체를 다른 타입으로 캐스트 하기 전에 미리 검사하지 않으면 ClassCastException이 발생할 수도 있다.

 

상호운용성

  • 자바 메서드를 호출하거나 클래스를 상속, 확장하거나 인터페이스를 구현하거나 자바 어노테이션을 코틀린 코드에 적용하는 등의 일이 모두 가능하다.
  • 자바와 코틀린 코드를 프로젝트에서 원하는 대로 섞어 쓸 수 있는 궁극적인 유연성을 발휘할 수 있다.
  • 코틀린에서 자바 API를 호출할 때도 아무런 변환이 필요 없다.
  • 코틀린은 자바와 코틀린 소스 파일이 임의로 섞여 있어도 제대로 프로그램을 컴파일할 수 있다.

 

 

코틀린 도구 사용

자바와 마찬가지로 코틀린도 컴파일 언어다. 컴파일 과정이 어떻게 이뤄지며 그 과정에서 어떤 도구가 쓰이는지 살펴보자.

코틀린 코드 컴파일

  • 코틀린 컴파일러로 컴파일한 코드는 코틀린 런타임 라이브러리에 의존한다.
  • 런타임 라이브러리에는 코틀린 자체 표준 라이브러리 클래스와 코틀린에서 자바 API의 기능을 확장한 내용이 들어있다.
  • 프로젝트를 컴파일하기 위해 메이븐(Maven), 그레이들(Gradle), 앤트(Ant) 등의 빌드 시스템을 사용할 수 있다.

 

IntelliJ IDEA와 Android Studio의 코틀린 플러그인

IntelliJ IDEA

IntelliJ IDEA의 코틀린 플러그인은 코틀린 언어와 함께 개발돼 왔으며, 가장 다양한 기능을 제공한다. IntelliJ IDEA에는 코틀린 플러그인이 기본으로 포함되어 있다. 따라서 별도로 플러그인을 설치할 필요가 없다. IntelliJ IDEA는 무료 버전인 Community와 유료 버전인 Ultimate가 있다.

 

Android Studio

안드로이드 스튜디오를 사용한다면 플러그인 관리자를 통해 코틀린 플러그인을 설치해야 한다. Settings → Plugins에서 Install JetBrains Plugin 버튼을 클릭하여 표시되는 목록에 코틀린 언어를 선택하면 된다.

 

자바-코틀린 변환기

자바에 대해 알고 있는 지식을 바탕으로 코틀린을 더 빠르게 배워서 적용할 수 있다. 이 도구는 자동으로 자바를 코틀린으로 변환한다. 항상 코틀린다운 코드를 제안해 주지는 못하지만 잘 작동하는 코틀린 코드를 알려주기 때문에 유용하게 사용할 수 있다.

IntelliJ에서 더욱 쉽게 변환기를 사용할 수 있다. 자바 코드를 코틀린 파일에 붙여 넣는 것만으로도 자바에서 코틀린 코드로 변환할 수 있다. 또한 메뉴에서 파일을 통째로 코틀린으로 변환할 수도 있다.

 

 

참고

https://link.coupang.com/a/8XCLD

 

Kotlin in Action:컴파일러 개발자가 직접 알려주는 코틀린 언어 핵심

COUPANG

www.coupang.com

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

반응형