โ๏ธ ์ฝํ๋ฆฐ ๋ํต์ฌ๊ณ ๋ค๋ฐ ๊ตฌ์ญ์ ๋๋ค
์ฃผ์ํ์ธ์. ์ฝํ๋ฆฐ์ ๋งค๋ ฅ์ ๋น ์ง๋ฉด ํ๋์ ๋ฒ์ด๋์ง ๋ชปํ ๊ฒ๋๋ค.
๊ทธ๋ ๋ค. ์ฌ์ค ํ์์ ์ฝํ๋ฆฐ ๋์ง์ฉ ํฌ์คํ
์ด๋ค. ํ์๋ ๊ฐ์ธ์ ์ผ๋ก ์ฝํ๋ฆฐ์ ๋งค์ฐ ์ฌ๋ํ๋ค.
์ฝํ๋ฆฐ์ด๋ผ์ ์ข์ํ๋ ๊ฒ์ด ์๋, ์ข์ํ๊ณ ๋ณด๋ ์ฝํ๋ฆฐ์ด์๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ ์ฝํ๋ฆฐ์ ๋งค๋ ฅ์ ๋๋ฆฌ ์๋ฆฌ๊ณ ์ถ์ด ์ด ๊ธ์ ์์ฑํ๊ฒ ๋์๋ค!
์ด์ํ๊ฒ ๋ณด์ง๋ง๊ณ ํ ๋ฒ๋ง, ๋ฑ ํ ๋ฒ๋ง ์ด ๊ธ์ ์ฝ์ด๋ณด๊ธธ ๋ฐ๋๋ค. ํนํ '์๋ฐ' ๋ฅผ ํ์ฉํ ๊ฐ๋ฐ์ ํ๊ณ ์๋ค๋ฉด..
๋ถ๋ช
์๋๋ก์ด๋, ์คํ๋ง ๋ถํธ ๋ฑ ๋ถ์ผ์์ ์๋ฐ โ ์ฝํ๋ฆฐ์ผ๋ก ์์ ํ ์ ํ๋๋ ๊ฒ์ ์๊ฐ ๋ฌธ์ ์ผ ๊ฒ์ด๋ค!!
์ฝํ๋ฆฐ์ ์๋ฐ, ์ค์นผ๋ผ์ฒ๋ผ JVM ์์์ ๋์๊ฐ๋ ์๋ก์ด ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ค.
๊ณต์ ์์ ํ์ด 2016๋
2์ 15์ผ ๋ฆด๋ฆฌ์ฆ ๋์์ผ๋ ์ ๋ง ์ ์์๊ฐ ๋ฐ๋ก ์๋ค. (์ ๊ณ ๋ณด๋ ๋ฒ์จ 5๋
์ด ๋๊ธด ํ๊ตฌ๋)
์ฝํ๋ฆฐ์ ๊ฐ๊ฒฐํ๊ณ ์ค์ฉ์ ์ด๋ฉฐ, ์๋ฐ ์ฝ๋์์ ์ํธ์ด์ฉ์ฑ์ ์ค์ํ๋ค. ๋ฐ๋ผ์ ์๋ฐ๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ๊ฑฐ์ ๋ชจ๋ ๊ณณ์ ๋๋ถ๋ถ ์ฝํ๋ฆฐ์ ํ์ฉํ ์ ์๊ณ , ์ ๋ชฉํด๋ณผ ์ ์๋ค. ์๋๋ก์ด๋, ์คํ๋ง ๋ถํธ ๋ฑ ๋ถ์ผ์์ ๋ง์ด๋ค.
๊ธฐ์กด ์๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ๋ ์์ํฌ์๋ ๋จ 1%์ ํธํ์ฑ ๋ฌธ์ ์์ด ํจ๊ป ์ ๋์ํ๋ฉฐ, ์ฑ๋ฅ๋ ๋น์ทํ๋ค.
๊ทธ๋ผ, ์ฝํ๋ฆฐ์ ํต์ฌ ์ฃผ์ ํน์ฑ ๋ช ๊ฐ์ง๋ฅผ ํบ์๋ณด์.
์ ์ ํ์ ์ง์ ์ธ์ด๋ ๋ง ๊ทธ๋๋ก ์ฝ๋๋ฅผ ์์ฑํ ๋ ๋ณ์, ํจ์ ๋ฐํ ํ์ ๋ฑ์ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ง์ ํ์ ์ ์ง์ ํด์ฃผ๋ ์ธ์ด์ด๋ค. ์๋ฐ๋ ์ด์ ํด๋นํ๋ค.
์๋ฐ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฝํ๋ฆฐ๋ ์ ์ ํ์ ์ง์ ์ธ์ด์ด๋ค. ๊ฐ ๋ณ์์ ํ์ ์ ์ปดํ์ผ ์์ ์ ์ ์ ์๊ณ , ํ๋ก๊ทธ๋จ ์์์ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๋๋ง๋ค ์ปดํ์ผ๋ฌ๊ฐ ํ์ ์ ๊ฒ์ฆํด์ฃผ๊ธฐ ๋๋ฌธ์, ์ ํ์ฑ์ด ๋์ฑ ์ฌ๋ผ๊ฐ๋ค.
๐ถ : ๊ทธ๋ผ ๊ทธ ๋ฐ๋์ธ '๋์ ํ์ ์ง์ ์ธ์ด'๋ ๋ญ๊ฐ ์ข์๋ฐ์?
๐๐ปโโ๏ธ : ํ์ ์ ์๊ดํ์ง ์๊ณ ๋ชจ๋ ๊ฐ์ ๋ณ์์ ๋ฃ์ ์ ์์ด ํ์ ๋ช ์๊ฐ ํ์์๊ณ , ๊ทธ์ ๋ฐ๋ผ ์ฝ๋๊ฐ ๋ ์งง์์ง๊ฒ ์ฃ !
๋ํ, ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ ์ ์ฐํ๊ฒ ์์ฑํ๊ณ ์ฌ์ฉํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ฃ !
ํ์ง๋ง, ๋์ ํ์
์ง์ ์ธ์ด๋ ์ด๋ฆ์ด ์คํ๊ฐ ๋๊ฑฐ๋ ๋ฉ์๋๋ฅผ ์๋ชป ์ ๊ทผํ์ ๋, ์ปดํ์ผ ์ ๊ฑธ๋ฌ๋ด์ง ๋ชปํ๊ณ
์คํ ์์ ์ด ๋์ด์์ผ ์ค๋ฅ๋ฅผ ๋ฟ์ผ๋ฉฐ ํ๋ก๊ทธ๋จ์ด ๊บผ์ง ์ ์๋ค๋ ๋จ์ ์ด ์๋ค.
ํ์๋ ์ ์ ํ์ ์ธ์ด์ ์ฅ์ ์ด ๋งค์ฐ ๊ฐ๋ ฅํ์ฌ ์ด๋ฅผ ์ ํธํ๋ ํธ์ด๋ค. ์๋ฐ๋ ์ด๋ฐ ๋ถ๋ถ์์ ์ข๋ค. ํ์ง๋ง ์๋ฐ์์ ํญ์ ๊ท์ฐฎ๊ฒ ํ์ ์ ์ง์ ํด์ค์ผ ํ๋ค๋ ์ ์ด ๊ทธ๋งํผ ํฐ ๋ถํธํจ, ๊ทธ๋ฆฌ๊ณ ๋จ์ ์ผ๋ก ๋ค๊ฐ์ค๊ณค ํ๋ค.
๋ฐ๋ฉด ์ฝํ๋ฆฐ์, ํ์ ์ ์ง์ ๋ช ์ํ ํ์๊ฐ ์๋ค.
์ฝํ๋ฆฐ ์ปดํ์ผ๋ฌ๋ ๋ฌธ๋งฅ์ ๋ณ์ ํ์ ์ ์๋์ผ๋ก ์ ์ถํ ์ ์๊ธฐ ๋๋ฌธ์, ํ๋ก๊ทธ๋๋จธ๋ ํ์ ์ ์ธ์ ์๋ตํ ์ ์๋ค.
๋ํ, ์ด๋ค ๊ฒฝ์ฐ์ ํจ์์ ๋ฐํํ๋ ์๋ตํ ์ ์๋ค!
์ ์ ์๋ ์ฝ๋๋ฅผ ๋ณด์! ์ฝํ๋ฆฐ์์ sum()
ํจ์๋ฅผ ์ ์ํ๊ณ ์ ์ธํ๋ค.
val a: Int = 3
val b: Int = 5
fun sum(a: Int, b: Int): Int {
return a + b
}
print(sum(a, b)) // 8
์๋ฐ์ ๋ณ ๋ค๋ฅผ ๊ฑฐ ์์ด, ํ์
์ ์ง์ ํด์ฃผ๋ ๋ถ๋ถ์ด ๋ง๋ค.
๊ทธ๋ฌ๋ ์ฝํ๋ฆฐ์ ๋ค์๊ณผ ๊ฐ์ด ๋ถํ์ํ ์ฝ๋๋ฅผ ์ค์ผ ์ ์๋ค!
val a = 3
val b = 5
fun sum(a: Int, b: Int): Int {
return a + b
}
print(sum(a, b)) // 8
ํจ์์ ํํ์ (Expression) ๋์ ์ ํ๋ฉด, ์ด๋ฐ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
val a = 3
val b = 5
fun sum(a: Int, b: Int) = a + b
print(sum(a, b)) // 8
๊ทธ๋ฌ๋๊น, ํ์ ์ ์ ์ ์ผ๋ก ์๊ฒฉํ ์ง์ ํ๋ ๊ฑด ๋ง์ผ๋ ํ๋ก๊ทธ๋๋จธ์ ํธ์์ฑ๊ณผ ๊ฐ๊ฒฐํ ์ฝ๋๋ฅผ ์ํด ์ปดํ์ผ๋ฌ ์ฐจ์์์ ์ด๋ฅผ ์์์ ์ฒ๋ฆฌํด์ค๋ค๋ ๊ฒ์ด๋ค!
์ด๋ฅผ ํตํด ์ฝํ๋ฆฐ์ ์ฒ ํ ์ค ํ๋์ธ '๊ฐ๊ฒฐ์ฑ'์์ ํ ๋ฐ์ง ๋ ์์๊ฐ๋ ๊ฒ์ด๋ค.
์ฝํ๋ฆฐ์ ์ฌ์ฉํ๋ฉด, ์๋ฐ์ฒ๋ผ ํ์
๋ช
์๋ฅผ ํด์ค ํ์ ์์ด ์ปดํ์ผ๋ฌ์๊ฒ ๋ฏฟ๊ณ ๋งก๊ธธ ์ ์๋ค.
์ด๊ฒ ํ๋๋ง์ผ๋ก ์ธ ๋ฐ ์๋ ์ฝ๋๋ฅผ ํ ์ค์ผ ์ ์๋ค!
์ฝํ๋ฆฐ์ ์๋ฐ์ฒ๋ผ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ ๋ฐ๋ฅด๊ธฐ๋ ํ์ง๋ง, ์๋กญ๊ฒ๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์๋ ๋์์ ์ฑ๊ธด ์ธ์ด์ด๋ค. ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ด์ผ๊ธฐ๋ ๋ ๋ง ํ ๊ฒ๋ ์๋๋ฐ, ๋ช๋ช ์ฌ๋๋ค์๊ฒ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ด ์์ํ๊ฒ ๋ค๊ฐ์ฌ ์ ์๋ค.
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ํต์ฌ ๊ฐ๋ 3๊ฐ์ง
- ํจ์๋ ์ผ๊ธ ์๋ฏผ : ํจ์๋ฅผ ์ผ๋ฐ ๊ฐ์ฒ๋ผ ๋ณ์์ ์ ์ฅํ ์ ์๊ณ , ๋ค๋ฅธ ํจ์์ ์ธ์๋ก๋ ๋๊ธธ ์ ์์
- ๋ถ๋ณ์ฑ : ์์ฑ ์ดํ ์ ๋๋ก ๋ด๋ถ ์ํ๊ฐ ๋ฐ๋์ง ์๋ ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก๊ทธ๋จ ์์ฑ
- ์ฌ์ด๋ ์ดํํธ ์์ : ์ ๋ ฅ์ด ๊ฐ์ผ๋ฉด ํญ์ ๊ฐ์ ์ถ๋ ฅ์ ๋ณด์ฅํ๋ฉฐ, ํจ์ ์ธ๋ถ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๊ฑด๋๋ฆฌ์ง ์์ (์์ํจ์)
ํนํ 'ํจ์๋ ์ผ๊ธ ์๋ฏผ'์ด ๋ญ ์๋ฆฐ์ง ์ดํด๊ฐ ์ ๋ ์ ์๋ค. ์๋ ์ฝ๋๋ฅผ ๋ณด์!
fun findAlice() = findPerson { it.name == "Alice" } // ์ด๋ฆ ํ๋กํผํฐ๊ฐ Alice ์ธ ๊ฐ์ฒด ํ์
fun findBob() = findPerson { it.name == "Bob" } // ์ด๋ฆ ํ๋กํผํฐ๊ฐ Bob ์ธ ๊ฐ์ฒด ํ์
์ ์์ ๋ ํน์ ์ฌ๋์ ์ฐพ์ ์ ์๋ ๋์์ ์ํํ๋ ํจ์ findPerson
์ ์ด๋ฆ์ด ์๋ ํจ์ (์ฝ๋ ๋ธ๋ญ) ์ ์ธ์๋ก ๋๊ฒผ์ผ๋ฉฐ, ๊ทธ ๊ฒฐ๊ณผ๊ฐ์ ๋ฆฌํด์ผ๋ก ๊ฐ๋๋ค.
findPerson ์ ์ฌ๋์ ์ฐพ๋ ์ผ๋ฐ ๋ก์ง์ด ๋ด๊ฒจ์๋ ๊ฒ์ด๊ณ , { } ๋ก ๊ฐ์ธ์ง ๋ถ๋ถ์ ์ด๋ฆ์ด ์๋ ์ฝ๋๋ธ๋ญ, ๊ทธ๋ฌ๋๊น ์์ฐํ 'ํจ์'์ด๋ค.
์ด ๊ตฌ๋ฌธ์ ๋ฐ๋ก '๋๋ค ์ (Lambda Expression)' ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์ ๋ง ์ฝ๋๊ฐ ๊ฐ๊ฒฐํ๊ณ ์ฐ์ํด์ง๋ค.
์ด๋ ๋ฏ ํจ์๋ฅผ ๊ฐ์ฒ๋ผ ํ์ฉํ ์ ์๋ค๋ฉด, ๋์ฑ ๊ฐ๋ ฅํ ์ถ์ํ๋ฅผ ํ ์ ์๊ณ , ๋ง์ ์ฝ๋์ ์ค๋ณต์ ์ ๊ฑฐํ ์ ์๋ค.
๐ฎ๐ปโโ๏ธ : ์ฅ ใ ใ ์๋ฐ๋ ๋๋ค ๋๋๋ฐ์? ์ฝํ๋ฆฐ๋ง ๋๋ ์ฒ ์ต๋น ์ค์ง๋ค์ ใ ใ ๋ฃจ์ฅ๋ฝ
๋์ ๋ชป ํ๋ค. ์๋ฐ์ ๋๋ค๋ ์๋ฌด๋๋ ์๋ฏธ๊ฐ ์๋ค. ํํ๋ฅผ ๋น๊ตํ๊ธฐ ์ํด ์ ์ ์๋๋ก์ด๋ ์ฝ๋๋ฅผ ๋ณด์.
์๋๋, ์๋๋ก์ด๋์์ ๋ฒํผ์ ํด๋ฆญ ์ด๋ฒคํธ๋ฅผ ๋ฌ์์ฃผ๋ ์์ ์๋ฐ๋ก ์์ฑ๋ ์ฝ๋์ด๋ค.๋ฒ์จ ๋๋ฝ๋คbutton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // ๋ฒํผ์ด ํด๋ฆญ๋์์ ๋ ์ํํ ๋์ ์ ์ } });
๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ๊ทธ๋๋ง ์๋ฐ8 ์์ ์ง์ํ๋ ๋๋ค ์์ผ๋ก ๋ณํํ๋ฉด...
์. ๊ฝค๋ ๊ฐ๊ฒฐํ๊ฒ ์ค์ด๋ ๋ชจ์์ด๋ค. ๊ทธ๋ฌ๋ ์์ง ๋ณ๋ก ๋ง์ ์ ๋ ๋ค.button.setOnClickListener(view -> { // ๋ฒํผ์ด ํด๋ฆญ๋์์ ๋ ์ํํ ๋์ ์ ์ });
์๋ ์ฝํ๋ฆฐ ์ฝ๋๋ฅผ ๋ณด์.
button.setOnClickListener { // ๋ฒํผ์ด ํด๋ฆญ๋์์ ๋ ์ํํ ๋์ ์ ์ }
๋ช ๊ธ์ ์ฐจ์ด๋ก ํจ์ฌ ๊น๋ํด๋ณด์ธ๋ค. ์ต๋น ์๋๊ณ ํฉํธ๋ค. ์๋ฐ ์ฝ๋์ ์ view ๋ผ๋ ๋์ ์ฐ์ง๋ ์๋๋ค.
์ฝํ๋ฆฐ์ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ํ์ด๋ ๋งํผ ์๋ฐ์ ๋ฌ๋ฆฌ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ฅ์ ์ ๋์ฑ ๊ตด๋ฆฌ๊ธฐ ์ํด ์ธ์ด ์ฐจ์์์ ์๋์ ๊ฐ์ ์ง์์ ํด์ค๋ค!
- ์ด๋ค ํจ์๊ฐ ๋ค๋ฅธ ํจ์๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๊ฑฐ๋, ํจ์๊ฐ ์๋ก์ด ํจ์๋ฅผ ๋ฐํํ ์ ์์
- ๋๋ค ์์ ์ง์ํจ์ผ๋ก์จ ์ผ๋ถ ์ฝ๋ ๋ธ๋ญ์ ํจ์์ ์ธ์๋ก, ํน์ ๋ณ์ ๋ฑ์ผ๋ก ๋์ ํ ์ ์์
- ๊ฐ์ฒด์ ์ปฌ๋ ์ ์ ํจ์ํ ์คํ์ผ๋ก ๋ค๋ฃฐ ์ ์๋ ๋ค์ํ ๊ณ ์ฐจํจ์ API ์ ๊ณต
์ค์ ๋ก ์ปฌ๋ ์ ๊ณ ์ฐจํจ์๋ ์๋นํ ๋ง์ด ์ฐ์ด๊ฒ ๋๋ค. ์ด๋ฅผํ ๋ฉด ์ด๋ฐ ์๋ฅผ ๋ค์ด๋ณผ ์ ์๋ค.
val a = listOf(-1, -2, 1, 2)
val b = a.filter { it > 0 } // x > 0 ์ด๋ผ๋ ์ต๋ช
ํจ์๋ฅผ ์ธ์๋ก ๋๊น
์ด๋ ๊ฒ ํ๋ฉด b
์๋ [1, 2]
๊ฐ ๋ด๊ธด ๋ฆฌ์คํธ๊ฐ ๋ค์ด๊ฐ๊ฒ ๋๋ค. ์ด ์ธ์๋ ํญ ๋๊ณ ๋ค์ํ ์ปฌ๋ ์
๊ณ ์ฐจํจ์๋ฅผ ์ง์ํ๋ฉฐ, ์ค์ ๋ก ์ฌ์ฉํ ์ผ์ด ๋ง์ ํธ๋ฆฌํ๋ค.
๊ทธ๋ฆฌ๊ณ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๋ํด ์ ๋ชจ๋ฅธ๋ค๊ณ ๊ฑฑ์ ํ์ง ์์๋ ๋๋ค. ์ฝํ๋ฆฐ์ด ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ ๊ฐ์ํ๋ ๊ฑด ์๋๊ณ , ๋ณธ์ธ์ด ํธํ๋๋ก ์ฌ์ ์ ๋ง๊ฒ ์ํฉ์ ๋ง๊ฒ ๋ช ๋ นํ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฑ ์ ์ ํ ์ํ๋ ์คํ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๋๋ค. ์ ํฉํ ํจ๋ฌ๋ค์์ ์ ํํ๋ ๊ฒ์ ๊ฐ๋ฐ์์ ๋ชซ์ด๋ค.
์ด์ฐจํผ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ฒ์ฒํ ์ตํ๋ค๋ณด๋ฉด ๊ทธ ์ธ๊ณ์์ ๋น ์ ธ๋์ค์ง ๋ชปํ๋ค ใ
์ฝํ๋ฆฐ์ ๊ฐ์ฅ ํต์ฌ์ด๋ค! ๋ฐ๋ก Null-safety ๋ฅผ ์ธ์ด ์ฐจ์์์ ์ง์ํ๋ค๋ ๊ฒ์ด๋ค.
์๋ฐ๋ก ๋ฌด์ธ๊ฐ ๊ฐ๋ฐ์ ํ๋ค๋ณด๋ฉด, ์๋ ์ค๋ฅ๊ฐ ์ฐ๋ฆด ์ฌ์ฌํ์ง ์๊ฒ ๋ฐ๊ฒจ์ฃผ๊ณค ํ๋ค. (์ผ ๋ณด๊ธฐ๋ง ํด๋ ํ๋ฉธ๋๋ค)
์ค๋น , ์ ๋ฐ ์ข ๊ทธ๋ง ์ง์ฒ๋.
์๋ฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์๋ค์ NullPointerException ์๊ฒ ๊ณ์ํ์ฌ ๋นํ๊ณ ์๋ค..
์คํํด๋๊ณ ๋ณด๋ ๊ฐ์๊ธฐ NullPointerException ์ด ๋ก๊ทธ์ ์ฐํ์ฌ ํ๋ก๊ทธ๋จ์ด ๊ฐ์ ์ข
๋ฃ๋๋ ์
๋ชฝ์ด ๋ ์ค๋ฅธ๋ค.
NPE ๋ ๋ณดํต ๊ฐ๋ฐ์์ ์ค์๋ก ์ธํด ์๋์น ์๊ฒ ๋ณ์์ null
์ ๋ด๊ฒ ๋์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ฐ, ๊ฐ๋ฐ์๋ ์ฌ๋์ธ์ง๋ผ ์ค์๋ฅผ ์ค์ด๋ ๊ฒ์ ๋ ๋ค๋ฅธ ์ฐจ์์ ๊ณ ๋ฏผ์ด๊ณ ์ด์ฉ๋ฉด ํด๊ฒฐ ๋ถ๊ฐ๋ฅํ ์์ญ์ด๋ผ๊ณ ํ ์ ์๊ฒ ๋ค.
๋ฐ๋ผ์ ์ฝํ๋ฆฐ์ ์ด NPE ๋ฅผ ํ๊ธฐ์ ์ผ๋ก ์ค์ด๊ธฐ ์ํด, ์ปดํ์ผ ์์ ์
null
์ํ์ฑ ๊ฒ์ฌ๋ฅผ ํ์ฌ ์ค๋ฅ๋ฅผ ํจ์ฌ ๋ง์ด ๋ฐฉ์งํด์ค๋ค.
์ฝํ๋ฆฐ ํ์
์์คํ
์ null
์ด ๋ ์ ์๋ ๊ฐ์ ์ถ์ ํ๋ฉฐ, ์คํ ์์ ์ NPE ๋ฐ์ ๊ฐ๋ฅ์ฑ์ด ์๋ ์ฐ์ฐ ๋ฐ ์ฝ๋๋ฅผ ์ฌ์ ์ ์์ ๊ธ์ง์ํจ๋ค. ์ ์๋น์ด ๋น๋๋ ๋ชป ํ๊ฒ ํ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋๊น ์ฆ, ์ผ๋ฐ์ ์ผ๋ก ๋ณ์์
null
์ ๋ด์ ์ ์๊ฒ ๋์ด์๋ค.
๊ทธ๋ ๋ค๊ณ ์์ null
์์ฒด๊ฐ ์๋ ๊ฑด ์๋๊ณ , ์๋์ ๊ฐ์ด null
์ด ๋ด๊ธธ ์ ์๋ ํ์
๊ณผ ์๋ ํ์
์ ๊ตฌ๋ถํ๋ค. ์ด ๋, null
์ด ๋ด๊ธธ ์ ์๋ ํ์
์ Nullable
ํ์
์ด๋ผ๊ณ ํ๋ฉฐ, ์๋ฃํ์ ?
๋ฅผ ๋ถ์ฌ ๋ช
์ํ๋ค.
val data1: String? = null
val data2: String = ""
๊ทธ๋ฆฌ๊ณ ์ด Nullable
ํ์
์ด ์๋๋ฉด, ๋ฌด์กฐ๊ฑด null
์ด ๋ด๊ธธ ์ ์์์ ๋ณด์ฅํ๊ฒ ๋๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ Non-Nullable
ํ์
์ null
์ด ๋ด๊ธฐ๋ ๋์ ๋ฑ์ ์ฌ์ ์ IDE ์ฐจ์์์ ๊ธ์ง์์ผ์ค๋ค.
์ด ๋ง์ ๋ชธ์ ์ค๊ฐ๋๊ฒ ํ๊ธฐ ์ํด ์ ์ ์๋ ์ฝ๋๋ฅผ ๋ณด์.
var a = 5
var data: Int? = null
a = data ?: 100
println(a)
์ด ์ฝ๋์ ์ถ๋ ฅ๊ฒฐ๊ณผ๋ ๋ฌด์์ผ๊น? ๋ฐ๋ก 100
์ด๋ค. ์ค๊ฐ์ ์์ํ ?: ์ฐ์ฐ์๊ฐ ์ด ๊ฒฐ๊ณผ๋ฅผ ์ด๋์ ๊ฒ์ด๋ค.
๋์ถฉ ๋ณด๋ฉด a
๋ณ์๊ฐ 5
๋ก ์ด๊ธฐํ ๋์ด์๊ณ data
๊ฐ Nullable Int
๋ก ์ ์ธ๋์ด์๊ณ , null
๋ก ์ด๊ธฐํ ๋์ด์๋ค.
3๋ฒ์งธ ์ฝ๋ ๋ผ์ธ์์ ?:
๋์์ ์ด๋ฌํ ๋์์ ํ๋ค.
// data ๊ฐ null ์ด ์๋๋ฉด data ์ ๊ฐ์ a ์ ๋์
ํ๊ณ ,
// data ๊ฐ null ์ด๋ผ๋ฉด ์ค๋ฅธ์ชฝ์ ์๋ 100 ์ a ์ ๋์
ํ๋ค.
a = data ?: 100
// ๋ฐ๋ผ์ a ์๋ 100 ์ด๋ผ๋ ๊ฐ์ด ๋ด๊ธฐ๊ฒ ๋์ด 100 ์ด ์ถ๋ ฅ๋๋ค.
์ด๋ฅผ ์๋น์ค ์ฐ์ฐ์ (Elvis Operator) ๋ผ๊ณ ํ๋ค. a
๋ณ์์๋ ๋ถ๋ช
ํ๊ฒ null
์ด ๋ด๊ธธ ์ ์์ผ๋ฏ๋ก
์ด๋ฌํ ์ฐ์ฐ์๋ฅผ ์ง์ํจ์ผ๋ก์จ Nullable
ํ์
๊ณผ Non-Nullable
ํ์
์ ๋ช
ํํ ๊ตฌ๋ถ์ ๋์์ค๋ค.
(TMI : ์๋น์ค ์ฐ์ฐ์ ์ ์๋น์ค๋ ์ฐ๋ฆฌ๊ฐ ์๋ ์๋น์ค ํ๋ ์ฌ๋ฆฌ๊ฐ ๋ง๋ค. ์ฐ์ฐ์ ๋ชจ์์ ์ค๋ฅธ์ชฝ์ผ๋ก 90๋ ๊บพ์ด๋ณด๋ฉด
์๋น์ค ํ๋ ์ฌ๋ฆฌ์ ํธ๋ ์ด๋๋งํฌ ํค์ด์คํ์ผ๊ณผ ๋ฎ์๋ค๊ณ ํด์ ์๋น์ค ์ฐ์ฐ์๋ผ๊ณ ๋ถ๋ฅธ๋ค๊ณ ํ๋ค.. ์คํผ์
์ด๋ค.)
์ฝํ๋ฆฐ์
Null-safety
๋ฅผ ์ํ ์ง์์ ์ด ๋ฟ๋ง์ด ์๋๋ฉฐ, ์ด ๋ฐ์๋ ๋ง์ ์ฐ์ฐ์ ๋ฐ API ๋ฅผ ์ ๊ณตํด์ค๋ค.
๋ฐ๋ผ์ NPE ๋ฐ์ ํ๋ฅ ์ด ํจ์ฌ ์ค์ด๋ค๊ณ , ๊ฐ๋ฐ์๊ฐ ์ค์๋ฅผ ๋ฒํ ํ๋ฅ ์ ํ๋ก๊ทธ๋จ ์คํ ์ด์ ์ ์ค์ฌ๋ฒ๋ฆฌ๋ ๊ฒ์ด๋ค.
์ค์ ๋ก ์๋ฐ๋ก ์์ฑ๋์ด์๋ ์๋๋ก์ด๋ ์ฑ์ ์ฝํ๋ฆฐ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ ์ดํ๋ก, ANR (์ฑ ๋น์ ์ ์ข ๋ฃ) ํ์๊ฐ ๋์ ๋๊ฒ ์ค์ด๋ค์๋ค๋ ํต๊ณ ์๋ฃ๋ ์์๋งํผ, ํ๊ธฐ์ ์ธ ์ฑ๊ณผ๋ฅผ ์ด๋ฃจ์ด ๋ธ ๊ฒ์ด๋ค.
๋๋ด์ด๊ณ , ์ง๊ธ๊น์ง ๋ด์ฉ์ ์์ฝํ์๋ฉด ๋ค์๊ณผ ๊ฐ๋ค!
- ์ฝํ๋ฆฐ์ ํ์ ์ถ๋ก ์ ์ง์ํ๋ ์ ์ ํ์ ์ง์ ์ธ์ด์ด๋ค. ๊ธฐ์กด ์๋ฐ์ ๊ฒฝ์ฐ๋ ํ์ ์ ์ผ์ผํ ๋ช ์ํด์ค์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์์๊ณ ์ด๊ฒ์ ์ ์ ํ์ ์ง์ ์ธ์ด์ ๋จ์ ์ค ํ๋์ด๊ธฐ๋ ํ์๋ค. ํ์ง๋ง ์ฝํ๋ฆฐ์ ํ์ ์ถ๋ก ์ ์ง์ํ๊ธฐ ๋๋ฌธ์, ์ ํ์ฑ๊ณผ ์ฑ๋ฅ์ ๋ณด์ฅํ๋ฉด์๋ ์์ค์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ๊ณ ์ ์งํ ์ ์๋ค!
- ๊ฐ์ฒด์งํฅ, ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์คํ์ผ ๋ชจ๋ ์ง์ํ๋ค. ์ผ๊ธ ์๋ฏผ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ค ๋์ ์ถ์ํ๊ฐ ๊ฐ๋ฅํ๋ฉฐ, ๋ถ๋ณ ๊ฐ ์ง์์ ํตํด ์ํํ ์์ ๊ณต์ ๋ฅผ ๋ง์ ์ ์์ด ๋ค์ค ์ค๋ ๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ๋์ฑ ํธ๋ฆฌํ๊ณ ์ฝ๊ฒ ํ ์ ์๋ค!
- ์ค์ฉ์ฑ, ๊ฐ๊ฒฐ์ฑ, ์์ ์ฑ, ์ํธ์ด์ฉ์ฑ์ด ์ข๋ค. ์ผ๋ฐ์ ์์ ์ ๋ํด ์ด๋ฏธ ์ ์๋ ค์ง ์ค์ฉ์ ์ธ ํด๋ฒ์ ์ฑํํ๊ณ , NPE ๋ฑ์ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ๋ฉฐ ์ฌ๋์ด ์ฝ๊ธฐ ์ฝ๊ณ ๊ฐ๊ฒฐํ ์ฝ๋๋ฅผ ์ง์ํ๋ฉฐ ์๋ฐ์ ์๋ฌด๋ฐ ํธํ ๋ฌธ์ ์์ด ํตํฉ๋ ์ ์๋ ์ธ์ด์ด๋ค!
๋น์ฐํ ์ด ๊ธ์์ ์ด๊ฑฐํ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ฌด์ํ ๋ง์ ์ฅ์ ๋ค์ด ์กด์ฌํ๋ค.
๊ธ์ด ๋ง์ด ๊ธธ์ด์ง๊น๋ด ๋ํ์ ์ธ ํน์ง์ ๋์ดํ์ ๋ฟ์ด๋ค. (ํ๋ฃจ์ข
์ผ๋ ํ ์ ์๋ค)
๊ดํ ํ๋์ ์๋ ์คํ๋ง ๋ถํธ ๊ฐ๋ฐ์๋ค์ด ์ฝํ๋ฆฐ์ ๊ณต๋ถํ๊ณ ์๋ ๊ฒ์ด ์๋๋ค.
๊ดํ ๊ตฌ๊ธ์์ ์๋๋ก์ด๋ ๊ณต์ ๊ฐ๋ฐ ์ธ์ด๋ก ์ฝํ๋ฆฐ์ ์ง๋ชฉํ ๊ฒ์ด ์๋๋ค.
๋ชจ๋ ์ผ์ ํฉ๋ฆฌ์ ์ด์ ๊ฐ ๋ฐ๋ฅด๋ ๋ฒ์ด๋ค.
์ด๋ฏธ ์์ฐจ๋ก ๊ฒ์ฆ์ด ๋ ์ธ์ด๊ณ , ์์ผ๋ก์ ๋ก๋๋งต๋ ์ฐฝ์ฐฝํ๋ค.
ํ์๋ ์๋๋ก์ด๋ ๊ฐ๋ฐ์์ด์ง๋ง ์ฝํ๋ฆฐ์ ์ด๋ค ํ ํ๋ ์์ํฌ์๋ง ๊ตญํํด์ ์ข๋ค๊ณ ์๊ฐ์๋ถํ๋ ๊ฒ์ด ์๋, ์ธ์ด ์ฐจ์์์์ ์ฅ์ , ๊ฐ๋ฐ์๋ก์์ ํธ๋ฆฌํจ์ ๋งค์ฐ ๋ง์ด ๋๊ผ๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ๊ธ์ ์์ฑํ ๊ฒ์ด๋ค.
(๋ค ์ฐ๊ณ ๋๋ ๋ฌด์จ ๊ฑฐ์ ์ ์ฒ์ง ์ ๋ ๊ธ์ผ๋ก ์ ์ด๋จ๋๋ฐ, ์๋ฌดํผ ์ฝํ๋ฆฐ์ ์ต๊ณ ๋ค ใ
ใ
)
์๋ฐ๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋ฌ๋ถ์ด๋ผ๋ฉด, ํ ๋ฒ์ฏค์ ๊ณ ๋ คํด๋ณด์ธ์!
์ฝํ๋ฆฐ์ ๋น์ ์๊ฒ ์์ ํ ์๋ก์ด ๊ฐ๋ฐ ๊ฒฝํ์ ์ ๋ณด์ผ ๊ฒ์ ๋๋ค.
์ฝํ๋ฆฐ์ ์ ์ ์ด ์ ๋ง ๋์น์๋ค์....!!!!! ๊ธ๋ ์ ์ ์ ์ฝํ๊ณ ์ข๋ค์๐
์ฝํ๋ฆฐ ์์ ๊ธ์ ์ง์ง ๋ง์ด ๊ทธ๋ฆฌ๊ท ์ค๋(์๋๋ก์ด๋ํ๋ ๋๋ถํฐ ์คํ๋งํ๋ ์ง๊ธ๊น์ง) ๋ดค๋๋ฐ ์์ ๋ ฅ์ ์ด๊ธ์ด ์ ์ผ ์ข๋ค์.
์๋ฐ ์คํ๋ง ๊ฐ๋ฐ์์ธ๋ฐ ์ฝํ๋ฆฐ ๊ณต๋ถ์ ๊ด์ฌ์ด์์ด์ ๋ณด๊ฒ ๋์์ต๋๋ค. ํน์ ์ฝํ๋ฆฐ์ ๋ฌธ์ ์์ด์ ๋์์ด๋๋ ๊ฐ์๋ ์ ๋ณด๊ฐ ์์๊น์? (๊ธ ์ฝ๊ณ ์์ ๋นํ์ต๋๋ค)
sum() ์์ "fun sum(a: Int, b: Int) = a + b" ์ด๊ฒ ๋ ๋ค์ด๋๋ฏนํ์ง ์์๊น์...? ์ค์ธ ํจ์๋ return ํ์ ์ด void๋ก ๋์ด์์ด์ ์๋ฌ๊ฐ ๋ ์ง๋...
์ธ์ ๊ฐ ๋ฐฐ์ฐ๊ฒ ๋ค ์๊ฐ๋งํ๊ณ ์ค์ฒ์ ๋ฏธ๋ค๋์๋ ํ์์
๋๋ค
์ ๋จธ๋ฌ์คํ๊ณ ๋จธ๋ฆฌ์ ์์๋ฐํ๋ ์ค๋ช
๋๋ถ์ ๋ค์ํ๋ฒ ์ฝํ๋ฆฐ์ ๋ฐฐ์์ผ๊ฒ ๋ค ์๊ฐํ๊ฒ๋๋ค์ ใ
ใ
์ข์๊ธ ๊ฐ์ฌํฉ๋๋ค ๐๐
๊ฐ๊ฒฐ์ฑ์์ ์ค๋ ์ข์ ์ ๋ ์์ง๋ง,
์
๋ฌธ ์ธ์ด๋ก๋ ์ ์ข์ง ์์๊น ์๊ฐํด์!
์ ์ ์ถ์ํ๋๊ณ ์๋ต๋๊ณ ์๋ ์๋์ ์ด๊ณ ์๋ ์ง๊ธ,
์ด๋์ ๋ ๊ธฐ์ด๋ฅผ ๋ฆ์ ๋ค์ ์ฝํ๋ฆฐ์ ์ ํ๋๊ฑด ์ ๋ง ๊ด์ฐฎ๋ค๊ณ ์๊ฐํ์ง๋ง,
๊ธฐ์ด๊ฐ ์๋ ๋น์ ๊ณต์ ์
์ฅ์์ ์๋ ์ ๊ฒ์ด ์๋๊น์! ใ
ใ
๋ํ ์๋ฐ๋ 8๋ถํฐ @Functional Interface ์ NPE ์ ๋ํ Optional ๋ฑ์ ์ ๊ณตํ๊ณ
10๋ถํฐ๋ var ๋ฅผ ์ง์ํฉ๋๋ค.! (์ปดํ์ผ ์์ ์ ํ์
์ด ๊ฒฐ์ ๋จ)
๋๋ฌด ์์ข๊ฒ ๋ฐ๋ผ๋ณด์ง ๋ง์์ฃผ์ธ์ฉ!
์ข์ ๊ธ ์๋ดค์ต๋๋ค! ๐๐
์ ์ ํ ์์ + ์งค ๋๋ถ์ ๊ธ์ด ์ ์ ์ฝํ๋ค์๐ ์ฝํ๋ฆฐ์ ๋ํ ์ ์ ์ด ๋๊ปด์ง๋๋คโผ