본문 바로가기

reviews/Kotlin in Action

1. 코틀린이란 무엇이며, 왜 필요한가?

코틀린Kotlin이란?

자바 플랫폼에서 돌아가는 새로운 프로그래밍 언어

  • 주 목적 : 현재 자바가 사용되고 있는 모든 용도에 적합하면서도 더 간결하고 생산적이며 안전한 대체 언어를 제공하는 것
  • 간결하고 실용적
  • 자바 코드와의 상호운용성을 중시함
    • 자바에서 대체할 수 있음
    • 기존 자바 라이브러리나 프레임워크와 함께 잘 작동하며 성능도 자바와 같은 수준임
  • 사용 영역
    • 서버 상의 코드
    • 안드로이드 디바이스에서 실행되는 모바일 애플리케이션

코틀린 실행해보기 > https://play.kotlinlang.org/

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

fun main (args: Array<String>) { // 함수를 최상위 수준에 정의할 수 있어 꼭 클래스 안에 함수를 넣어야 할 필요가 없음(2장)
    val persons = listOf (Person("영희"), Person ("철수", age = 29))
    val oldest = persons.maxByOrNull { it.age ?: 0 }
    println("나이가 가장 많은 사람: $oldest")
}
// 나이가 가장 많은 사람: Person(name=철수, age=29)

* it : 람다식의 인자가 한 개인 경우 별도로 파라미터 이름을 정의하지 않고 사용할 수 있음

1.2 코틀린의 주요 특성

1.2.2 정적 타입 지정 언어

정적 타입 지정의 장점

  • 성능
    • 메소드 호출이 더 빠름
  • 신뢰성
    • 컴파일러가 프로그램의 정확성을 검증함
  • 유지보수성
    • 코드에서 다루는 객체가 어떤 타입에 속하는지 알 수 있기 때문에 처음 보는 코드를 다룰 때도 더 쉬움
  • 도구지원

타입 추론 type inference

컴파일러가 문맥을 고려해 변수 타입을 결정하는 것

  • 널이 될 수 있는 타입을 지원하여 컴파일 시점에 널 포인터 예외가 발생할 수 있는지 여부를 검사할 수 있음 → 프로그램의 신뢰성을 높일 수 있음
var x: Int = 1
var x = 1 // 코틀린은 이 변수의 타입이 Int임을 자동으로 알아냄
# 타입 추론 한 타입과 다른 타입을 초기화 하려고 한 경우

fun main (args: Array<String>) {
    var x = 1
    x = "sth"
    println(x)
}
// Type mismatch: inferred type is String but Int was expected

함수 타입을 지원함

함수형 프로그래밍 스타일을 강제하지는 않음

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

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

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

  • 일급 시민인 함수
    • 함수를 일반 값처럼 다룰 수 있음
    • 함수를 변수에 저장할 수 있고, 함수를 인자로 다른 함수에 전달할 수 있으며, 함수에서 새로운 함수를 만들어서 반환할 수 있음
  • 불변성
    • 내부 상태가 절대로 바뀌지 않는 불변 객체를 사용해 프로그램을 작성함
  • 부수 효과 없음
    • 입력이 같으면 항상 같은 출력을 내놓고 다른 객체의 상태를 변경하지 않으며, 함수 외부나 다른 바깥 환경과 상호작용하지 않는 순수 함수를 사용함

함수형 프로그래밍의 유익

  • 간결성
    • 명령형 코드에 비해 더 간결하고 우수함
    • 더 강력한 추상화를 할 수 있고 강력한 추상화를 사용해 코드 중복을 막을 수 있음
  • 다중 스레드를 사용해도 안전함
    • 다중 스레드 프로그램에서 적절한 동기화 없이 같은 데이터를 여러 스레드가 변경하는 경우 많은 문제가 생기는데 불변 데이터 구조를 사용하고 순수 함수를 그 데이터 구조에 적용한다면 다중 스레드 환경에서 같은 데이터를 여러 스레드가 변경할 수 없음. 따라서 복잡한 동기화를 적용하지 않아도 됨
  • 테스트 용이
    • 전체 환경을 구성하는 준비 코드가 필요한 부수 효과가 있는 함수와 달리 독립적으로 테스트 할 수 있음

1.3 코틀린 응용

1.3.1 코틀린 서버 프로그래밍

코틀린으로 서버 프로그래밍을 할 떄 가질 수 있는 이점

  • 코틀린의 빌더 패턴을 사용하면 간결한 구문을 사용해 객체로 이뤄진 그래프를 쉽게 구축하면서도 코틀린이 제공하는 완전한 추상화와 코드 재활용을 지속적으로 누릴 수 있음
  • DSL 기능을 제공함

1.4 코틀린 철학

1.4.1 실용성

1.4.2 간결성

  • 프로그래머가 작성하는 코드에서 의미가 없는 부분을 줄이고, 언어가 요구하는 구조를 만족시키기 위해 별 뜻 없이 넣어야 하는 부수적인 요소를 줄임
  • (getter, setter, 생성자 파라미터 등 여러가지 번거로운 준비 코드를 묵시적으로 제공하여 간결함)
  • 기능이 다양한 표준 라이브러리를 제공함
  • 람다를 지원함

1.4.3 안전성

프로그램에서 발생할 수 있는 오류 중에서 일부 유형의 오류를 프로그램 설계가 원척적으로 방지해줌

실행 시점에 오류를 발생시키는 대신 컴파일 시점 검사를 통해 오류를 더 많이 방지해줌

  • NullPointerException 방지
    • NullPointerException : null이 될 수 없는 값에 null이 들어갈 경우 발생
    # null이 될 수 있는 변수와 없는 변수
    
    val s: String? = null // 타입 뒤에 ?를 추가하면 null이 될 수 있음
    val s2: String = ""
    
  • ClassCastException 방지
    • ClassCastException : 어떤 객체를 다른 타입으로 캐스트 하기 전에 타입을 미리 검사하지 않으면 발생
    타입 검사와 캐스트가 한 연산자에 의해 이뤄져 자연스럽게 타입 검사를 하게 되므로 타입 검사를 생략해서 생기는 오류가 방지됨
  • # 어떤 객체의 타입을 검사했고 그 객체가 그 타입에 속한다면 해당 타입의 메소드나 필드 등의 멤버를 별도의 캐스트 없이 사용할 수 있음 if (value is String) // <---- 타입을 검사한다. printin (value.toUpperCase()) // <---- 해당 타입의 메소드1 사용한다.

1.4.4 상호운용성

기존 자바 라이브러리를 그대로 사용할 수 있음

코틀린은 자바와 코틀린 소스 파일이 임의로 섞여 있어도 각 소스 파일 사이의 의존관계가 어떤식으로 이루어졌든 관계없이 프로그램을 제대로 컴파일 할 수 있음

1.5 코틀린 도구 사용

반응형

'reviews > Kotlin in Action' 카테고리의 다른 글

2. 코틀린 기초  (0) 2022.01.16