코틀린에서자주사용하는문법 (1)

💻 Programming

[Kotlin/JVM] 코틀린에서 자주 사용하는 문법

잠이 깨서 새벽에 포스팅하기는 정말 오랜만이네요

이번에는 코틀린에서 자주 사용되는 문법에 대해서 알아봤습니다.

 

코틀린에서 자주 사용하는 문법들

1. 클래스 만들기

data class Customer(val name: String, val email: String)

코틀린에서는 이 한줄이면 간단히 클래스를 만들 수 있습니다. 또한, 아래 메서드들은 기본적으로 생성됩니다.

- getters, setters

- equals()

- hashCode()

- toString()

- copy() <-- 자바의 clone과 같은 녀석

- component1(), component2(), ... <--이건 나중에 클래스에 대해 자세히 보게될 때 알게될 것 같네요

 

2. 함수 파라미터의 기본 값 설정

함수 정의 시 전달받을 파라미터의 기본값을 아래와 같이 설정할 수 있다.

fun foo(a: Int = 0, b: String = "") { ... }

위 코드는 foo 함수 호출 시 Int 타입과 String 타입의 파라미터를 전달하지 않으면 기본값으로 0과 빈 스트링 ""을 이용하여 로직을 처리하게된다. 따라서 함수 호출 시 foo()라고 호출이 가능하다.

 

3. 리스트 필터링

val positives = list.filter { x -> x > 0 }

자바의 stream에서 필터링 하는 것처럼 람다식을 이용해서 리스트에서 특정 조건에 해당하는 것들만 선별할 수 있다.

또한 it 키워드를 이용해서 아래와 같이 더 간결하게 작성도 가능하다.

val positives = list.filter { it > 0 }

 

4. 컬렉션에서 특정 요소 존재유무 확인하기

// 특정 스트링이 리스트에 존재하는지 확인
if ("john@example.com" in emailsList) { ... }

// 특정 스트링이 리스트에 존재하지 않는지 확인
if ("jane@example.com" !in emailsList) { ... }

 

5. 스트링 포매팅 (String Interpolation)

var name = "황비홍"
println("Name $name")

스트링 내에 변수의 값을 넣을 수 있는 기능으로 자바의 스트링 포매터와 유사한 기능이다.

 

6. 인스턴스 검사 (Instance Check)

when (x) {
    is Foo -> ...
    is Bar -> ...
    else   -> ...
}

코틀린에서 when 은 자바의 switch 문과 유사한 기능으로 좀 더 간결하게 switch문을 표현할 수 있다는 장점이 있다.

 

7. Map 순회하기 (Traversing a map/list of pairs)

for ((k, v) in map) {
    println("$k -> $v")
}

자바에서는 keySet이나 values를 각각 가져와서 처리해야 했지만 코틀린에서는 key, value 를 동시에 가져와서 처리가 가능하다.

 

8. 범위 사용법

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이하면 ...

 

9. Read-Only List/Map

val list = listOf("a", "b", "c")
val map = mapOf("a" to 1, "b" to 2, "c" to 3)

listOf, mapOf 함수를 사용하여 읽기전용 리스트나 맵을 생성할 수 있다.

 

10. 키를 이용한 맵의 값 읽어오기

println(map["key"])
map["key"] = value

코틀린에서는 맵의 요소에 접근할 때 배열처럼 접근이 가능하다.

 

11. Lazy 속성

val p: String by lazy {
    // compute the string
}

 

12. 확장 함수 (Extension Functions)

fun String.spaceToCamelCase() { ... }

"Convert this to camelcase".spaceToCamelCase()

String의 확장함수를 임의로 추가정의하여 사용이 가능하다

 

13. 싱글턴 객체 생성하기

object Resource {
    val name = "Name"
}

 

14. if not null 을 간결하게 작성

val files = File("Test").listFiles()

println(files?.size)

files의 size를 호출할 때 nullable을 의미하는 ?를 붙여주면 not null일 경우에만 실행하게 된다. 만약 files가 null이라면 null이 출력된다.

 

15. if not null and else

val files = File("Test").listFiles()

println(files?.size ?: "empty")

이번에는 if not null 에 else 조건을 붙여 null이면 "empty" 를 출력하도록 변경하였다.

 

16. null일 경우 문(statement) 실행하기

val values = ...
val email = values["email"] ?: throw IllegalStateException("Email is missing!")

 

17. possibly empty collection에서 첫번째 요소 가져오기

val emails = ... // might be empty
val mainEmail = emails.firstOrNull() ?: ""

 

18. null이 아닌 경우 실행하기

val value = ...

value?.let {
    ... // 블럭내의 문장은 value가 not null일 경우에 실행한다
}

 

19. nullable Boolean

val b: Boolean? = ...
if (b == true) {
    ...
} else {
    // `b` is false or null
}

Boolean타입의 변수가 null인지 아닌지 별도로 검사할 필요가 없다.

 

20. 두 변수의 값 스왑하기

var a = 1
var b = 2
a = b.also { b = a }

자바에서는 두 변수의 값을 swap할 때 임시변수를 하나 추가로 만들어서 swap하는 것이 일반적이지만 코틀린에서는 그럴 필요가 없다.

 

이외에도 여러가지 자바보다 더 쉽고 간결해진 자주 사용되는 문법이 있으나 이 정도만 소개합니다.

나머지는 아래 출처에 언급한 코틀린 공식사이트에서 확인해보세요.

 

어느 정도 기본적인 문법에 익숙해지면 쉬운 알고리즘 문제풀이를 코틀린으로 하면서 빠르게 익혀볼 계회입니다.

 

 

 

출처 : https://kotlinlang.org/docs/reference/idioms.html