10
10

Nullable

์ฝ”ํ‹€๋ฆฐ์€ nullableํ•œ ํƒ€์ž…์„ ์ง€์ •ํ•ด์„œ ์ปดํŒŒ์ผ ๋•Œ NPE๋ฅผ ์˜ˆ๋ฐฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋Ÿฐํƒ€์ž„์—์„œ ๋ฐœ์ƒํ•˜๋Š” NPE๋ฅผ ์ปดํŒŒ์ผ ์‹œ์ ์œผ๋กœ ๊ฒ€์‚ฌ์‹œ์ ์„ ์˜ฎ๊ฒจ์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ํƒ€์ž…์— ?๋ฅผ ๋ถ™์—ฌ์„œ ์‚ฌ์šฉํ•œ๋‹ค.

val x: String? = null
 

์ž๋ฐ”์˜ ๊ฒฝ์šฐ null์ด ๋ ์ˆ˜์žˆ๋Š” ๊ฐ’์€ Optional ํƒ€์ž… ๋“ฑ ํŠน๋ณ„ํ•œ ๋ž˜ํผ ํƒ€์ž…์œผ๋กœ ๊ฐ์‹ธ์•ผํ•˜๋Š”๋ฐ, ์ฝ”ํ‹€๋ฆฐ์€ ๊ทธ๋ƒฅ non-null์ด๋‚˜ nuallble์ด๋‚˜ ๊ฐ™์€ ํƒ€์ž…์œผ๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— nullable ํƒ€์ž…์„ ์‹คํ–‰ํ•  ๋•Œ ๋ถ€๊ฐ€๋น„์šฉ์ด ๋“ค์ง€ ์•Š๋Š”๋‹ค.

?. - safe call

์ˆ˜์‹ ๊ฐ์ฒด๊ฐ€ null์ด๋ฉด null์„ ๋ฆฌํ„ดํ•˜๊ณ , null์ด ์•„๋‹ˆ๋ฉด ์˜๋„ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

s?.toUpperCase()
if(s!=null) s.toUpperCase else null
val input = a?.b?.c
 

์œ„ ๋‘ ์ค„์€ ๊ฐ™์€ ์ฝ”๋“œ๋‹ค. ๋งˆ์ง€๋ง‰ ์ค„ ์ฒ˜๋Ÿผ ์—ฐ์‡„ํ•ด์„œ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. c๊นŒ์ง€ ๊ฐ€๊ธฐ์ „์— null์ด ๋ฐ˜ํ™˜๋˜๋ฉด input์—๋Š” null์ด ๋“ค์–ด๊ฐ„๋‹ค.

?: - elvis, null coalescing

์—˜๋น„์Šค ์—ฐ์‚ฐ์ž๋Š” null์˜ ๊ฒฝ์šฐ ์ฒ˜๋ฆฌํ•  ์‹์„ ์ข€ ๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๋„๋ก ๋„์™€์ค€๋‹ค.

val address = person.company?.address ?: throw IllegalArgumentException("No address")
 

?: ์•ž์˜ ์‹์ด null์ด๋ฉด ๋’ค์˜ ์‹์„ ์—ฐ์‚ฐํ•œ๋‹ค. ํ•จ์ˆ˜์˜ ์ „์ œ ์กฐ๊ฑด์„ ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒฝ์šฐ ์œ ์šฉํ•˜๋‹ค.

as? - safe cast

์บ์ŠคํŠธ์—ฐ์‚ฐ์ž์ธ as๋ฅผ null safeํ•˜๊ฒŒ ์“ฐ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๋Œ€์ƒ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†์œผ๋ฉด null์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์—ฐ์‚ฐ์ž๋‹ค.

!! - not-null assertion

null์ด ์•„๋‹˜์„ ๋‹จ์–ธํ•˜๋Š” ํ‚ค์›Œ๋“œ๋กœ, !!๋กœ ์ง€์ •ํ•œ ๊ณณ์—์„œ๋Š” NPE๊ฐ€ ๋ฐœ์ƒํ•  ์œ„ํ—˜์ด ์žˆ๋‹ค. null๊ฒ€์‚ฌ๊ฐ€ ํ•„์š”์—†๋Š” ํ™•์‹คํ•œ ๊ณณ์—์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๋Š”๋ฐ, ์—ฐ์‡„ํ•ด์„œ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์–ด๋””์—์„œ ๋ฐœ์ƒํ•œ NPE์ธ์ง€ ๋ชจ๋ฅธ๋‹ค๋Š” ์ ์ด ๋ฌธ์ œ๋‹ค.

person.company!!.address!!.country
 

ํ•ด๋‹น ๋ผ์ธ์—์„œ NPE๊ฐ€ ๋ฐœ์ƒํ•œ๊ฑด stack trace๊ฐ€ ์•Œ๋ ค์ฃผ์ง€๋งŒ, ์–ด๋Š ํ”„๋กœํผํ‹ฐ์—์„œ NPE๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€๋Š” ์•Œ๋ ค์ฃผ์ง€ ์•Š๋Š”๋‹ค.

let

letํ•จ์ˆ˜๋Š” ์ž์‹ ์˜ ์ˆ˜์‹ ๊ฐ์ฒด๋ฅผ ์ธ์ž๋กœ ์ „๋‹ฌ๋ฐ›์€ ๋žŒ๋‹ค์—๊ฒŒ ๋„˜๊ธด๋‹ค.

์ด์ œ ์—ฌ๊ธฐ์„œ ?.let{ } ๊ณผ .let์˜ ์ฐจ์ด๊ฐ€ ์ƒ๊ธด๋‹ค.

email?.let { sendEmailTo(it) }
email.let { sendEmailTo(it) }
 

let์ด safeํ•œ๊ฒŒ ์•„๋‹ˆ๊ณ  let์„ safeํ•˜๊ฒŒ ํ˜ธ์ถœํ–ˆ์„๋•Œ ๋žŒ๋‹ค์—์„œ๋Š” ํƒ€์ž…์ด ํ™•์‹คํ•˜๊ฒŒ null์ด ์•„๋‹Œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. safeํ•˜๊ฒŒ let์„ ํ˜ธ์ถœํ•˜๋ฉด ์ˆ˜์‹ ๊ฐ์ฒด๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด ๋žŒ๋‹ค์— ์ธ์ž๋ฅผ ๋„ฃ๋Š”๋‹ค.

๋‘๋ฒˆ์งธ ์ค„์˜ ์ฝ”๋“œ๋Š” email์ด String?๊ณผ ๊ฐ™์€ nullable ํƒ€์ž…์ด๋ฉด, ๋žŒ๋‹ค์˜ ์ธ์ž๋กœ String?์ด ์ถ”๋ก ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์ฃผ์˜ํ•˜์ž.

lateinit var

ํ”„๋กœํผํ‹ฐ๋ฅผ val๋กœ ์„ ์–ธํ•˜๋ฉด ์„ ์–ธ๊ณผ ๋™์‹œ์— ์ดˆ๊ธฐํ™” ํ•ด์•ผ๋˜๊ณ  final๋กœ ์ปดํŒŒ์ผ ๋˜๋ฉฐ, ์ƒ์„ฑ์ž ์•ˆ์—์„œ ๋ฐ˜๋“œ์‹œ ์ดˆ๊ธฐํ™” ํ•ด์•ผํ•˜์ง€๋งŒ, ๋‚˜์ค‘์— ์ดˆ๊ธฐํ™”ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๋Š” var๋กœ ์„ ์–ธํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

private lateinit var myService: MyService
 

์ดˆ๊ธฐํ™” ์ „์— ์ด ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•˜๋ฉด lateinit property has not been initialized ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

๋„์ด ๋  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž… ํ™•์žฅ

ํƒ€์ž…์— ๋Œ€ํ•œ ํ™•์žฅํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฑด๋ฐ, ์ด ํ™•์žฅํ•จ์ˆ˜๋Š” null์ด ์•„๋‹ˆ์–ด์•ผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ํ™•์žฅํ•จ์ˆ˜/ํ”„๋กœํผํ‹ฐ๊ฐ€ ์•„๋‹ˆ๋ผ, null์ด ๋  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์„ ๋ฐ›์•„์„œ null์„ ๋ช…์‹œ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

fun verifyUserInput(input: String?) {
    if (input.isNullOrBlank()) {
        println("TODO")
    }
}
 

ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ์˜ nullable

์ด๊ฑด ์ œ๋„ค๋ฆญ์—์„œ ๋‹ค์‹œ ๋‚˜์˜ฌ ๋ถ€๋ถ„์ด๋ผ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•˜๊ณ  ๋„˜์–ด๊ฐ„๋‹ค.

fun <T> printHashCode(t: T) {
    println(t?.hashCode())
}
fun <T: Any> printHashCode(t: T) {
    println(t.hashCode())
}
 

T๋Š” ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ, ๋ชจ๋“  ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ null์ด ๋ ์ˆ˜์žˆ๋Š”๋ฐ, ์ด T๋ฅผ ํƒ€์ž…์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฆ„ ๋์— ?๊ฐ€ ์—†์–ด๋„ nullableํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ํƒ€์ž…์ƒํ•œ์„ ์ง€์ •ํ•ด๋‘ฌ์•ผ null์ด ๋  ์ˆ˜ ์—†๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ž๋ฐ”์™€ ํ˜ธํ™˜์€?

์ฝ”ํ‹€๋ฆฐ์€ ์ž๋ฐ”์—์„œ @Nullable, @NotNull ์• ๋…ธํ…Œ์ด์…˜์„ ์ฝ์–ด์„œ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ, ์ด๊ฒŒ ์•ˆ๋ถ™๋Š” ๊ฒฝ์šฐ๋Š” ํ”Œ๋žซํผ ํƒ€์ž…์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ํ”Œ๋žซํผ ํƒ€์ž…์€ ์ฝ”ํ‹€๋ฆฐ์ด null๊ด€๋ จ ์ •๋ณด๋ฅผ ์•Œ ์ˆ˜ ์—†๋Š” ํƒ€์ž…์„ ๋งํ•˜๋Š”๋ฐ, nullable๋กœ ํ•ด๋„๋˜๊ณ  ์•„๋‹ˆ์–ด๋„ ๋˜๋‹ˆ ์ฑ…์ž„์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ง€๋Š” ํƒ€์ž…์ด๋‹ค.

fun yellAtSafe(person: Person) {
    println((person.name ?: "Anyone").toUpperCase() + "!!!")
}
 

Person์€ ์ž๋ฐ” ํƒ€์ž…์ด๊ณ , kotlin์—์„œ ์—˜๋น„์Šค ์—ฐ์‚ฐ์ž๋กœ nullableํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์„ ์ฒ˜๋ฆฌํ–ˆ๋‹ค. ํ”Œ๋žซํผ ํƒ€์ž…์˜ ๊ฒฝ์šฐ ?๊ฐ€ ์—†์–ด๋„ null ์ด ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์Œ์„ ์ธ์ง€ํ•ด์•ผํ•œ๋‹ค. ํ”Œ๋žซํผ ํƒ€์ž…์ด ๋„์ž…๋œ ์ด์œ ๋Š” ๋ชจ๋“  ๊ฐ’์— null์„ ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒƒ์€ ๋น„ํšจ์œจ์ ์ด๋ผ๊ณ  ํŒ๋‹จํ•ด์„œ, null์—ฌ๋ถ€๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์„ค๊ณ„ํ–ˆ๋‹ค๊ณ  ํ•œ๋‹ค.

ERROR: Type mismatch: inferred type is String! but Int was expected
 

ํ”Œ๋žซํผ ํƒ€์ž…์—์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๋Š” ! ๊ฐ€ ๋ถ™๋Š”๋‹ค. nullable ์ •๋ณด๋‹ค ์—†๋‹ค๋Š” ๋œป์ด๋‹ค.

์›์‹œ ํƒ€์ž…

์ž๋ฐ”์™€ ๋‹ฌ๋ฆฌ, ์ฝ”ํ‹€๋ฆฐ์€ ์›์‹œํƒ€์ž…๊ณผ ๋ž˜ํผํƒ€์ž…์„ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋ž˜ํผํƒ€์ž…์€ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ’์ด ๋“ค์–ด๊ฐ€๋Š”๋ฐ, ์ž๋ฐ” ์ปฌ๋ ‰์…˜์ด ๊ทธ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋‹ค. ์ฝ”ํ‹€๋ฆฐ์˜ nullableํ•˜์ง€์•Š์€ ์›์‹œํƒ€์ž…์€ ๊ทธ๋Œ€๋กœ ์ž๋ฐ”์˜ ์›์‹œํƒ€์ž…์œผ๋กœ ์ทจ๊ธ‰๋˜์–ด ์ปดํŒŒ์ผ๋˜์ง€๋งŒ, nullable์ด ๋ถ™์€ ์ฝ”ํ‹€๋ฆฐ์˜ ํƒ€์ž…์€ ์ž๋ฐ”์—์„œ ๋ž˜ํผํƒ€์ž…์œผ๋กœ ์ปดํŒŒ์ผ๋œ๋‹ค.

๋˜ํ•œ JVM์€ ์ œ๋„ค๋ฆญ์„ ๊ตฌํ˜„ํ•  ๋•Œ ์›์‹œํƒ€์ž…์„ ํƒ€์ž…์ธ์ž๋กœ ํ—ˆ์šฉํ•˜์ง€์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ œ๋„ค๋ฆญ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๋•Œ๋Š” ์ฝ”ํ‹€๋ฆฐ ์—ญ์‹œ ๋ฐ•์Šคํƒ€์ž…์„ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.(listOf()์™€ ๊ฐ™์€)

์ฝ”ํ‹€๋ฆฐ์€ ์ˆซ์ž ๋ณ€ํ™˜์ด ์ž๋™์œผ๋กœ ๋˜์ง€์•Š๊ธฐ ๋•Œ๋ฌธ์— (์‹ฌ์ง€์–ด Int-> double๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ๋„) ํ•ญ์ƒ ๋ณ€ํ™˜ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์ฒ˜๋ฆฌํ•ด์•ผํ•œ๋‹ค.

val x = 1
println(x.toLong() in listOf(1L, 2L, 3L))
 

int๋ฅผ long๊ณผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ๋˜์ง€์•Š๋Š”๋‹ค. ๋ณ€ํ™˜ํ•จ์ˆ˜๊ฐ€ ํ•„์š”์—†์„ ๋•Œ๋Š” ์ˆซ์ž ๋ฆฌํ„ฐ๋Ÿด์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ๋‹ค.

์ตœ์ƒ์œ„ ํƒ€์ž…: Any, Any?

์ฝ”ํ‹€๋ฆฐ์—์„œ๋Š” Anyํƒ€์ž…์ด ๋ชจ๋“  null์ด ์•ˆ๋˜๋Š” ํƒ€์ž…์˜ ์กฐ์ƒํƒ€์ž…์ด๊ณ  Any?๋Š” nullable์˜ ์กฐ์ƒํƒ€์ž…์ด๋‹ค. ์ž๋ฐ”์˜ Object์— ๋Œ€์‘ํ•˜๋Š”๋ฐ, Objectํƒ€์ž…์„ ์ฝ”ํ‹€๋ฆฐ์œผ๋กœ ๊ฐ€์ ธ์˜ค๋ฉด Object!๋กœ ํ”Œ๋žซํผ ํƒ€์ž…์œผ๋กœ ํ•ด์„๋œ๋‹ค.

๋ชจ๋“  ์ฝ”ํ‹€๋ฆฐ ํด๋ž˜์Šค์— ๋“ค์–ด์žˆ๋Š” toString, equals, hashCode ๋ฉ”์„œ๋“œ๊ฐ€ Any์—์„œ ๊ฐ€์ ธ์˜จ ๊ฒƒ์ด์ง€๋งŒ, Object์— ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ Any๊ฐ€ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํƒ€์ž… ์บ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

Unit: void, ๊ทธ๋ฆฌ๊ณ  Nothing

Unit์œผ๋กœ ์„ ์–ธ๋œ ํ•จ์ˆ˜๋Š” ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†๋‹ค. ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์ƒ๋žตํ•˜๋„ ๋˜๋Š”๋ฐ, void์™€ ๋‹ค๋ฅธ์ ์€ void๊ฐ€ ํƒ€์ž…์ธ์ž๋กœ ์“ธ ์ˆ˜ ์—†๋Š”๋ฐ˜๋ฉด์— Unit์€ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ ์ด๋‹ค.

Unit ํƒ€์ž…์˜ ํ•จ์ˆ˜๋Š” ๋ฐ˜ํ™˜ ๊ฐ’์ด ๋‹จ ํ•˜๋‚˜๋ฉฐ, Unit๊ฐ’์„ ๋ฌต์‹œ์ ์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— return ์„ ๋ช…์‹œํ•˜์ง€์•Š์•„๋„ ๋œ๋‹ค.

Nothing ํƒ€์ž…์€ ์•„๋ฌด ๊ฐ’๋„ ํฌํ•จํ•˜์ง€์•Š๋Š”๋‹ค. ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์ด๋‚˜ ๋ฐ˜ํ™˜ํ•  ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋ฌดํ•œ๋ฃจํ”„๋ฅผ ์ข…๋ฃŒ ์‹œํ‚จ๋‹ค๋˜๊ฐ€ ํ•˜๋Š” ์ •์ƒ์ข…๋ฃŒ ๋˜์ง€์•Š๋Š” ์ž‘์—…์— ์‚ฌ์šฉํ•˜๊ธฐ ์œ ์šฉํ•˜๋‹ค.

fun fail(message: String): Nothing {
    throw IllegalStateException(message)
}
 

์ด๋Ÿฐ ์‹์œผ๋กœ ์ •์˜ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. Unit๊ณผ Nothing ํƒ€์ž…์„ ๊ตฌ๋ถ„ํ•ด์•ผํ•œ๋‹ค.

์ปฌ๋ ‰์…˜

์ปฌ๋ ‰์…˜์œผ๋กœ ๋“ค์–ด๊ฐ€๋ฉด ๊ณ ๋ คํ•  ๊ฒŒ ๋” ๋งŽ์•„์ง„๋‹ค.

val ll : List<Int?>
val ll : List<Int>?
val ll : List<Int?>?
 

์ฒซ๋ฒˆ์งธ๋Š” ์ปฌ๋ ‰์…˜์€ null์ด ์•„๋‹ˆ์ง€๋งŒ ์›์†Œ๊ฐ€ nullable์ด๊ณ , ๋‘๋ฒˆ์งธ๋Š” ์ปฌ๋ ‰์…˜ ์ž์ฒด๊ฐ€ nullableํ•˜์ง€๋งŒ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์€ not-null์ด๋‹ค. ๋ชจ๋‘ nullableํ•œ๊ฒŒ ๋งˆ์ง€๋ง‰ ์ค„์ด๋‹ค.

mutable : ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ

MutableCollection์€ ๊ธฐ์กด Collection์— add, remove, clear ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด ๋งŒ๋“  ์ธํ„ฐํŽ˜์ด์Šค๋‹ค. ๋˜๋„๋ก์ด๋ฉด ์ฝ๊ธฐ์ „์šฉ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋‹ค.

์ฝ”ํ‹€๋ฆฐ์€ ์ž๋ฐ”์˜ ๋ชจ๋“  ์ปฌ๋ ‰์…˜ ์ธํ„ฐํŽ˜์ด์Šค ๋งˆ๋‹ค Mutableํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์ธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ถ”๊ฐ€๋กœ ์ œ๊ณตํ•˜๋Š”๋ฐ(Map๋„ ์ œ๊ณต), ์ด ์ธํ„ฐํŽ˜์ด์Šค๋Š” mutableListOf(), mutableSetOf() ์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

์ฑ…์ด ๋‚˜์˜จ ๋‹น์‹œ์—๋Š” Mutable๋งŒ ์žˆ์—ˆ๊ณ , ์ง€๊ธˆ๋„ kotlin.collections๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์—ด์–ด๋ณด๋‹ˆ ๋˜‘๊ฐ™๋‹ค. ๋ฌธ์ œ๋Š” ์ž๋ฐ”๊ฐ€ ์ฝ๊ธฐ์ „์šฉ/ ๋ณ€๊ฒฝ๊ฐ€๋Šฅ ์ปฌ๋ ‰์…˜์„ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”ํ‹€๋ฆฐ์—์„œ Collection์œผ๋กœ ์„ ์–ธ๋˜์–ด ์ฝ๊ธฐ์ „์šฉ์œผ๋กœ ์„ ์–ธ๋œ ๊ฐ์ฒด๋ผ๋„ ์ž๋ฐ”์—์„œ๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

// java class
public class CollectionUtils {
    public static List<String> uppercaseAll(List<String> items) {
        for (int i = 0; i < items.size(); i++) {
            items.set(i, items.get(i).toUpperCase());
        }
        return items;
    }
}
// kotlin
fun printInUppercase(list: List<String>) {
    println(CollectionUtils.uppercaseAll(list)) // java ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ์ค‘
    println(list.first())
}
 

์—ฌ๊ธฐ์„œ Collection, MutableCollection์„ ๋ณด๋ฉด์„œ ์ƒ๊ฐ๋‚˜๋Š” ํ‚ค์›Œ๋“œ, ํ”Œ๋žซํผ ํƒ€์ž…์ด ์žˆ๋‹ค.

  • ์ปฌ๋ ‰์…˜์˜ null ๊ฐ€๋Šฅ์„ฑ
  • ์ปฌ๋ ‰์…˜ ์›์†Œ์˜ null ๊ฐ€๋Šฅ์„ฑ
  • ๋ณ€๊ฒฝ๊ฐ€๋Šฅ์„ฑ

์ด ์„ธ๊ฐ€์ง€๋ฅผ ๊ณ ๋ คํ•ด์„œ ๊ฒฐ์ •ํ•˜๋ฉด ๋˜๋Š”๋ฐ, ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์ด ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์ด ์ œ์ผ ํฌ๋‹ค.

๋ฐฐ์—ด

์ฝ”ํ‹€๋ฆฐ ๋ฐฐ์—ด์€ ํƒ€์ž…ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›๋Š” ํด๋ž˜์Šค๋‹ค. arrayOf(), arrayOfNulls()๋กœ ๋„˜๊ธฐ๊ฑฐ๋‚˜, Array<T>() ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. Array๋กœ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ๋Š” ๊ฐ ์›์†Œ๊ฐ€ null์ด ์•„๋‹Œ ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•  ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•œ๋‹ค.

val letters = Array<String>(26) { i -> ('a' + i).toString() }
println(letters.joinToString(""))
 

์•ŒํŒŒ๋ฒณ์†Œ๋ฌธ์ž๋ฅผ ๋ฐฐ์—ด๋กœ ๋งŒ๋“œ๋Š” ์ฝ”๋“œ๋‹ค.

๊ฐ€๋ณ€์ธ์ž๋ฅผ ๋ฐ›๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ํ•  ๋•Œ ๋ฐฐ์—ด์„ ์ž์ฃผ ๋งŒ๋“œ๋Š”๋ฐ ์ด๋•Œ ๋„˜๊ธฐ๋Š” ๋ฐฐ์—ด์ด ํƒ€์ž…์ถ”๋ก ์ด ์•ˆ๋œ ์ƒํƒœ๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋•Œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ด๋ฏธ ์ปฌ๋ ‰์…˜์— ๋“ค์–ด์žˆ๋‹ค๋ฉด toTypedArray()๋ฅผ ์จ์„œ ๋„ฃ์œผ๋ฉด ๋œ๋‹ค. vararg์— ๋„ฃ๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž๋„ ๊ฐ™์ด ์จ์ค˜์•ผํ•œ๋‹ค.

val strings = listOf("a", "b", "c")
println("%s/%s/%s".format(*strings.toTypedArray()))
 

์›์‹œ ํƒ€์ž…๋ณ„๋กœ ๋ฐฐ์—ด์ด ์กด์žฌํ•˜๋Š”๋ฐ, ์ปดํŒŒ์ผ ๋•Œ int[], byte[] ๋กœ ์›์‹œํƒ€์ž… ๋ฐฐ์—ด๋กœ ์ปดํŒŒ์ผ๋œ๋‹ค. ๋žŒ๋‹ค๋กœ ์ด๋Ÿฐ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ•๋„ ์žˆ๋‹ค.

val squares = IntArray(5) { i -> (i+1) * (i+1) }
 

์ถ”๊ฐ€๋กœ ์ฝ”ํ‹€๋ฆฐ์€ ์ปฌ๋ ‰์…˜์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ํ™•์žฅํ•จ์ˆ˜๋ฅผ ๋ฐฐ์—ด์—๋„ ์ œ๊ณตํ•œ๋‹ค.

public inline fun <T> kotlin.Array<out T>.forEachIndexed(action: (kotlin.Int, T) -> kotlin.Unit): kotlin.Unit {}
 

์ด๋Ÿฐ์‹์œผ๋กœ ๋‹ค ์ •์˜๋˜์–ด ์žˆ์–ด์„œ ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

"๋Œ“๊ธ€, ๊ณต๊ฐ ๋ฒ„ํŠผ ํ•œ ๋ฒˆ์”ฉ ๋ˆ„๋ฅด๊ณ  ๊ฐ€์ฃผ์‹œ๋ฉด ํฐ ํž˜์ด ๋ฉ๋‹ˆ๋‹ค"
๋ฐ˜์‘ํ˜•

'๐Ÿ“– > ์ฝ”ํ‹€๋ฆฐ ์ธ ์•ก์…˜๐Ÿ“–' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Kotlin in action(8)  (0) 2023.10.10
Kotlin in action(7)  (0) 2023.10.10
Kotlin in action(5)  (0) 2023.10.10
Kotlin in action(4)  (0) 2023.10.10
Kotlin in action(3)  (0) 2023.10.10
COMMENT