Nullable
코틀린 컴파일러에서는 null 값을 유지할 수 있는 변수를 명시적으로 선언해야 합니다. 따라서 런타임에 더 이상 NullPointerException이 발생하지 않습니다!
var neverNull: String = "something"
var mightBeNull: String? = null // "?" indicates this can be null
if (neverNull.length > 0) { // This is OK
…
}
if (mightBeNull.length > 0) { // Compiler catches this error for you
…
}
명명된 매개변수 및 기본 인수
우린 그 동안 추적해야 할 매개변수가 너무 많은 메서드를 봐왔습니다. 예를 들면 다음과 같습니다.
fun orderPizza(size: Size, pepperoni: Boolean, mushrooms: Boolean,
ham: Boolean, pineapple: Boolean, pickles: Boolean,
sausage: Boolean, peppers: Boolean, onion: Boolean)
{
...
}
// Wait… did I just order pickles on my pizza?
// Why do we even have that option?
orderPizza(Size.LARGE, true, false, false, false, true,
false, true, false)
이를 명명된 매개변수 및 기본 인수를 사용하는 유사한 시나리오와 비교해보세요.
fun orderPizza(size: Size,
pepperoni: Boolean = false,
mushrooms: Boolean = false,
ham: Boolean = false,
pineapple: Boolean = false,
pickles: Boolean = false,
sausage: Boolean = false,
peppers: Boolean = false,
onion: Boolean = false)
{
...
}
orderPizza(Size.LARGE, ham = true, mushrooms = true)
결과가 엉망진창이 되지 않도록 하는 데도 도움이 되지만, 무엇보다도 훨씬 더 쉽게 읽을 수 있습니다. 또한, 작성해야 하는 오버로드된 함수 변형의 수도 줄어듭니다.
When 문
코틀린에는 임의 식에 맞출 수 있도록 하는 switch 문의 변형이 있습니다.
// Please don't put this in your app!
when {
password.equals("password") -> println("Insecure password!")
password.length < 4 -> println("Too short!")
else -> {
println("Secure password!")
}
}
스마트 캐스트
왜 어떤 항목이 어떤 클래스의 인스턴스임을 테스트한 후 바로 이 항목을 해당 클래스로 캐스트해야 하는 걸까요? 코틀린에서는 더 이상 그렇게 할 필요가 없습니다.
if (obj is String) {
// Compiler casts obj to a String for you.
// (Would work with && instead of nested ifs too.)
if (obj.length > 0) {
…
}
}
이는 when 문에도 일반화할 수 있는 사항입니다.
// Assume reasonable implementations of Cat and Dog
when (obj) {
is Cat -> obj.meow(...)
is Dog -> obj.woof(...)
else -> {
…
}
}
확장 함수(Extension functions)
코틀린을 사용하면 기본적으로 새 메서드를 기존 유형으로 레트콘(retcon)할 수 있습니다. 많은 사람들처럼 여러분도 String 클래스에 toPigLatin
메서드가 있기를 바라는 경우 이제는 새 도우미 클래스를 생성하여 String을 래핑하거나 언어 위원회의 도움을 받는 데 곤란을 겪지 않고도 직접 이러한 메서드를 추가할 수 있습니다.
// The "String." prefix indicates that this method should
// extend the existing String class
fun String.toPigLatin() : String {
...
}
val plainOldString : String = "some text"
// Can now call toPigLatin as if were a method on String
println(plainOldString.toPigLatin())
// Or:
println("some text".toPigLatin())
분해 선언(Destructuring Declarations)
우리는 이미 얼마나 쉽게 단순한 데이터 클래스를 정의할 수 있는지 확인했습니다.
data class Order(val itemCode: String, val quantity: Int,
val price: Float)
이러한 클래스 중 하나를 반환 유형으로 사용하는 함수는 여러 반환 값을 지원하는 것과 매우 흡사합니다.
fun getOrder(...): Order {
...
return Order(itemCode, quantity, price);
}
이를 알아보려면 분해 선언 구문을 사용하면 됩니다. 다음 명령문은 Order
객체를 받고, 이 객체의 세 속성을 추출한 후 이를 세 변수 what
, howMany
및 howMuch
에 할당합니다. 이 작업은 모두 코틀린 컴파일러 덕분에 가능한 것이며, 이 컴파일러는 개발자 대신 올바른 유형을 추론하기도 합니다.
val (what, howMany, howMuch) = getOrder(...)
람다(Lambda)
코틀린은 강력한 기능을 갖춘 프로그래밍 패러다임을 쉽게 표현할 수 있게 해주는 매우 간결한 람다 구문을 제공합니다. 다음은 람다를 사용하여 컬렉션에 포함된 모든 항목이 String인지 테스트하는 간단한 예제입니다.
fun allStrings(collection: Collection)=
collection.all { it is String }
이 람다 구문은 코틀린의 가장 멋진 기능 중 하나로서, 유효한 코틀린 문법을 사용하여 JSON과 유사한 구문을 사용하는 빌더를 생성할 수 있는 기능의 기본 구성 요소입니다. 이 예제는 이 주제에서 더 자세히 알아볼 수 있으며, 다음 코드 예제를 통해 어떤 것들이 가능한지 알아볼 수 있습니다.
fun generatePage(withEmphasis : Boolean) {
val result =
html {
head {
title { +"Kotlin Builders" }
}
body {
h1 { +"Kotlin Builders" }
p {
+"This is "
if (withEmphasis) b { +"really " }
+"interesting"
a(href = "https://goo.gl/rHwJio") { +"More here" }
}
}
}
println(result)
}
여기에 몇 가지 흥미로운 점이 있습니다. 첫째, 얼마나 쉽게 코틀린의 기능적 구문을 표현할 수 있는지 보여 줍니다. 이 예제에서 "html
", "head
", "body
" 등은 모두 코틀린으로 작성된 함수이며 그 다음에 오는 중괄호로 묶인 항목은 함수 매개변수입니다. (이 스니펫에서는 HTML 태그와 일치하는 이름을 갖는 함수를 사용하여 웹페이지 표현을 빌드하지만, 당연히 개발자도 이 패턴을 사용하여 원하는 이름으로 복잡한 데이터 구조체를 빌드할 수 있습니다.) 두 번째로 흥미로운 점은 "withEmphasis
" 조건부 명령입니다. 이는 코드(if (withEmphasis)
…)를 데이터(모든 HTML 양식의 태그)와 혼용하는 것처럼 보일 수 있지만, 여기서 "데이터"는 실제로 코드에 훨씬 더 가깝습니다. 데이터가 모두 실제로는 코드이기 때문에 이를 통해 코틀린 언어의 전체 기능에 대한 인라인 액세스를 유지하는 동시에 선언적 구문을 사용하여 복잡한 데이터 구조체를 빌드할 수 있습니다.
시작하기
코틀린으로 작업을 시작하려면 여기서 바로 온라인으로 제공되는 코드를 이용하여 작업을 시작할 수 있습니다. 컴파일하고 실행하려면 녹색 삼각형을 누르기만 하면 됩니다.
앱에 코틀린을 사용해 보려면 다음 단계를 따르세요.
- Android Studio 3.0을 다운로드합니다.
- 기존 ".java" 파일 중 하나를 엽니다.
- "Code > Convert Java File to Kotlin File"을 호출합니다.
그러면 IDE가 코틀린 종속 항목을 프로젝트에 추가하는 과정을 안내한 후 기존 코드를 기능적으로 동일한 코틀린 코드로 변환합니다. (또한, IDE는 정적 메서드가 동반 객체로 전환될 때와 같이 더욱 관용적인 코틀린이 되도록 적절히 변환된 클래스에 대한 호출 사이트를 전부 손볼 수 있도록 지원합니다.)
developer.android.com에서 코틀린으로 개발을 시작하는 방법에 대한 자세한 정보를 찾아볼 수도 있습니다.