โ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ๊ฐ์ด๋ ๋ชฉ๋ก์ผ๋ก ๋์๊ฐ๊ธฐ
๐ช Kotlin ์์ธ ๊ฐ์ด๋ โ
"์๋๋ก์ด๋ ์ฑ ๊ฐ๋ฐ์ ์ ๋ นํ๊ณ Java ์ํ๊ณ๋ฅผ ๋์ฑ ๊ฐ๊ฒฐํ๊ณ ์์ ํ๊ฒ ์ฌ์ ์ํ ๋ชจ๋ ํด๊ฒฐ์ฌ"
๐ก 1. 30๋ ์ฐจ ์ ๋ฐฐ์ ์ฌ์ด ์ค๋ช โ
์๋๋ก์ด๋ ์ค๋งํธํฐ ์ฑ์ ๋ง๋ค ๋ ๊ณผ๊ฑฐ์๋ ๋ฌด์กฐ๊ฑด ์๋ฐ(Java)๋ฅผ ์ผ์ต๋๋ค. ํ์ง๋ง ์๋ฐ๋ ๋ฌธ๋ฒ์ด ๋๋ฌด ๊ธธ๊ณ , ์ฌ์ํ ์ค์๋ก NullPointerException (์๋ฌด๊ฒ๋ ์๋ ์ฃผ์๋ฅผ ์ฐธ์กฐํ์ฌ ์ฑ์ด ํ๊ธฐ๋ ํ์)์ ์ผ์ผ์ผ ์
๋ช
์ด ๋์์ต๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊ฐ๋ฐ์ฉ ๋๊ตฌ ์ ์ ์ ๋ฌธ ๊ธฐ์
์ธ JetBrains๊ฐ ๋ง๋ค๊ณ , ๊ตฌ๊ธ์ด ๊ณต์ ํํธ๋๋ก ์ธ์ ํ ์ธ์ด๊ฐ ๋ฐ๋ก Kotlin(์ฝํ๋ฆฐ) ์
๋๋ค. ์ฝํ๋ฆฐ์ ์๋ฐ์ ๋ฑ๋ฑํ๊ณ ๋ฌด๊ฑฐ์ด ์ท์ ๋ฒ๊ฒจ๋ด์ด ๋ฌธ๋ฒ์ ๊ทน๋๋ก ์์ถํ๊ณ , ๊ธฐ๋ณธ์ ์ผ๋ก Null์ ์ ๋ ํ์ฉํ์ง ์๋ ์์ ๋ง์ ๊ธฐ๋ณธ์ผ๋ก ์ธํ
ํ์ต๋๋ค. ๋๋ถ์ ์ฝํ๋ฆฐ์ผ๋ก ์ฑ์ ๊ฐ๋ฐํ๋ฉด ์ฝ๋ ๋ผ์ธ ์๊ฐ ์ ๋ฐ์ผ๋ก ์ค์ด๋ค๊ณ ์ฑ์ด ์ฃฝ๋(Crash) ํ๋ฅ ์ด ๋น์ฝ์ ์ผ๋ก ๋ฎ์์ง๋๋ค.
- ๋น์ ํ์๋ฉด: ์ค๋ซ๋์ ์์ ํ์ง๋ง ๋ฌด๊ฒ๊ณ ๋๋ฆฐ ๋คํํธ๋ญ(Java)์ ์ด์ ํ๋ ๊ธฐ์ฌ์๊ฒ, ๋๊ฐ์ด ํผํผํ๋ฉด์๋ ๋น ๋ฅด๊ณ ์กฐ์์ด ์ฌ์ด ์ต์ ํ SUV(Kotlin)๋ฅผ ์ฅ์ด์ค ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
๐ ๏ธ 2. ์ด๋์ ์ฃผ๋ก ์ฐ์ด๋์? โ
- ์๋๋ก์ด๋(Android) ์ฑ ๊ฐ๋ฐ: ๊ตฌ๊ธ์ด ๊ณต์ ์ธ์ ํ ํ์ค ์ธ์ด๋ก, ๋ชจ๋ฐ์ผ ํ๋ฉด์ ๊ตฌ์ฑํ๋ Jetpack Compose์ ๊ฒฐํฉํด ๋ฉ์ธ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
- ๋ชจ๋ ์๋ฐ ๋ฐฑ์๋ ๋์ฒด: ์๋ฐ์ 100% ํธํ๋๋ฏ๋ก, ๊ธฐ์กด ์๋ฐ Spring Boot ๋ฐฑ์๋ ํ๋ก์ ํธ์ ์๋ฐ ๋์ ๋์ ํ์ฌ ์์ ํ๊ณ ์ธ๋ จ๋ ์๋ฒ๋ฅผ ๊ตฌ์ถํฉ๋๋ค.
โ๏ธ 3. ์ฅ์ ๊ณผ ๋จ์ (์ ๋ฐฐ์ ์์ง ํ๋ง๋) โ
- ์ฅ์ (์๋ฐ์ ์๋ฒฝํ ์์ ํธํ):
- ์๋ฐ์์ 100% ๊ณต์กด: ๊ธฐ์กด์ ์ฐ๋ ์๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์๋ฐ ํ์ผ๋ค์ ์๋ฌด๋ฐ ํธํ ๋ฌธ์ ์์ด ๊ทธ๋๋ก ์์ด์ ์ธ ์ ์์ต๋๋ค.
- ๋ ์์ ์ฑ(Null Safety): ์ปดํ์ผ ํ์์ Null ๊ฐ๋ฅ์ฑ์ ๊ฐ๊ฒฉํ๊ฒ ๊ฒ์ฆํ์ฌ ๋ชจ๋ฐ์ผ ์ฑ์ ํ๊น ์ฌ๊ณ ๋ฅผ ์ฐจ๋จํฉ๋๋ค.
- ๋จ์ (์ปดํ์ผ ์ฒด๊ฐ):
- ์ด๊ธฐ ๋น๋ ์๋: ์๋ฐ ์ปดํ์ผ ์๋์ ๋นํ๋ฉด ์ฒซ ๋น๋ ์๊ฐ์ด ์ด์ง ๋ ์์๋๋ ๊ฒฝํฅ์ด ์์ต๋๋ค.
๐ 4. ์ด๋ณด์๋ฅผ ์ํ ์ฒซ๊ฑธ์ ์ฝ๋ โ
์ฝํ๋ฆฐ์ ํต์ฌ์ ์ธ ๋ ์์ ์ฑ(Null Safety) ๋ฌธ๋ฒ ์์์ ๋๋ค.
fun main() {
// 1. ๊ธฐ๋ณธ ์ ์ธ์ Null์ ์ ๋ ๊ฐ์ง ์ ์์ต๋๋ค.
var normalName: String = "Kotlin Senior"
// normalName = null // โ ์ปดํ์ผ ์๋ฌ ๋ฐ์! (Null ๋์
์ฐจ๋จ)
// 2. ํ์
๋ค์ ๋ฌผ์ํ(?)๋ฅผ ๋ถ์ฌ์ผ๋ง Null์ ๊ฐ์ง ์ ์๊ฒ ๋ฉ๋๋ค.
var nullableName: String? = null
// 3. Null์ผ ์๋ ์๋ ๋ณ์๋ฅผ ๋ค๋ฃฐ ๋๋ ์์ ํธ์ถ ๊ธฐํธ(?.)๋ฅผ ์๋๋ค.
println(nullableName?.length) // Null์ด๋ฉด ์ค๋ฅ๋ฅผ ๋ฑ๋ ๋์ null ๋ฌธ์์ด์ ๋ฆฌํด
// 4. ์๋น์ค ์ฐ์ฐ์(?:)๋ก Null์ผ ๋์ ๊ธฐ๋ณธ๊ฐ ์ง์ ๋ ๊ฐ๋ฅํฉ๋๋ค.
val nameLength = nullableName?.length ?: 0
println("์ด๋ฆ ๊ธธ์ด: $nameLength")
}๐ฏ 5. ์ด๋ณด์ ์ถ์ฒ ๊ณต๋ถ ๋ฐฉํฅ โ
- ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ฐ(Java) ์ธ์ด๊ฐ ์ด๋ค ๊ตฌ์กฐ๋ก ์๊ฒผ๋์ง ๊ฐ๋ณ๊ฒ ๋น๊ตํด ๋ณด๋ฉด์ ํ์ตํ๋ฉด ์ฝํ๋ฆฐ์ด ์ ๊ณตํ๋ ๋ฌธ๋ฒ์ ํธ์์ฑ(Lombok ๋ถํ์, Getter/Setter ์๋ ๋ฑ)์ ํจ์ฌ ์ ์ฒด๋ํ ์ ์์ต๋๋ค.
- ์ฝ๋ฃจํด(Coroutine) ์ด๋ผ๋ ๊ฐ๋ฒผ์ด ๋น๋๊ธฐ ๋น์ฆ๋์ค ๋ก์ง์ ์ตํ๋๋ฉด, ๋คํธ์ํฌ ํต์ ๊ณผ ๋ฐ์ดํฐ ๋ก๋๋ฅผ ๋์์ ์ฒ๋ฆฌํ๋ ์ค๋ฌด ์๋๋ก์ด๋ ์ฑ ๊ฐ๋ฐ์ ์ฝ์ด ๊ธฐ์ ์ ์ตํ ์ ์์ต๋๋ค.
- ๊ตฌ๊ธ ๊ณต์ ๊ฐ๋ฐ์ ์น์ฌ์ดํธ์ ์ฝํ๋ฆฐ ์ฝ๋ ๋ฉ ๊ณผ์ (Android Basics in Kotlin)์ ๋ฌด๋ฃ๋ก ๋ฐ๋ผ๊ฐ๋ฉฐ ์ค์ตํ๋ ๊ฒ์ ๊ถํด ๋๋ฆฝ๋๋ค.