Home
Kotlin
코틀린 학습 - 개요 및 특징 - 첫 번째 (Kotlin Background)
devfoxstar
devfoxstar
September 11, 2022
1 min

Table Of Contents

01
Background
02
Why Kotlin
03
Concise (간결한)
04
Safe (안전한)
05
Expressive (편리한 표현)
06
Interoperable (호환하는)
07
Multiplatform

최근 많은 프로젝트들이 SpringBoot + Kotlin으로 구축되고 있습니다.
이전에 SpringBoot + Java 구조를 점차 대체해 나가고 있습니다.

대규모 서비스를 Kotlin으로 개발하는 이유가 뭘까요?
오늘은 Kotlin의 배경과 특징을 알아보겠습니다.


Background

코틀린은 JetBrains에서 2011년에 공개한 오픈 소스 프로그래밍 언어입니다.
JVM을 기반으로 Java 보다 간결한 문법과 다양한 기능을 제공합니다.

특히 2017년에 안드로이드 공식 언어로 채택 되면서 주목 받고 있습니다.
또한 오라클 자바의 저작권 이슈도 코틀린의 활성화에 한 몫을 하고 있습니다.

이제는 서버 사이드 개발에서 코틀린이 우선 채택되고 있습니다.
생산성 향상과 코드량 감소를 무기로 서서히 자바 시장을 잠식해 가고 있습니다.

물론 자바의 아성이 쉽게 무너지지는 않을 겁니다.
그 동안 수 많은 언어들이 자바에게 도전했지만, 결국엔 무릎을 꿇었기 때문입니다.

그래도 현재까지 코틀린이 보여준 생산성과 편의성은 자바를 위협하기에 충분합니다.

결국 코틀린과 자바의 싸움은 결국 업데이트 싸움입니다.
자바의 다음 업데이트에 어떤 무기가 있을지 궁금하군요.


Why Kotlin

코틀린 공식 사이트에서는 코틀린을 써야 하는 이유를 간단하게 설명합니다.
현대적이고 간결하며 안전한 프로그래밍 언어라고 합니다.

Modern, concise and safe programming language
Easy to pick up, so you can create powerful applications immediately.


Concise (간결한)

클래스에 변수를 선언하면 자동으로 부가 정보가 생성됩니다.
그리고 싱클톤과 함수 지정도 간단하게 가능합니다.

또한 new 키워드도 필요 없습니다.

data class Employee(
   val name: String,
   val email: String,
   val company: String
) // + automatically generated equals(), hashCode(), toString(), and copy()

object MyCompany {                                // A singleton
   const val name: String = "MyCompany"
}

fun main() {                                      // Function at the top level
   val employee = Employee("Alice",               // No `new` keyword
      "alice@mycompany.com", MyCompany.name)
   println(employee)
}

Safe (안전한)

자바에서 가장 자주 접하며 피곤한 오류가 바로 NPE(Null Point Exception)입니다.
코틀린은 Null을 허용하며 타입까지 지원해서 NPE로 부터 자유롭습니다.

fun reply(condition: Boolean): String? =          // Nullability is part of Kotlin’s type system
   if (condition) "I'm fine" else null

fun error(): Nothing =                            // Always throw an exception
   throw IllegalStateException("Shouldn't be here")

fun main() {
   val condition = true                        // Try replacing `true` with `false` and run the sample!
   val message = reply(condition)              // The result is nullable
   // println(message.uppercase())             // This line doesn't compile
   println(message?.replace("fine", "okay"))   // Access a nullable value in a safe manner
   if (message != null) {                      // If you check that the type is right,
      println(message.uppercase())             // the compiler will smart-cast it for you
   }

   val nonNull: String =                             // If the null-case throws an error,
   reply(condition = true) ?: error()             // Kotlin can infer that the result is non-null
   println(nonNull)
}

Expressive (편리한 표현)

개발에 필요한 다양한 표현식을 간결하고 편리하게 사용할 수 있습니다.

val map = mapOf(1 to "one", 2 to "two")
for ((k, v) in map) {                            // Traverse a map or a list of pairs
    println("$k -> $v")
}

fun obtainKnowledge() = Pair("The Answer", 42)   // Single-expression functions

val (description, answer) = obtainKnowledge()    // Destructure into a pair of two variables
println("$description: $answer")

getText()?.let {                                 // Apply an action to a nullable expression
    sendEmailTo("alice@example.com", it)          // if it’s not null 
}

createEmptyWindow()
    .apply {                                    // Configure properties of an object
        width = 300
        height = 200
        isVisible = true
    }.also { w ->                               // Perform an additional operation on a call chain
        showWindow(w)
    }

val fixedIssue = issueById["13456"]
?.takeIf { it.status == Status.FIXED }       // Use the value only if the condition is true
println(fixedIssue)

Interoperable (호환하는)

JVM을 사용하는 라이브러리나 프레임워크와 호환이 가능합니다.
그래서 자바와 함께 사용할 수 있습니다.

// Use any existing JVM library or framework
// Call Kotlin code from Java without an issue

@SpringBootApplication
class DemoApplication

fun main(args: Array<String>) {
   runApplication<DemoApplication>(*args)
}

@RestController
class MessageResource {
   @GetMapping
   fun index(): List<Message> = listOf(
      Message("1", "Hello!"),
      Message("2", "Bonjour!"),
      Message("3", "Privet!"),
   )
}

data class Message(val id: String?, val text: String)

Multiplatform

다양한 플랫폼을 지원합니다.
아래 그림을 보면 이해가 쉬워집니다.

Multiplatform
Multiplatform

Why Kotlin


Tags

#Kotlin#Study#Background

Related Posts

Kotlin - invoke 함수
May 29, 2023
1 min
© 2024, All Rights Reserved.

Quick Links

About Me

Media