πŸ’» Programming

[Kotlin/JVM] μ½”ν‹€λ¦°μ—μ„œ 자주 μ‚¬μš©ν•˜λŠ” 문법

μΌ€μ΄μΉ˜ 2020. 5. 29. 04:38

잠이 κΉ¨μ„œ μƒˆλ²½μ— ν¬μŠ€νŒ…ν•˜κΈ°λŠ” 정말 μ˜€λžœλ§Œμ΄λ„€μš”

μ΄λ²ˆμ—λŠ” μ½”ν‹€λ¦°μ—μ„œ 자주 μ‚¬μš©λ˜λŠ” 문법에 λŒ€ν•΄μ„œ μ•Œμ•„λ΄€μŠ΅λ‹ˆλ‹€.

 

μ½”ν‹€λ¦°μ—μ„œ 자주 μ‚¬μš©ν•˜λŠ” 문법듀

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