2024. 3. 8. 20:35, ๐ฑAndroid Study
๋ฐ์ํ
8 null ๊ฐ์ ๋ํ ์์ ์ ์ธ ์ฒ๋ฆฌ: Null Safety
- Kotlin์ null ๊ฐ์ ์ฒ๋ฆฌ์ ๋ง์ ๊ณต์ ๋ค์ธ ์ธ์ด
- null๋ก ์ธํด ํ๋ก๊ทธ๋จ ์ ์ฒด, ํน์ ์ฑ ์ ์ฒด๊ฐ ๋ฉ์ถ ์ ์์
// ํ๋ก๊ทธ๋จ์ด ๋ฉ์ถ ์ ์๋ ์ํฉ
class One {
fun print() {
Log.d("null_safety", "can you call me?")
}
}
var one: One
if (1 > 2){
one = One()
}
one.print()
- ์ ์ฝ๋์์๋ 1 > 2๊ฐ false์ด๊ธฐ ๋๋ฌธ์ one ๋ณ์๋ ์๋ฌด๊ฒ๋ ์๋ null ์ํ
- ์ด ๋ print ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด null ํฌ์ธํฐ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด์ ํ๋ก๊ทธ๋จ์ด ๋ค์ด๋จ
- ๋ฌผ๋ก ์ ์ฝ๋๋ ์๋๋ก์ด๋ ์คํ๋์ค์์ ์ค๋ฅ๋ฅผ ๋ฐ์ ์์ผ ์ปดํ์ผ๋์ง ์๋๋ก ๋ง์์ฃผ์ง๋ง,
์ฝ๋์ ์์ด ๋ง์์ง๋ฉด ์ด๋ฐ ์ํฉ์ด ์ธ์ ๋ ์ง ๋ฐ์ํ ์ ์์ผ๋ฉฐ Kotlin์ ์ด๋ฐ ์ํฉ์ ๋ค์ํ ์์ ์ฅ์น๋ฅผ ๋ง๋ฆ - ๊ทธ ๊ฒฐ๊ณผ๋ฌผ์ด Null Safety
null ๊ฐ ํ์ฉํ๊ธฐ: ? (Nullable, ๋ฌผ์ํ)
var variable: String?
- Kotlin์์ ์ง์ ํ๋ ๊ธฐ๋ณธ ๋ณ์๋ ๋ชจ๋ null์ด ์ ๋ ฅ๋์ง ์์
- null ๊ฐ์ ์ ๋ ฅํ๊ธฐ ์ํด์๋ ๋ณ์๋ฅผ ์ ์ธํ ๋ ํ์ ๋ค์ ?(Nullable, ๋ฌผ์ํ)๋ฅผ ์ ๋ ฅ
๋ณ์์ null ํ์ฉ ์ค์ ํ๊ธฐ
var nullable: String? // ํ์
๋ค์์ ๋ฌผ์ํ๋ฅผ ๋ถ์ฌ์ null ๊ฐ์ ์
๋ ฅ ๊ฐ๋ฅ
nullable = null
โ
var notNullable: String
notNullable = null // ์ผ๋ฐ ๋ณ์์๋ null์ ์
๋ ฅ ๋ถ๊ฐ
- ๋ณ์์ ํ์ ๋ค์ ๋ฌผ์ํ๋ฅผ ๋ถ์ด์ง ์์ผ๋ฉด null ๊ฐ์ ์ ๋ ฅํ ์ ์์
- null ์์ธ๋ฅผ ๋ฐ์์ํค๊ณ ์ถ์ง ์๋ค๋ฉด ๊ธฐ๋ณธํ์ผ๋ก ์ ์ธ
ํจ์ ํ๋ผ๋ฏธํฐ์ null ํ์ฉ ์ค์ ํ๊ธฐ
fun nullParameter(str: String?){ // ํ๋ผ๋ฏธํฐ str์ null์ด ํ์ฉ๋จ
if (str != null) { // null ์ฒดํฌ๋ฅผ ํด์ผ str ์ฌ์ฉ๊ฐ๋ฅ
var length2 = str.length
}
}
- ์๋๋ก์ด๋์ onCreate() ๋ฉ์๋์ Bundle ํ๋ผ๋ฏธํฐ์ฒ๋ผ ํจ์์ ํ๋ผ๋ฏธํฐ์๋ null ํ์ฉ ์ฌ๋ถ๋ฅผ ์ค์ ํ ์ ์์
- ํจ์์ ํ๋ผ๋ฏธํฐ๊ฐ null์ ํ์ฉํ๋ ค๋ฉด ํด๋น ํ๋ผ๋ฏธํฐ์ ๋ํด์ null ์ฒดํฌ(?)๋ฅผ ๋จผ์ ํด์ผ๋ง ์ฌ์ฉํ ์ ์์
ํจ์์ ๋ฆฌํด ํ์ ์ null ํ์ฉ ์ค์ ํ๊ธฐ
fun nullReturn(): String? {
return null
}
- ํจ์์ ๋ฆฌํด ํ์ ์๋ ๋ฌผ์ํ๋ฅผ ๋ถ์ฌ์ null ํ์ฉ ์ฌ๋ถ๋ฅผ ์ค์ ํ ์ ์์
- ํจ์์ ๋ฆฌํด ํ์ ์ Nullable์ด ์ง์ ๋์ด ์์ง ์์ผ๋ฉด null ๊ฐ์ ๋ฆฌํดํ ์ ์์
์์ ํ ํธ์ถ: ?. (Safe Call, ๋ฌผ์ํ์ ์จ์ )
fun testSafeCall(str: String?): Int? {
var resultNull: Int? = str?.length
// ๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ ๋ฐํํ๋ length ํ๋กํผํฐ๋ฅผ ํธ์ถํ๋๋ฐ
// str ๋ณ์ ์์ฒด๊ฐ null์ผ ๊ฒฝ์ฐ length ํ๋กํผํฐ๋ฅผ ํธ์ถํ์ง ์๊ณ ๋ฐ๋ก null์ ๋ฐํ
return resultNull
}
- ์ข ๋ ๊ฐ๊ฒฐํ null ์ฒดํฌ
- Nullable์ธ ๋ณ์ ๋ค์์ ?.์ ์ฌ์ฉํ๋ฉด ํด๋น ๋ณ์๊ฐ null์ผ ๊ฒฝ์ฐ ?. ๋ค์์ ๋ฉ์๋๋ ํ๋กํผํฐ๋ฅผ ํธ์ถํ์ง ์์
- ์์์์ ๋ง์ฝ Safe Call์ ์ฌ์ฉํ์ง ์์๋๋ฐ str ๋ณ์๊ฐ null์ด๋ผ๋ฉด ํ๋ก๊ทธ๋จ์ ๋ค์ด๋จ
Null ๊ฐ ๋์ฒดํ๊ธฐ: ?: (Elvis Operator, ๋ฌผ์ํ์ ์ฝ๋ก )
fun testElvis(str: String?): Int {
var resultNonNull: Int = str?.length ?: 0
//Safe Call ๋ค์์ ํธ์ถ๋๋ ํ๋กํผํฐ ๋ค์ ๋ค์ ?:์ ๋ถ์ด๊ณ , 0์ด๋ผ๋ ๊ฐ์ ํ์
//length ์ค๋ฅธ์ชฝ์ ?:์ ์ฌ์ฉํ๋ฉด null์ผ ๊ฒฝ์ฐ ?: ์ค๋ฅธ์ชฝ์ ๊ฐ์ด ๋ฐํ
//str ๋ณ์๊ฐ null์ผ ๊ฒฝ์ฐ ๊ฐ์ฅ ๋ค์ ํ์ํ 0์ ๋ฐํ
return resultNonNull
}
- ์๋ณธ ๋ณ์๊ฐ null์ผ ๋ ๋๊ฒจ์ค ๊ธฐ๋ณธ๊ฐ์ ์ค์
๐ก Nullable(?), Safe Call(?.), Elvis Operator(?:) ์์ฝ ์ ๋ฆฌ
Nullable
- ํ๊ธฐ๋ฒ: ์ ์ธํ๋ ๋ณ์์ ํ์ ๋ค์์ ? ํ๊ธฐ
- ์ฌ์ฉ ๋ชฉ์ : null์ ์ ๋ ฅ๋ฐ๊ธฐ ์ํด ์ฌ์ฉ
- ์ฌ์ฉ ์: var nullable: ํ์ ?
Safe Call
- ํ๊ธฐ๋ฒ: ์ ์ธ๋ ๋ณ์์ ์ด๋ฆ ๋ค์์ ?. ํ๊ธฐ
- ์ฌ์ฉ ๋ชฉ์ : null์ผ ๋ ?. ๋ค์์ ๋์ค๋ ์์ฑ์ด๋ ๋ช ๋ น์ด๋ฅผ ์ฒ๋ฆฌํ์ง ์๊ธฐ ์ํด ์ฌ์ฉ
- ์ฌ์ฉ ์: var result = ๋ณ์?.length ๋๋ ๋ณ์?.ํ๋กํผํฐ?.something
Elvis Operator
- ํ๊ธฐ๋ฒ: ์ ์ธ๋ ๋ณ์์ ์ด๋ฆ ๋ค์์ ?: ํ๊ธฐ
- ์ฌ์ฉ ๋ชฉ์ : null์ผ ๋ ?: ๋ค์์ ๋์ค๋ ๊ฐ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ฌ์ฉ
- ์ฌ์ฉ ์: var result = ๋ณ์?:0 ๋๋ ๋ณ์?.ํ๋กํผํฐ?:0
๋ฐ์ํ
๐ฌ C O M M E N T