코틀린을 사용하기 전 공식사이트에 들어가보았다. 딱! 소개페이지까지만...... 특징만 정리해보자!
https://kotlinlang.org/
코틀린 공식 사이트에서는 코틀린을 아래와 같이 정의하고 있다.
개발자를 행복하게 만드는 모던한 프로그래밍 언어
모던하고 간결하고 안전하다.
선별이 쉬워서 강력한 애플리케이션을 즉각적으로 만들 수 있다.
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키워드를 사용하는데 코틀린은 바로 값을 할당해주면 된다.
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)
}
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)
// 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()
}
}
// 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 호환이 된다는 점이 가장 매력적인 것 같다. 언어만 학습하면 그래도 당장 적용해볼 수 있을 것 같다. 무엇보다 명시적인 문법이 특징인 것 같다. 바닐라자스 떼고 바로 토이플젝 진행해 볼 예정!