1. Wae keolleksyeon-eseo nulli geuri banghaehal-kka
Peurogeuraeming-eul cheoeum sijakhals ttae-neun nulli yuyonghan geotcheoreom boimnida: “geochi eopseumyeon — geureom null.” Munje-neun nulli danjihan “bim”i anira, hangsang goryeohaya haneun byeoldo-ui gap-iraneun jeom-imnida. Kotlin-eseoneun taibeu sisteem-i i geoseul deo ganghwahamnida: Stringgwa String?eun dareun taibeuimyeo, keompailleo-neun nulli “eojjeoda-bomyeon seoseuhi sarajigetji”cheoreom cheon-yeonhi cheorihal su itdorok heoyonghaji anhseumnida.
Keolleksyeon-eseo nulleun teukhi deo bulpyeonhan jonjae-ga doeneunde, du gaji iyu ttaemun-imnida. Cheotjjae, gyeolgwa taibeu-reul mangchyeoseo uimi-sang “beolge-isseo ya haeneun” jari-eseo hwangdanghan geomsa-reul sseuge hamnida. Duljjae, nulleun jaju anjeonhan paseong-ui gyeolgwa(toIntOrNull()), geomsa(find) ttoneun anjeonhan jeobgeun(getOrNull)e seo-saenghamnida. Jeuk, uri-ga “nulleul joahaseo” geureon geosi anira, gyeonggo-han kodeu-reul sseugi ttaemun-e deureooneun geot-imnida.
Hyeonsil-gwa aju bikseuhan mini yeboreul bomyeonseo silgamhaebopsida: nuga-neun sutjareul jeokgo, nuga-neun “oi”reul jeok-eo noh-eun munjayeol moglog-eul badassseumnida. Uri-neun i geoseo sutja moglog-eul eodgo sipseumnida.
fun main() {
val raw = listOf("10", "x", "7")
val parsed = raw.map { it.toIntOrNull() }
println(parsed) // [10, null, 7]
}
Gyeolgwa-neun hyeongsikjeog-euro jeongjikhage List<Int?>imnida. Hajiman geu da-eum-eun sip-eun dae-ro hab-eul naegeona wonso-reul bigyoharyeogo hal geos-igo, geuttae gapjagi i geos-i Intga anira Int?iraseo geunyang “deohagi”ga andoendam-eul alge doemnida. Yeogi-eseo “null cheongso”ga deiteo cheori-ui byeoldo-ui dan-gye-ro deungjanghaneun geos-imnida.
2. mapNotNull: jeonhwanhamyeonseo dongsi-e nulleul beorida
mapi “gak wonso-reul jeonhwanhaera”myeon, mapNotNulleun “gak wonso-reul jeonhwanhajiman, gyeolgwa-ga nullimyeon geu gyeolgwa-neun geunyang beoryeora”imnida. Jageun gaeseoncheoreom deullijiman, silje-eseoneun non-null moglog-eul bad-a daeum dan-gye-reul hangsang geomsa eopsi jinhaenghal su itge haejuseo seuteureseureul keuge julyeo jumnida.
Pyojun raibeureori munseo-eseodo i aidi-eo-reul jikseoljeog-euro malhamnida: jeonhwan-i nulleul nael su itdamyeon map() daesin mapNotNull()eul sayonghaseyo. Ige baro toIntOrNull()gwa gati uri-ga jigum bomyeonseo sipeun kyeiseuimnida.
Maeu jageun yeburo sijakhaebopsida: sutjareul gop-hajiman 2neun uisimseureowoun gapseuro boaseo nulllo mandeulgesseumnida (geunyang mekanijeum-eul bogi wihan geot-imnida).
fun main() {
val numbers = setOf(1, 2, 3)
val result = numbers.mapNotNull { x ->
if (x == 2) null else x * 3
}
println(result) // [3, 9]
}
Du gaji-reul jom jujahaeseo bwayo. Cheotjjae, mapNotNulleun nulli eomneun moglog-eul banhwanhamnida. Duljjae, gyeolgwa taibeu-ga List<Int?>ga anira List<Int>ga doemnida — geurigo i geosi hagsim ijeom-imnida.
Meoritsok mini seukima
mapNotNulleun “map + not-null filter”ro bwaya hamnida, dandok-euro deo jjalbgo uimi-ga myeonghwakhage sseul su itge jeok-eun geot-imnida:
element T --(transform)--> R? --(if null, drop)--> R
Ige cheolhakjeog seolmyeong-i anira, ham-su gyeoyak(contract) geu jache-imnida: “jeonhwanhaego null gyeolgwa-neun beorinda.”
3. “Deoreoun” ibryeog paseong mit jeongri
Ijeol-eun konsol peurogeuraem-eseo “sangsik”boda deo jaruhage ileonaneun sanghwang-imnida: sayongja-ga jalmosdoen geoseul ibryeokhaessseumnida. Uri-ui mokpyo-neun tteoreojiji ango, drama-reul mandeulji ango, geu jung-eseo yuyonghan jogak-irado chajaneun geot-imnida.
toIntOrNull()eun anjeonhan paseong-ui gibon dogu-imnida: munjayeol-i sutjaga animyeon yeoegoe-reul deonjineun geosi anira nulleul dollyeojumnida. I paeteon(“ilg-eossda → paseonghaebwa-ssda → T?reul eod-eossda”)eun imi bogo, Kotlin-eseo idiomatic-han bangsig-euro yeogyeojimnida.
Yebe: jeonggyuhwa + paseong
Yes-eul deureobomyeon, “nal-geun” munjayeol-i itda-go haebopsida: gongbaek, bin munjayeol, jjan-jjanhan sseuregi. Uri-neun sutja moglog-eul eodgo sipseumnida.
fun main() {
val raw = listOf("10", " x ", " 7 ", "")
val numbers = raw
.map { it.trim() }
.mapNotNull { it.toIntOrNull() }
println(numbers) // [10, 7]
}
Yeogi-eseo jungyohan jeom-eun trim()eun danjihan “gyeongmi-han dadeumgi”igo, haeksim dan-gye-neun mapNotNull { it.toIntOrNull() }ira-neun geot-imnida. I geosi munjayeol moglog-eul sutja moglog-euro bakkugo paseongdoeji aneun modeun geot-eul beoribnida.
Mansae hagi jeon-e, “geureom sayongja-ege sseuregi ibryeoghaessdago allyeojuneun mesiji-neun eodi itjyo?”ra-go saenggakhaessdamyeon — joheun jijeog-imnida. Hajiman i gangui-eseoneun taibeu-wa deiteo jeongri-e jom deo jiphun haebopsida. Mesiji-neun byeoldo-ui dan-gye-ro mandeul su itgo (geurigo taebun geureoke hamnida). geureohji anh-eumyeon map an-eseo chulryeokhaneun koda-ga doego, geugeos-eun uri-ga gajang pihaeryeogo haneun seutail-imnida.
Wae map { ... }.filterNotNull()i anil-kka?
Geureoke hal sudo itsseumnida. Hajiman mapNotNulli du gaji iyu-ro deo jotseumnida: deo jjalbgo, uido-reul deo jeonghwakhage deureonaemnida(“i jeonhwan-eseo nulli naol su iss-eum-eul algo, geureom geugeos-eul beorigetta”). Munseo-eseodo i reul geu kyeseu-e daehan jikjeobjeog doguro seolmyeonghamnida.
Gat-eun yebe-ro dul da-reul nabyeon-eseo boyeodeurilgeyo(“olbareum/teullim”i anira “saeng-gak-eul deo jikseoljeog-euro pyohyeon”).
fun main() {
val raw = listOf("1", "oops", "3")
val a = raw.map { it.toIntOrNull() }.filterNotNull()
val b = raw.mapNotNull { it.toIntOrNull() }
println(a) // [1, 3]
println(b) // [1, 3]
}
Dul da gat-eun gyeolgwa-reul naemnida. Hajiman mapNotNulleun hana-ui yeonsan-euro ilgihyeojimnida: “sutjareul paseonghago sseuregi-neun museun geunyang museunsi.”
Jageun peuroseoseu bloek doseukema
Gakkeum-eun jeongmal-ro mwo-ga il-eonaneunji geurimeuro geuryeobomyeon yuyonghamnida:
flowchart TD
A[Saryeoun munjayeol] --> B["trim()"]
B --> C["toIntOrNull()"]
C -->|Int| D[gyeolgwa moglog-euro]
C -->|null| E[beorigi]
D --> F[List<Int>]
I doseukema-neun teukjeong kyeiseu-eseo mapNotNullui “naebu segye”reul boyeojumnida.
filterNotNull(): imi nullable-in keolleksyeon-eseo null jegeohagi
mapNotNulli jeonhwan jung nulli saenggil ttae uri-reul guhaejunda-myeon, filterNotNull()eun nulli imi keolleksyeon-e anja iss-eul ttae yuyonghamnida. I geoseun dareun 시나리오-imnida: uri-neun mueosdo jeonhwanhaji anhgo, danji “nulli anin geotman nama”ra-go malhamnida.
Keolleksyeon 필터링 munseo-eseodo filterNotNull()i modeun non-null wonso-reul banhwanhago teukhi gibbeun jeom-eun taibeu-reul hyeopsoek(smart)haeseo List<T?>ga List<T>ga doendago gangjohamnida.
Yebe: ireum moglog, gakkeum nulli seok-yeo itsseumnida.
fun main() {
val maybeNames: List<String?> = listOf("Ann", null, "Bob")
val names: List<String> = maybeNames.filterNotNull()
println(names) // [Ann, Bob]
}
Yeogi-eseo haeksim hyogwa-neun nulli sarajin geot bodado, taibeu-eseo ?ga sarajinda-neun jeom-imnida. Ije names.map { it.length }reul pyeonhi sseul su issgo, keompailleo-ga “null ganeungseong”e daehae dasi deulchumchul hamyeo jeo-tae itge hamji anhseumnida.
Jungyohan gyeonggye: filterNotNull()eun “bim”eul jegeohaji anhgo, jeongmal “null”man jegeohamnida.
Ige jaju hon-dongdoeneun bu-bun-imnida. bin munjayeol ""eun nulli anipnida. Manya listOf("", "Bob")gati issdamyeon, filterNotNull()eun amugeotdo bakkugi anhseumnida. I ham-su-neun “napp-eun deiteo”ga anira, nullira-neun gap jache-reul daeruhaneun geot-imnida.
4. Mini budget tracker-eseo deiteo jeongri
Ije myeo chog-euro gandaehan dan-gye-reul haebogesseumnida. gyeongmihae boijiman, hyeonsil-eseoneun konsol aeb-eul “cheot ibryeok-eseo buseojim”eseo “hyeonsil-eseo beotinda”ro bakkuneun yeokhal-eul hamnida.
Gajang dan-sunhan 지출 tracker-ga 있다고 haebopsida. 지출-eun Triple(category, note, amount)ro pyohyeonhamnida. Ige isangjeog-iji neun anhjiman, jigeum-eun uidojeog-euro OOP model-eul sseuji angoseyo: mokpyo-neun keolleksyeon cheori reul ikhineun geot-imnida.
mapNotNulllo “sum import”reul han jul-e paseong
Yes-eul deureobomyeon, sayongja-ga gongbaek-euro 구분된 sutja yeol-eul ibryeokhamyeon uri-ga geugeos-eul "import" kategoriro 지출-euro chuga-hago sipseumnida. Oryu jogak-eun museun geunyang museunsi.
fun parseInts(line: String): List<Int> =
line.split(" ").mapNotNull { it.trim().toIntOrNull() }
fun main() {
val nums = parseInts("10 x 7 -3")
println(nums) // [10, 7, -3]
}
Yeogi-eseo uri-ga “똑똑한” 규칙(e.g. 음수 금지)reul mandeulji anh-assdaneun geos-eul jujahaeseyo. Oneul-eun mapNotNullui mekanijeum-eul yeonseubhamnida. Geumji/검증 규칙-eun yeogi-e chugahal su issseumnida: “sutja-ga jogeon-eul mannajimyeon” nulleul banhwanhamyeon doemnida.
Yes-eul deureobomyeon 0 이하-reul modeu geonneottwigo sipdamyeon ireoke doemnida:
fun parsePositiveInts(line: String): List<Int> =
line.split(" ").mapNotNull { token ->
val n = token.trim().toIntOrNull()
if (n != null && n > 0) n else null
}
fun main() {
val nums = parsePositiveInts("10 x 7 -3 0")
println(nums) // [10, 7]
}
Haeksim saeng-gak: mapNotNulli nulleul beorigi ttaemun-e, nulleul “silgyeok sinho”ro sayonghal su itsseumnida. Igeun moglog-eul su-dong-euro mo-eogo ifreul han gadeuk sseuneun geotboda 훨씬 편리hamnida.
filterNotNulllo “ileobu bunhae doel su inneun(‘bit’-han) 지출”eseo sum-eul chulchulhagi
Daeum-eun dareun 시나리오-imnida: imi 지출 moglog-i itjiman, eodiddeun “bit”-han 항목-i seok-yeo beoryeossseumnida. Yes-reul deureobomyeon, command munjayeol-eul 지출-euro paseonghaneun ham-su-ga 있고, i ham-su-neun Triple<String, String, Int>?reul banhwanhaseyo: pasing-e silpaehamyeon null.
Jeongmal hyeonsiljeog-imnida: parser-neun dae-bu-bun nullable-reul dollyeojumnida.
fun parseExpenseOrNull(line: String): Triple<String, String, Int>? {
val parts = line.trim().split(" ")
val amount = parts.getOrNull(2)?.toIntOrNull()
if (parts.size < 3 || amount == null) return null
return Triple(parts[0], parts[1], amount)
}
fun main() {
val rawLines = listOf(
"food pizza 500",
"oops",
"taxi ride 250"
)
val parsed: List<Triple<String, String, Int>?> = rawLines.map(::parseExpenseOrNull)
val expenses: List<Triple<String, String, Int>> = parsed.filterNotNull()
println(expenses.size) // 2
}
Yeogi-eseo filterNotNull()i “ganeungseong 있는 지출 moglog”eul “hwaksilhan 지출 moglog”euro 바꿉니다. Geurigo i sungan kodeu-ga dan-gye-jeog seolmyeongcheoreom ilgihyeojimnida: paseong → paseong mot-han geot beorigi → jeongsang deiteo-ro daeum cheori.
filterNotNull()ui contract jache-ga baro geugeos-imnida: non-null wonso-man 남기고 taibeu-reul non-null 로 hyeopsoek.
mapNotNull + anyro “jeongri → geomsa”gyeolhab
Ije jeongmal yuyonghan mini chain-eul mandeureobopsida: “sayongja ibryeog-eseo sutjareul chaj-go, geu jung 큰 금액이 있는지 확인.”
fun main() {
val line = "10 200 x 50"
val hasBig = line.split(" ")
.mapNotNull { it.trim().toIntOrNull() }
.any { it >= 100 }
println(hasBig) // true
}
Yeogi-eseo jujahae bwayo: cheoeum-e mapNotNulli List<Int>reul mandeulgo, geu da-eum-e anyga Int? eopsi jeongsang sutja-roman geomsa-hamnida.
5. mapNotNullgwa filterNotNull sayong si jaju haneun silsu
Silsu 1: map { toIntOrNull() }reul sseugo, geu da-eum-eun geugeos-eul List<Int>cheoreom daeuhaneun geot.
Igeun geo-ui jadong-euro ileonanmida: nun-eun “sutja”reul bogo, meorineun gippeuhajiman, keompailleo-ga geugeos-i Int?ra-go alryeojumnida. Hyeonsiljeog-euro-neun han beon-ui move-ro gochil su issseumnida: nullable wonso-wa ilhagi sirheumyeon mapeul mapNotNulllo 바꾸세요(특히 parsing). Geurigo matseumnida: i geosi baro mapNotNulli gajang jal matchneun gyeong-u-imnida — “nulleul nael su inneun jeonhwan.”
Silsu 2: filterNotNull()i bin munjayeol, 0, gongbaekkkaji modeu “deiteo cheongso”haejul geotirago gidahaneun geot.
filterNotNull()eun “jeongmalro sanitaijeo”ga anira “sinbunjeung-euroman panbyeolhaneun gyeongbi”imnida: nullman naebonaemnida. Bin munjayeol-eun munjayeol-igi ttaemun-e geudaero nama-issseumnida. Bin munjayeol-eul jegeoharyeomyeon filter { it.isNotEmpty() }gati byeoldo-ui filter-ga piryohamnida. I gaenyeom-eul seok-eo 쓰면 wiheomhamnida: deiteo-ga kkaekkeuthada-go mid-eossdaga, na중-e ""ga eodideun seukseuk deuleo-oon geot-e 놀라게 doemnida.
Silsu 3: mapNotNull { ... }i deo jarimhan gose map { ... }.filterNotNull()reul sseoseo 가독성을 tteoreotteurineun geot.
Gineun hwak실히 dongjakhamnida. Hajiman uimi-ga heullimnida. mapNotNulleun han beon-e ilgihyeojimnida: “jeonhwanhaego null gyeolgwa-neun beorinda.” map().filterNotNull()reul sseumyeon, ilkneun saram-eun cheoeum-e nullable gyeolgwa-reul mandeul-eossdaneun geol ihaehaego, geu da-eum-e yageum-yageum cheongsohaneun geol bwaya hamnida. Jaemi-eun tteoreojiji anhjiman, gyoyuk-yong/teem project-eseoneun “uimi-e ttal-eun gadokseong”i seungri-ui ban-imnida.
Silsu 4: paseong silpae-reul printlngati chulryeok-euro mapNotNull an-eseo baro allyeogoryeogo haneun geot.
Gakkeum “paseong 안 되면 경고 찍어야지”ra-neun yoksim-i saenggimnida. Hal su-neun 있지만, geugeos-eun jeonhwan yeonsan an-eseo bal-saenghaneun side effect-imnida. Kodeu-ga 덜 예측 가능haejimnida(특히 나중에 i pipeurain-eul CLI-ga 아닌 test-deul-eseo jaesayonghago sip-eul ttae). Boda ilbanjeog-euro-neun dan-gye-reul 나눕니다: nulleul “geonneotta” sinho-ro dollyeojugeona, 오류를 따로 수집하는 bangsig-eul sayong하세요. Jeongmal piryohamyeon — byeoldo-ui ham-su-ro ppae-seo, geu an-eseo chulryeok yeobu-reul gyeoljeonghaseyo.
Silsu 5: “deoreoun” deiteo-eseo toIntOrNull() daesin toInt()reul sseugo, jal doeld georago baraneun geot.
toInt()eun sseuregi ibryeog-e daehae NumberFormatExceptioneul deonjimnida. Banyeon toIntOrNull()eun nulleul dollyeojugo, geugeos-eun mapNotNullgwa wanbyeokhage matchseumnida. Igeun danjihan “seutail” munje-ga anira, dongjak 차이-ui giboneul galu-neun geot-imnida. Kotlin-eun yeoegoe daesin anjeonhan daean-eul myeonghwakhage boyeojumnida: tteoreojiji anneun toIntOrNull().
GO TO FULL VERSION