코틀린 소개(5가지 특징)

Aram·2022년 2월 12일
0

코틀린을 사용하기 전 공식사이트에 들어가보았다. 딱! 소개페이지까지만...... 특징만 정리해보자!
https://kotlinlang.org/

코틀린을 쓰는 이유?

코틀린 공식 사이트에서는 코틀린을 아래와 같이 정의하고 있다.

개발자를 행복하게 만드는 모던한 프로그래밍 언어

왜 코틀린인가?

모던하고 간결하고 안전하다.
선별이 쉬워서 강력한 애플리케이션을 즉각적으로 만들 수 있다.

1. 간결하다

https://pl.kotl.in/2JSHhao8f

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)
}
  • data/object/fun(ction)으로 선언한 걸 보니까 명시적으로 되어있는 것 같다.

  • 먼저 data를 보니, equals(), hashCode(), toString(), and copy()를 따로 선언하지않아도 자동으로 생성해준다. 단지 data에 선언해주는 것만으로도 말이다.
    이는 lombok과 비슷해보이기 하지만 lombok을 쓰기 위해서는 pom.xml에 depandency를 따로 추가해줘야하는 것과 달리 정말 코틀린은 자동생성이다.

  • 싱글톤으로 구현하고 싶다면 object라는 키워드만 써주면 된다. 자바에서는 static을 써주고 호출해야했는데 정말 간단하군!

  • 함수를 최상위에 선언할 수 있다. 자바에서는 최상위에 Class를 생성하고(보통 네이밍은 무슨무슨~~utils) Class 내부에 메서드를 선언하여 사용하는데 코틀린은 최상위에 함수 선언이 가능하다.

  • 인스턴스 선언 시에 'new' 키워드를 사용하지 않는다. 자바에서는 객체 선언 후 메모리 할당을 위해 인스턴스로 사용되면 new키워드를 사용하는데 코틀린은 바로 값을 할당해주면 된다.

2. 안전하다

https://pl.kotl.in/6aEV_UeDd

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)
}
  • 이제껏 얼마나 많은 널포인트익셉션을 봐왔던가...... 그런데 코틀린에선 null을 허용해준다!!!!!
  • 항상 예외를 던져준다.

3. 표현적이다

https://pl.kotl.in/AU-1V1d3N

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)

4. 상호호환이 가능하다

// 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)
// Write Kotlin code, compile it to JavaScript, and run it in the browser
// Use existing JavaScript APIs and libraries

import kotlinx.browser.window

fun main() {
   val body = window.document.body

   body?.innerHTML += "<b>Hello, <i>Kotlin</i></b>"

   window.setInterval({
      body?.innerHTML += "!"
   }, 1000)
}
// Use Kotlin wrappers to build applications with JavaScript frameworks such as React

import react.*
import react.dom.*
import kotlinx.html.js.onClickFunction

val counter = functionalComponent<Props> {
   val (count, setCount) = useState(0)
   button {
      attrs.onClickFunction = { setCount(count + 1) }
      +count.toString()
   }
}

5. 멀티플랫폼이다

// Common
// Declare signatures to use them in the common code
// Provide platform-specific implementations in the platform modules
expect fun randomUUID(): String

expect class PlatformSocket(
       url: String
) {
    fun openSocket(listener: PlatformSocketListener)
    fun closeSocket(code: Int, reason: String)
    fun sendMessage(msg: String)
}

interface PlatformSocketListener {
    fun onOpen()
    fun onFailure(t: Throwable)
    fun onMessage(msg: String)
    fun onClosing(code: Int, reason: String)
}
import java.util.*

actual fun randomUUID() = UUID.randomUUID().toString()

actual class PlatformSocket actual constructor(url: String) {
   // Use okhttp3 in implementation
}
// iOS
import platform.Foundation.NSUUID

actual fun randomUUID(): String = NSUUID().UUIDString()

actual class PlatformSocket actual constructor(url: String) {
   // Use platform.Foundation in implementation
}
// JS
// Use the `uuid` package from npm as dependency
actual fun randomUUID(): String = uuidv4() 

actual class PlatformSocket actual constructor(url: String) {
   // Implementation on top of WebSockets
}

!!

간단히 소개를 보고 코드 예시를 봤는데
자바를 비롯한 자스, ios 호환이 된다는 점이 가장 매력적인 것 같다. 언어만 학습하면 그래도 당장 적용해볼 수 있을 것 같다. 무엇보다 명시적인 문법이 특징인 것 같다. 바닐라자스 떼고 바로 토이플젝 진행해 볼 예정!

profile
백엔드 개발자💻 제발! 잘 하고 싶어요ㅠ (FE/BE)

0개의 댓글