DHistory

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

Programming/Kotlin

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

ddu0422 2021. 8. 22. 01:58

코틀린 맛보기

// Data Class
// 널이 될 수 있는 타입과 파라미터 디폴트 값
data class Person(val name: String, val age: Int? = null) 

// 최상위 함수
fun main(args: Array<String>) {
  val persons = listOf(
    Person("미르"),
    // 이름 붙인 파라미터
    Person("두호", age = 28)
  )
  // 람다 식과 엘비스 연산자(?:)
  val oldset = persons.maxBy { it.age ?: 0 }
  // 문자열 템플릿
  println("나이가 가장 많은 사람: $oldset")
}

// toString 자동 생성
출력: 나이가 가장 많은 사람: Person(name=두호, age=28)

코틀린의 주요 특성

사용 범위

자바

서버상의 코드

안드로이드 모바일 애플리케이션

인텔의 멀티 OS 엔진

토네이도 FX, 자바 FX

자바스크립트

정적 타입 지정 언어

정적 타입 언어이다.

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

자바와 달리 코틀린에서는 모든 변수의 타입을 개발자가 직접 명시할 필요가 없다.

컴파일러가 문맥을 고려해 변수 타입을 결정하는 이런 기능을 타입 추론(type inference)이라고 부른다.

널이 될 수 있는 타입을 지원한다.(컴파일 시점에 NPE가 발생할 수 있는지 여부를 검사할 수 있다.)

장점

성능: 실행 시점에 어떤 메서드를 호출할지 알아내는 과정이 필요 없으므로 메서드 호출이 더 빠르다.

신뢰성: 컴파일러가 프로그램의 정확성을 검증하기 때문에 실행 시 프로그램이 오류로 중단될 가능성이 더 적어진다.

유지 보수성: 코드에서 다루는 객체가 어떤 타입에 속하는지 알 수 있기 때문에 처음 보는 코드를 다룰 때도 더 쉽다.

도구 지원: 정적 타입 지정을 활용하면 더 안전하게 리팩토링 할 수 있고, 도구는 더 정확한 코드 완성 기능을 제공할 수 있으며, IDE의 다른 지원 기능도 더 잘 만들 수 있다.

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

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

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

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

장점

간결성: 명령형 코드에 비해 간결하며 우아하다. 함수를 값처럼 활용할 수 있으면 더 강력한 추상화를 할 수 있고 강력한 추상화를 사용해 코드 중복을 막을 수 있다.

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

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

코틀린이 함수형 프로그래밍을 지원하는 방법

함수 타입을 지원함에 따라 어떤 함수가 다른 함수를 파라미터로 받거나 함수가 새로운 함수를 반환할 수 있다.

람다 식을 지원함에 따라 번거로운 준비 코드를 작성하지 않아도 코드 블록을 쉽게 정의하고 여기저기 전달할 수 있다.

데이터 클래스는 불변적인 값 객체를 간편하게 만들 수 있는 구문을 제공한다.

코틀린 포준 라이브러리는 객체와 컬렉션을 함수형 스타일로 다룰 수 있는 API를 제공한다.

코틀린의 철학

실용성

실제 문제를 해결하기 위해 만들어진 실용적인 언어다.

이미 성공적으로 검증된 해법과 기능에 의존하여, 언어의 복잡도가 줄어들고 이미 알고 있는 기존 개념을 통해 코틀린을 더 쉽게 배울 수 있다.

도구를 강조한다. (좋은 IDE를 제공)

간결성

개발자가 코드를 새로 작성하는 시간보다 기존 코드를 읽는 시간이 더 길다. 버그와 관련된 여러 코드를 두루두루 살펴본 뒤에야 코드를 제대로 수정할 수 있다.

코드가 간단하고 간결할수록 내용을 파악하기가 쉽다.

의도를 쉽게 파악할 수 있는 구문 구조를 제공하고, 프로그램에 꼭 넣어야 하는 부수적인 요소를 줄이기 위해 많은 노력을 기울였다.

기호로 된 이름보다는 단어로 이뤄진 이름이 훨씬 더 읽거나 검색하기 쉽다.

안전성

일부 유형의 오류를 프로그램 설계가 원천적으로 방지해준다.

더 큰 안전성을 얻기 위해서는 프로그램에 더 많은 정보를 덧붙여야 하므로 생산성이 하락하는 것을 감수해야 하며 안전성과 생산성 사이에는 트레이드오프 관계가 성립한다.

타입 안전성을 보장한다.

NullPointException을 없애기 위해 노력한다.

val name1: String? = null // null이 될 수 있음
val name2: String         // null이 될 수 없음

어떤 객체의 타입을 캐스트 없이 사용할 수 있다.

if (value is String)             // 타입을 검사한다.
    println(value.toUpperCase()) // 해당 타입의 메서드를 사용한다.

상호운용성

자바 메서드를 호출하거나 자바 클래스를 상속하거나 인터페이스를 구현하거나 자바 애노테이션을 코틀린 코드에 적용하는 등의 일이 가능하다.

자바 코드에서 코틀린 코드를 호출할 때 아무런 노력이 필요 없다.

코틀린은 자바 표준 라이브러리 클래스에 의존한다.

코틀린 코드 컴파일

코틀린 컴파일 과정

코틀린 컴파일러로 컴파일한 코드는 코틀린 런타임 라이브러리에 의존한다.

런타임 라이브러리에는 코틀린 자체 표준 라이브러리 클래스와 코틀린에서 자바 API의 기능을 확장한 내용이 들어있다.

코틀린으로 컴파일한 애플리케이션을 배포할 때는 런타임 라이브러리도 함께 배포해야 한다.

요약

- 코틀린은 타입 추론을 지원하는 정적 타입 지정 언어다. 따라서 소스코드의 정확성과 성능을 보장하면서도 소스코드를 간결하게 유지할 수 있다.

- 코틀린은 객체지향과 함수형 프로그래밍 스타일을 모두 지원한다. 코틀린에서는 일급 시민 함수를 사용해 수준 높은 추상화가 가능하고, 불변 값 지원을 통해 다중 스레드 애플리케이션 개발과 테스트를 더 쉽게 할 수 있다.

- 코틀린을 서버 애플리케이션 개발에 잘 활용할 수 있다.

- 코틀린은 무료며 오픈소스다. 또한 주요 IDE와 빌드 시스템을 완전히 지원한다.

- 코틀린은 실용적이며 안전하고 간결하며 상호운용성이 좋다. 이는 코틀린을 설계하면서 일반적인 작업에 대해 이미 잘 알려진 해법을 채택하고, NullPointerException과 같이 흔히 발생하는 오류를 방지하며, 읽기 쉽고 간결한 코드를 지원하면서 자바와 아무런 제약 없이 통합될 수 있는 언어를 만드는 데 초점을 맞췄다는 뜻이다.