잠이 깨서 새벽에 포스팅하기는 정말 오랜만이네요
이번에는 코틀린에서 자주 사용되는 문법에 대해서 알아봤습니다.
data class Customer(val name: String, val email: String)
코틀린에서는 이 한줄이면 간단히 클래스를 만들 수 있습니다. 또한, 아래 메서드들은 기본적으로 생성됩니다.
- getters, setters
- equals()
- hashCode()
- toString()
- copy() <-- 자바의 clone과 같은 녀석
- component1(), component2(), ... <--이건 나중에 클래스에 대해 자세히 보게될 때 알게될 것 같네요
함수 정의 시 전달받을 파라미터의 기본값을 아래와 같이 설정할 수 있다.
fun foo(a: Int = 0, b: String = "") { ... }
위 코드는 foo 함수 호출 시 Int 타입과 String 타입의 파라미터를 전달하지 않으면 기본값으로 0과 빈 스트링 ""을 이용하여 로직을 처리하게된다. 따라서 함수 호출 시 foo()라고 호출이 가능하다.
val positives = list.filter { x -> x > 0 }
자바의 stream에서 필터링 하는 것처럼 람다식을 이용해서 리스트에서 특정 조건에 해당하는 것들만 선별할 수 있다.
또한 it 키워드를 이용해서 아래와 같이 더 간결하게 작성도 가능하다.
val positives = list.filter { it > 0 }
// 특정 스트링이 리스트에 존재하는지 확인
if ("john@example.com" in emailsList) { ... }
// 특정 스트링이 리스트에 존재하지 않는지 확인
if ("jane@example.com" !in emailsList) { ... }
var name = "황비홍"
println("Name $name")
스트링 내에 변수의 값을 넣을 수 있는 기능으로 자바의 스트링 포매터와 유사한 기능이다.
when (x) {
is Foo -> ...
is Bar -> ...
else -> ...
}
코틀린에서 when 은 자바의 switch 문과 유사한 기능으로 좀 더 간결하게 switch문을 표현할 수 있다는 장점이 있다.
for ((k, v) in map) {
println("$k -> $v")
}
자바에서는 keySet이나 values를 각각 가져와서 처리해야 했지만 코틀린에서는 key, value 를 동시에 가져와서 처리가 가능하다.
loop를 위해서는 특정 범위를 지정해줘야 하는 경우가 많다. 코틀린에서는 아래와 같이 다양한 범위지정법을 제공해주고 있다.
for (i in 1..100) { ... } // closed range: 100 포함
for (i in 1 until 100) { ... } // half-open range: 100 미포함
for (x in 2..10 step 2) { ... } // 2부터 2씩 증가하면서 10까지 ...
for (x in 10 downTo 1) { ... } // 10부터 1씩 감소하면서 1까지 ...
if (x in 1..10) { ... } // 만약 x가 1이상 10이하면 ...
val list = listOf("a", "b", "c")
val map = mapOf("a" to 1, "b" to 2, "c" to 3)
listOf, mapOf 함수를 사용하여 읽기전용 리스트나 맵을 생성할 수 있다.
println(map["key"])
map["key"] = value
코틀린에서는 맵의 요소에 접근할 때 배열처럼 접근이 가능하다.
val p: String by lazy {
// compute the string
}
fun String.spaceToCamelCase() { ... }
"Convert this to camelcase".spaceToCamelCase()
String의 확장함수를 임의로 추가정의하여 사용이 가능하다
object Resource {
val name = "Name"
}
val files = File("Test").listFiles()
println(files?.size)
files의 size를 호출할 때 nullable을 의미하는 ?를 붙여주면 not null일 경우에만 실행하게 된다. 만약 files가 null이라면 null이 출력된다.
val files = File("Test").listFiles()
println(files?.size ?: "empty")
이번에는 if not null 에 else 조건을 붙여 null이면 "empty" 를 출력하도록 변경하였다.
val values = ...
val email = values["email"] ?: throw IllegalStateException("Email is missing!")
val emails = ... // might be empty
val mainEmail = emails.firstOrNull() ?: ""
val value = ...
value?.let {
... // 블럭내의 문장은 value가 not null일 경우에 실행한다
}
val b: Boolean? = ...
if (b == true) {
...
} else {
// `b` is false or null
}
Boolean타입의 변수가 null인지 아닌지 별도로 검사할 필요가 없다.
var a = 1
var b = 2
a = b.also { b = a }
자바에서는 두 변수의 값을 swap할 때 임시변수를 하나 추가로 만들어서 swap하는 것이 일반적이지만 코틀린에서는 그럴 필요가 없다.
이외에도 여러가지 자바보다 더 쉽고 간결해진 자주 사용되는 문법이 있으나 이 정도만 소개합니다.
나머지는 아래 출처에 언급한 코틀린 공식사이트에서 확인해보세요.
어느 정도 기본적인 문법에 익숙해지면 쉬운 알고리즘 문제풀이를 코틀린으로 하면서 빠르게 익혀볼 계회입니다.
[Elasticsearch] Kibana에서 조회시 x of y shards failed 오류 발생 (0) | 2020.06.29 |
---|---|
AWS ES에 logback으로 로깅하기 (커스텀 어펜더) (0) | 2020.06.21 |
[Kotlin/JVM] 코틀린 언어의 특징 (코틀린이란?) (0) | 2020.05.26 |
[AWS/Java] Elasticsearch 인덱스 S3로 백업/복원 하기 (0) | 2020.05.25 |
[Kotlin/JVM] 코틀린 기본문법 (Basic Syntax) (0) | 2020.05.15 |