Kotlin

[Kotlin] 언어 소개

kahnco 2024. 7. 21. 22:30
반응형

https://kotlinlang.org/docs/getting-started.html

개요

이번 시간에는 코틀린이라고 하는 언어의 기본적인 특징에 대해서 알아보겠습니다.


소개

코틀린은 Java, Scala, C# 및 Groovy 를 포함한 여러 프로그래밍 언어에서 영감을 받았습니다. 코틀린의 주요 아이디어 중 하나는 실용적이라는 것입니다. 즉, 일상적인 개발에 유용한 프로그래밍 언어로써, 기능과 도구를 통해 사용자들이 작업을 완료할 수 있도록 돕는다는 것입니다. 따라서 많은 설계 결정이 코틀린 사용자에게 얼마나 유익한지에 따라 영향을 받았습니다.

 

코틀린은 멀티플랫폼, 정적 타입, 범용 프로그래밍 언어입니다. 현재 1.9 버전 기준으로 다음 플랫폼에 대한 컴파일을 지원합니다.

1. JVM (Java Virtual Machine)
2. JS (JavaScript)
3. Native (다양한 아키텍처를 위한 네이티브 바이너리)

 

또한, 코틀린은 Kotlin Multiplatform Project (Kotlin MPP) 기능을 통해 다양한 플랫폼 간의 투명한 상호 운용성을 지원합니다.


타입 시스템

코틀린의 타입 시스템은 Nullable 타입과 Not-Nullable 타입을 컴파일 단계에서 구분하여, 값이 없는 경우로 인한 런타임 오류가 발생하지 않도록 보장합니다. 코틀린은 또한 Gradual TypingFlow Typing 요소로 정적 타입 시스템을 확장하여 다른 언어와의 상호 운용성과 개발의 용이성을 높였습니다.

 

  • Gradual Typing (점진적 타입 요소): 점진적 타이핑은 정적 타입 시스템과 동적 타입 시스템의 장점을 결합한 개념입니다. 이는 개발자가 타입을 점진적으로 추가하거나 제거할 수 있도록 하여 코드의 타입 안정성을 높이면서도 유연성을 제공합니다.
    1. 동적 타입 사용의 유연성
      • 코틀린에서는 정적 타입 언어임에도 불구하고, 일부 경우에 타입 정보를 명시하지 않고도 코드를 작성할 수 있습니다. 이는 초기 개발 단게에서 빠르게 프로토타입을 만들 때 유용합니다.
      • 예를 들어, 타입 추론을 통해 변수의 타입을 명시하지 않고도 사용할 수 있습니다. (아래 예시 참조)
    2. 점진적 타입 적용
      • 개발자는 필요에 따라 점진적으로 타입을 명시할 수 있으며, 이는 코드의 명확성과 안정성을 높이는 데 기여합니다.
      • 예를 들어, 함수의 반환 타입을 명시하지 않고 시작하여 나중에 명확히 할 수 있습니다. (아래 예시 참조)
// 동적 타입 사용의 유연성 예시
val message = "Hello, Kotlin!"  // 타입 추론을 통해 message는 String 타입으로 추론됩니다.

// 점진적 타입 적용의 예시
fun greet(name: String) = "Hello, $name"  // 반환 타입이 String으로 추론됩니다.

 

  • Flow Typing (흐름 타입 요소): 흐름 타이핑은 프로그램 실행 흐름에 따라 변수의 타입을 추론하고 검증하는 방식입니다. 이는 타입 검증을 더 엄격하게 하여 런타임 오류를 줄이는 데 도움을 줍니다.
    1. 스마트 캐스트
      • 코틀린은 변수의 타입을 안전하게 캐스트하는 기능을 제공합니다. 특정 조건문 내부에서 변수의 타입을 자동으로 변환하여 사용할 수 있습니다.
      • 예를 들어, `is` 연산자를 사용하여 타입을 검사하고, 그 조건문 내에서는 해당 타입으로 자동 캐스트 됩니다. (아래 예시 참조)
    2. 타입 안정성 보장
      • Flow Typing 을 통해, 변수의 타입을 보다 엄격하게 추적하여 런타임 오류를 방지합니다. 이는 특히 Nullability 검사에서 유용합니다. (아래 예시 참조)
// 스마트 캐스트 예시
fun demo(x: Any) {
    if (x is String) {
        // x는 여기서 자동으로 String 타입으로 캐스트 됩니다.
        println(x.length)
    }
}

// 타입 안정성 보장 예시
fun lengthOfString(str: String?) {
    if (str != null) {
        // str은 여기서 자동으로 String 타입으로 캐스트 되며, null 안전성이 보장됩니다.
        println(str.length)
    }
}

 

  • 상호 운용성 및 개발 용이성: 코틀린의 Gradual Typing 및 Flow Typing 요소는 다음과 같은 방식으로 다른 언어와의 상호 운용성과 개발의 용이성을 높입니다.
    1. 자바와의 상호 운용성
      • 코틀린은 자바와 100% 상호 운용 가능하며, 자바 코드를 코틀린 코드로 점진적으로 변환할 수 있습니다. 이는 자바 기반 프로젝트에서 코틀린을 도입하는데 큰 장점을 제공합니다.
      • 점진적 타입을 사용하면 자바 코드의 타입 정보를 점진적으로 코틀린으로 변환할 수 있습니다.
    2. 개발자 경험 개선
      • Gradual Typing 과 Flow Typing 을 통해 개발자는 코드를 더 간결하고 읽기 쉽게 작성할 수 있습니다. 이는 유지보수성과 가독성을 높이며, 타입 관련 오류를 줄이는 데 도움을 줍니다.
      • 특히, Null-Safety 를 보장하는 Flow Typing은 Null-Pointer Exception을 줄이는 데 중요한 역할을 합니다.

개발론적인 관점

 

코틀린은 객체 지향 언어로써 많은 함수형 프로그래밍 요소도 가지고 있습니다. 객체 지향 측면에서는 제네릭과 유사한 면이 있는 매개변수화 다형성 및 혼합 사이트 분산을 지원합니다. 함수형 프로그래밍 측면에서는 고차 함수 및 람다 리터럴에 대한 일급 지원을 제공합니다.

 

객체 지향 프로그래밍 요소

  1. Parametric Polymorphism with Bounded Generics (제네릭과 유사한 경계가 있는 매개변수화 다형성)
    • 매개변수화 다형성: 제네릭 프로그래밍의 핵심 개념으로, 코드 재사용성을 높이기 위해 타입을 매개변수로 사용할 수 있도록 합니다. 예를 들어, 다양한 타입의 리스트를 처리할 수 있는 일반화된 클래스나 함수를 만들 수 있습니다.
    • 경계(Bound): 이러한 제네릭 타입에 제약을 추가할 수 있는 기능입니다. 예를 들어, 특정 타입 또는그 하위 타입만을 허용하도록 제한할 수 있습니다.
    • 코틀린에서는 제네릭 타입 매개변수에 out 또는 in 키워드를 사용하여 공변성과 반공변성을 지원합니다. 이는 타입 시스템의 유연성을 높이고, 타입 안정성을 유지하면서 다양한 상황에 적응할 수 있게 합니다.
  2. Mixed-site Variance (혼합 사이트 분산)
    • 공변성(Covariance): 제네릭 타입 Producer<out T>T의 서브 타입을 허용합니다. 이는 Producer<String>Producer<Any>의 서브 타입이 되는 것을 의미합니다.
    • 반공변성(Contravariance): 제네릭 타입 Consumer<in T>T의 슈퍼 타입을 허용합니다. 이는 Consumer<Any>Consumer<String>의 서브 타입이 되는 것을 의미합니다.
    • 코틀린에서는 out 키워드를 통해 공변성을, in  키워드를 사용해 반공변성을 지정할 수 있습니다. 이를 통해 함수와 제네릭 타입의 안전한 사용을 보장합니다.
// 공변성
interface Producer<out T> {
    fun produce(): T
}

// 반공변성
interface Consumer<in T> {
    fun consume(item: T)
}

 

 

함수형 프로그래밍 요소

  1. Higher-Order Functions (고차 함수)
    • 고차 함수는 함수를 인자로 받거나 함수를 반환하는 함수입니다. 이는 함수형 프로그래밍의 기본 구성 요소로, 함수 자체를 데이터처럼 다룰 수 있게 합니다.
    • 코틀린에서는 고차 함수를 쉽게 정의하고 사용할 수 있으며, 이는 코드를 더 유연하고 재사용 가능하게 만듭니다.
  2. Lambda Literals (람다 리터럴)
    • 람다 리터럴은 익명 함수로, 코드 블록을 직접 전달할 수 있습니다. 이는 간결하고 명확한 코드 작성을 가능하게 합니다.
    • 코틀린에서는 람다를 중괄호 를 사용하여 정의하며, 필요한 경우 파라미터를 선언하고, 화살표를 사용해 람다 본문을 구분합니다.
// 예시: 고차 함수
fun calculate(x: Int, y: Int, operation: (Int, Int) -> Int): Int {
    return operation(x, y)
}

fun main() {
    val sum = calculate(4, 5) { a, b -> a + b }
    println(sum)  // 출력: 9
}

// 코틀린에서는 람다를 함수의 마지막 인자로 전달할 때, 람다를 함수 호출 소괄호 바깥으로 뺄 수 있는 문법이 존재
// 아래 결과 값은 모두 동일합니다
val sum = calculate(4, 5, { a, b -> a + b })
println(sum)  // 출력: 9

val sum = calculate(4, 5) { a, b -> a + b }
println(sum)  // 출력: 9


// 예시: 람다 리터럴
val sum: (Int, Int) -> Int = { x, y -> x + y }
println(sum(3, 4))  // 출력: 7

 

 

여기까지 코틀린이라는 프로그래밍 언어의 기초에 대해 알아보았습니다. 다음에는 코틀린의 Concept 에 대해 알아보겠습니다

반응형

'Kotlin' 카테고리의 다른 글

[Kotlin] Asynchronous Programming Techniques - 2  (0) 2024.08.07
[Kotlin] Asynchronous Programming Techniques - 1  (0) 2024.08.05
[Kotlin] Types  (0) 2024.08.01
[Kotlin] Basic Syntax  (0) 2024.07.31