๋(null)์ ๊ฐ์ฒด๊ฐ ์ฃผ์๋ฅผ ๊ฐ์ง์ง ๋ชปํ ์ํ์ธ๋ฐ ๋์ธ ์ํ์ ๊ฐ์ฒด๋ฅผ ์ด์ฉํ ๋ ๋ ํฌ์ธํธ ์์ธ(NullPointException)์ด ๋ฐ์ํ๋ค.
null ๊ฐ์ผ๋ก ์ธํ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ๊ณ ์์ ํ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋๋ก ๋์์ฃผ๋ ๊ฒ ๋ ์์ ์ฑ์ด๋ค
NPE : ๋์ธ ์ํ์ ๊ฐ์ฒด๋ฅผ ์ด์ฉํ ์ ์๋ค๋ ์ค๋ฅ
์๋ฐ์๋ ๋ ์์ ์ฐ์ฐ์๊ฐ ์์ด์ ์์ธ ์ฒ๋ฆฌ๋ฅผ ํด์ผ ํ ๋ if-else๋ฌธ์ ์ฌ์ฉํด์ผ ํ์ง๋ง ์ฝํ๋ฆฐ์์๋ ๋ ์์ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ ์ ์๋ค.
class Person(val name: String?)
fun main() {
val person: Person? = null
val name = person.name // ์ฌ๊ธฐ์ NullPointerException์ด ๋ฐ์ํ ์ ์์
println(name)
}
์ ์ฝ๋์์ person ๊ฐ์ฒด๊ฐ ๋์ด๋ฏ๋ก person.name์ ์ ๊ทผํ๋ ค๊ณ ํ๋ฉด NPE๊ฐ ๋ฐ์ํ๋ค.
class Person(val name: String?)
fun main() {
val person: Person? = null
val name = person?.name // ์ธ์ดํ ์ฝ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ ํ๊ฒ ์ ๊ทผ
println(name) // ๊ฒฐ๊ณผ๋ null์ด ๋ ๊ฒ์ด๋ฉฐ, NullPointerException์ ๋ฐ์ํ์ง ์์
}
person.name์ ์ ๊ทผํ ๋ NPE๊ฐ ๋ฐ์ํ์ง ์๊ณ null์ ๋ฐํํ๋ค.
๋์ด ์๋ ๋๋ ์ผ์ชฝ ํผ์ฐ์ฐ์๋ฅผ ๋ฐํํ๊ณ ๋์ผ ๋๋ ์ค๋ฅธ์ชฝ ํผ์ฐ์ฐ์๋ฅผ ๋ฐํํ๋ค.
val length = text?.length ?: 0 // text๊ฐ ๋์ด ์๋๋ฉด length์ ๋ฌธ์์ด ๊ธธ์ด๋ฅผ ํ ๋น, ๋์ด๋ฉด 0์ ํ ๋น
ํด๋น ๋ณ์๊ฐ ๋์ด ์๋๋ผ๊ณ ๋จ์ธํ๋ค.
๋ณ์๊ฐ ๋์ด ์๋ ๊ฒฝ์ฐ ๊ทธ๋๋ก ์ฌ์ฉ๋์ง๋ง ๋์ผ ๊ฒฝ์ฐ NPE๋ฅผ ๋ฐ์์ํจ๋ค.
์ฌ์ฉ์ ์ฃผ์๊ฐ ํ์ํ ์ฐ์ฐ์์ด๋ค.
val length = text!!.length // text๊ฐ ๋์ด ์๋ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉ, ๋์ธ ๊ฒฝ์ฐ NullPointerException ๋ฐ์
๋์ด ์๋ ๋๋ง ์ฝ๋ ๋ธ๋ก์ ์คํํ๋ค.
๋์ผ ๋๋ ๋ธ๋ก์ ์คํํ์ง ์๊ณ ๋์ด๊ฐ๋ค.
text?.let {
// text๊ฐ ๋์ด ์๋ ๋๋ง ์ด ๋ธ๋ก์ ์ฝ๋ ์คํ
println(it.length)
}
๋ ์ฐธ์กฐ๋ก ์ธํด ๋ฐ์ํ ์ ์๋ ์ค๋ฅ๋ฅผ ๋ฐฉ์ง ํ๊ธฐ ์ํด ๋ ์ฒดํฌ๋ฅผ ํด์ผํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
public String getCityName(User user) {
if (user != null) {
Address address = user.getAddress();
if (address != null) {
String city = address.getCity();
if (city != null) {
return city;
}
}
}
return "Unknown";
}
๋ ์์ ์ฐ์ฐ์๊ฐ ์๋ ์๋ฐ์์๋ if-else ๋ฌธ์ ์ฌ์ฉํ์ฌ ๋ ์ฒดํฌ๋ฅผ ์ํํ๋ค.
์ฝํ๋ฆฐ์์๋ ๋ ์์ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด ๊ฐ๊ฒฐํ๊ฒ ํํํ ์ ์๋ค.
fun getCityName(user: User?): String {
return user?.address?.city ?: "Unknown"
}
์ null์ ๋ฐํํ์ง ์๊ณ NPE๋ฅผ ๋ฐํํด์ ์ฑ์ด ์ข ๋ฃ๋๊ฒ ๋ง๋ค๊น?
์๋ฅผ ๋ค์ด์ null์ด ์กด์ฌํ๋ฉด ์ ๋๋ ๊ฒ๋ค์ด ์กด์ฌํด์
์ฑ์์ My ํ์ด์ง์ ์์ ์ ์ด๋ฆ์ ๋ณด์ฌ์ค๋ค๊ณ ํ ๋
์ด๋ฆ์ด null์ธ ๊ฒฝ์ฐ๋ ์์์์??
๋ถ๋ช null์ธ ๊ฒฝ์ฐ๋ ์ด๋์์ ์๋ฌ๊ฐ ๋ฌ๋ ๊ฒ์ด๊ณ ์ด๊ฒ์ ๊ฐ๋ฐ์๋ ๋น ๋ฅด๊ฒ ๋์์ ํด์ผ ํฉ๋๋ค
๊ทธ๋ ๊ธฐ์ Exception์ ๋ด๋ ์ด์ ์ด๋ฉฐ
๋ํ ์๋์ ๊ฐ์ ์ํฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด์ ์๋ฌ ์ฒ๋ฆฌ๋ฅผ ํ๊ธฐ๋ ํด์
var db: DB? = ๋ฐ์ดํฐ ๋ฒ ์ด์ค
if ( db != null ) {
if ( db.dao != null ) {
if (... != null) {
//... ๋์ถฉ ์ด๋ง์ด๋งํ null ๋์
}
}
}
var db: DB? = ๋ฐ์ดํฐ๋ฒ ์ด์ค
if (db == null) {
throw NPE
}
ํ์คํ ํ์๊ฐ ๋ ๋ซ์ ธ??