[Kotlin in Action] part1_Kotlin: what and why

지슈·2023년 2월 6일
0

Kotlin in Action

목록 보기
1/9

What is

Kotlin : 자바 플랫폼을 겨냥해 새롭게 등장한 프로그래밍 언어. 현재 자바가 사용되는 거의 모든 곳에 사용할 수 있다.

코틀린의 특징을 볼 수 있는 예시.

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")
}
//the oldest is : Person(name=Bob,age=29)

Alice 의 나이는 지정되지 않았지만 Person 클래스를 선언할 때의 엘비스 연산자가 null을 0으로 변환해서 Bob이 나이가 제일 많다.

코틀린의 주요 특성

타겟 플랫폼: 서버, 안드로이드, 자바가 사용되는 모든 곳

코틀린의 주목적은 자바를 대체할 수 있는 더 간결하고, 생산적이며, 안전한 언어를 제공하는 것이다. 코틀린은 광범위한 사용이 가능하다. 코틀린이 활용될 수 있는 일반적인 영역은:

  • 서버상의 코드(특히 웹 어플리케이션의 벡엔드)
  • 안드로이드 기기에서 실행될 수 있는 모바일 어플리케이션
  • 이 밖에도, iOS와 데스크탑 어플리케이션(TornadoFX와 함께 사용)

정적 타입 지정 언어

자바처럼 코트린도 정적 타입 언어이다. 컴파일러가 객체의 타입을 알고 프로그램의 메소드와 필드의 타입을 검증할 수 있다는 것이다. 동적 타입 언어와 비교해서, 정적 타입 언어는 코드가 더 짧아지고 데이터 구조를 유연하게 생산할 수 있다. 하지만 컴파일러가 오류를 컴파일 시점에 알 수 있다는 단점이 있긴 하다.

자바와 달리 코틀린은 사용자에게 소스코드에 있는 모든 변수의 타입을 명시할 것을 요구하지 않는다. 변수의 타입은 코드 맥락 상 자동적으로 결정되기 때문이다.

val x = 1

이 예시에서 코틀린은 자동적으로 x의 타입이 정수라는 것을 알아낼 수 있다. 이러한 기능을 타입 추론(type inference)라고 한다.

정적 타입의 장점

  • 성능(Performance): 어떤 메소드를 호출할지 알아내는 과정이 필요 없으므로 메소드 호출이 빠르다
  • 신뢰성(Reliability): 컴파일러가 프로그램의 정확성을 확인하기 때문에 컴파일 시 오류가 발생하게 되는 경우가 적다.
  • 유지 보존성(Maintainabilty): 익숙하지 않은 코드를 사용하는 것이 쉽다.
  • 도구 지원(Tool support): 정적 타입 언어이기 때문에 더 안전한 리팩토링과 정확한 코드 완성, 그리고 다른 IDE의 기능 지원이 가능하다.

코틀린에서 클래스, 인터페이스, 제네릭은 자바와 매우 흡사하게 사용된다. 하지만 일부 특성은 새롭게 다가올 수 있다. 가장 중요하게 여겨지는 것은 코틀린의 널 타입(nullable types) 지원이다. 이 부분은 6장에서 설명된다. 코틀린의 타입 시스템에서 나타나는 다른 새로운 특성은 함수 타입(function types) 지원이다. 이에 대해서 코틀린에서 함수가 어떻게 지원되는지 살펴보자.

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

함수형 프로그래밍의 중요 개념:

  • First-class functions: 함수는 값으로 생각한다. 변수에 저장할 수도 있고, 매개 변수로 전달할 수도, 다른 함수에서 반환할 수도 있다.
  • Immutabilty: 생성된 이후에 수정되거나 변하지 않음이 보장된다.
  • No side effects: 같은 입력값에는 같은 리턴값이 생기며, 수정될 수 없으며 외부와 상호작용할 수 없다.

함수를 사용하면 어떤 장점이 있을까

1) 간결하다.
함수를 사용하면 더욱 간결하게 코드를 작성할 수 있다. 함수는 강한 추상화를 가능하게 하기 때문에 코드 중복을 방지할 수 있다.

2) 다중 스레드를 안전하게 사용할 수 있다.
다중 스레드를 사용할 때 적절한 동기화 없이 같은 데이터가 여러번 변경되기 때문에 오류가 빈번히 발생할 수 있다. 일관성 있는 데이터 구조와 함수를 사용하는 것으로 안전한 코드를 짤 수 있다.

3) 함수형 프로그래밍은 테스트하기 쉽다.
다른 준비 코드 없이도 순수 함수를 독립적으로 테스트해 볼 수 있다.

코틀린이 다른 언어와 차별화되는 점은 함수를 풍부하게 지원한다는 것이다:

  • 함수 타입을 지원한다. 함수를 매개변수로 받거나 다른 함수를 리턴할 수 있다.
  • 람다 식을 지원한다. 코드 블록을 간결하게 사용할 수 있다구.
  • 데이터 클래스는 일정한 값 객체를 만들어서 간결한 문법을 제공한다.
  • 풍부한 API를 제공하여 객체와 컬렉션을 함수형 스타일로 사용할 수 있게 한다.
  • 무료 오픈 소스
    코틀린의 컴파일러와 라이브러리, 그리고 관련 툴들이 모두 개방형이고 어떤 의도로 사용되어도 무료로 지원이 된다.

코틀린이 서버와 안드로이드 개발에 최적화된 이유

서버 상의 코틀린

서버에서의 프로그래밍이라고 하면 광범위한 개념이다. 브라우저에 HTML페이지를 리턴하는 웹 어플리케이션, 모바일 어플리케이션의 백엔드, RPC 프로토콜을 통해 다른 마이크로서비스와 소통하는 마이크로서비스 등을 포함한다.

여태까지 개발자들은 자바로 어플리케이션을 개발하기 위한 기술과 프레임워크를 만들어왔다. 이런 환경에서 자바와 매끄럽게 상호운용 할 수 있는 것이 코틀린의 큰 장점이다. 자바 클래스를 확장할 때나 클래스와 필드에 어노테이션을 달아야 할 경우에도 문제 없이 진행할 수 있다. 그러면서도 더욱 간결하고 신뢰성있는 코드를 만들 수 있다.

안드로이드에서의 코틀린

모바일 어플리케이션은 일반적인 인터프라이스 어플리케이션보다 작고 기존의 다른 코드와 새로 통합할 필요도 적다. 안드로이드 프레임워크를 지원하는 컴파일러 플러그인을 적용하는 코틀린은 더욱 생산적인 안드로이드 개발을 가능하게 한다. 예를 들어, 더 적은 수의 코드만으로도 실행할 수 있고 어떤 경우에는 아예 코드가 필요하지 않을 수도 있다.
또한 코틀린을 사용하면 어플리케이션 신뢰성이 높아진다. 안드로이드 앱을 개발해본 적 있는 사람이라면 프로세스가 중단됨(ProcessHasStopped) 대화상자를 본 적이 있을 것이다. 이 대화상자는 주로 처리되지 않는 예외(NullPointerException)가 발생한 경우에 나타난다. 코틀린의 타입 시스템은 null값을 정확하게 추적하여 null 포인터로 생기는 문제를 줄여준다.

코틀린의 철학

코틀린은 실용적이다.

코틀린은 현실 세계의 문제들을 해결하기 위해 개발된 실용적인 언어이다. 이는 기존 개발자들이 이미 개발해놓은 환경에 맞춰 적합하게 사용가능하다. 코틀린은 어느 특정 프로그래밍 스타일이나 패러다임을 따를 것을 강제하지 않는다. 코틀린을 처음 사용한다면 자바의 스타일이나 기법을 사용할 수 있다. 그러다가 코틀린에서 더욱 편리한 특성을 발견한다면 그것을 잘 활용해서 간결하게 코드를 작성할 수 있다.

코틀린은 간결하다.

개발자의 코드가 더욱 간결할 때 내용을 파악하기가 더 쉽다. 코틀린을 만들면서 번거롭고 부수적인 요소를 줄일 수 있게 되었다. getter, setter, 생성자 매개변수를 필드에 대입할 때의 번거로운 준비 코드를 코틀린은 기본적으로 제공하기 때문에 그러한 준비코드 없이도 간결하게 코드를 짤 수 있다. 또한 코틀린은 람다를 지원하기 때문에 작은 코드 블록을 라이브러리 함수를 쉽게 전달할 수 있어서 코드가 불필요하게 길어지는 것을 막을 수 있다.

코틀린은 안전하다.

프로그래밍 언어가 안전한 것은 오류를 일부적으로 방지해준다는 것이다. 코틀린에서는 JVM을 실행하기 때문에 몇몇 오류를 이미 줄여줘서 안전하다. 또한 코틀린은 타입 자동 추론을 사용해서 타입 안전성을 보장한다. 또한 컴파일 시점에 오류를 검사해서 실행 시점에 발생할 수 있는 오류를 예방할 수 있다.
코틀린은 또한 NullPointerException을 없애기 위해 노력한다. null 이 될 수 없는 값을 추적하여 실행 시점에 NullPointerException이 발생할 수 있는 코드를 표시해줄 수 있다.

val s: String? = null
val s2: String = ""

또한 코틀린이 예방하는 다른 예외는 ClassCastException이다. 이는 객체의 올바른 타입을 검사하지 않고 객체를 타입 캐스팅할 때 발생한다. 자바에서는 타입 검사와 캐스트에서 반복해서 쓰는 것이 귀찮아서 생략하는 개발자가 종종 있다. 하지만 코틀린에서는 타입 검사와 타입 캐스트가 한 연산에서 이뤄지기 때문에 이로 인해 발생할 수 있는 오류를 줄여준다.

if (value is String)
println(value.toUpperCase())

코틀린은 상호운용 가능하다.

코틀린의 상호운용성에서 가장 큰 부분은 자바이다. 기존 자바 프로젝트에 코틀린을 도입하여 자바를 코틀린으로 변환할 수 있다. 이는 코틀린의 도구를 실행해서 변환 가능하다. 또한 코틀린은 기존 자바 라이브러리를 활용해서 코드를 작성할 수 있다. 왜냐하면 코틀린은 자체 라이브러리를 지원하지 않고 자바 표준 라이브러리에 의존하기 때문이다.

코틀린 도구 사용

  • 코틀린 코드 컴파일
    코틀린 소스코드를 저장할 때 .kt 확장자를 사용해서 파일을 만든다. 코틀린 컴파일은 자바 컴파일러와 마찬가지로 코틀린 소스코드를 분석해서 .class 파일을 만든다. 이마저도 자바 명령을 사용하는 것이다.
  • 자바-코틀린 변환기
    위에서 설명했듯이 자바 코드를 코틀린 도구를 사용하여 코틀린 코드로 변환할 수 있다. 또한 자바 파일을 통째로 코틀린 파일로 변환할 수도 있다.
profile
공댕이😎_블체

0개의 댓글