CodeGym /행동 /Kotlin SELF /mapNotNull gw filterNotNull: deiteo jeongri mit taibeu je...

mapNotNull gw filterNotNull: deiteo jeongri mit taibeu jeonhwan

Kotlin SELF
레벨 22, 레슨 3
사용 가능

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().

1
과제
Kotlin SELF, 레벨 22, 레슨 3
잠금
게스트 목록
게스트 목록
1
과제
Kotlin SELF, 레벨 22, 레슨 3
잠금
숫자 정리
숫자 정리
1
과제
Kotlin SELF, 레벨 22, 레슨 3
잠금
매장 쿠폰
매장 쿠폰
1
과제
Kotlin SELF, 레벨 22, 레슨 3
잠금
검색 결과 위치
검색 결과 위치
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION