์์ ์ ์ทจ๋ฏธ๋ก ์๋๋ก์ด๋ ๊ณต๋ถํด์ ์๋ฐ๋ก ์ดํํ๋ ๋ง๋ค์ด ์ฌ๋ฆฐ ์ ์ด ์์๋ค.
๋๋ฌด ์ ๋ฐ์ดํธ๋ฅผ ์ํด์ ๊ตฌ๊ธ์ ์ฑ ์ ์๋ฐฐ๋์ด ํด๋น ์ดํ์ด ๋ด๋ ค๊ฐ ์์๋๋ฐ ๊ทธ๊ฒ๋ ๋ชจ๋ฅด๊ณ ๋๋๊ณ ์์๋ค.
์ต๊ทผ์ ์์ ํด์ ๋ค์ ์ฌ๋ฆฌ๋ ์์ ์ ํ๋๋ฐ, ์ถ๊ฐ๋ก ๊ฐ๋ฐํ๋ 1์ธ ํ๋ก์ ํธ๋ค์ ์ฝํ๋ฆฐ์ผ๋ก ํด๋ณด๊ณ ์ถ์ ๋ง์์ด ์๊ฒผ๋ค.
์์ง ์๋๋ก์ด๋ ๊ฐ๋ฐ์ ๋ฉ์ธ์ธ์ด๋ ์๋ฐ์ธ ๊ฒ ๊ฐ๊ธด ํ๋ฐ, ์ฝํ๋ฆฐ์ IntelliJ IDE๋ฅผ ๊ฐ๋ฐํ JetBrain์ฌ์์ ์๋ฐ์ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด์ ๊ฐ๋ฐํ ์ธ์ด๋ก ์๋ฐ์ฒ๋ผ JVM์์์ ๋์๊ฐ ์ ์๊ณ , ์๋๋ก์ด๋, ์๋ฐ์คํฌ๋ฆฝํธ์๋ ์ฝ๊ฒ ์ฐ๋ํ ์ ์๊ณ ๋ค์ดํฐ๋ธ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ง๋ค ์๋ ์๋๋ก ๊ฐ๋ฐ๋์๋ค๊ณ ํ๋ค. (๋ ์์ธํ ์ ๋ณด๋ ์ฝํ๋ฆฐ ๊ณต์์ฌ์ดํธ FAQ์์ ํ์ธํ ์ ์๋ค.)
๋๋ ์ฐ์ ์๋ฐ ๊ฐ๋ฐ์์ด๊ธฐ ๋๋ฌธ์ Kotlin/JVM ์ผ๋ก ์ฝํ๋ฆฐ์ ์ฐ์ตํด๋ณด๋ ค ํ๋ค. (Kotlin/JS๋ฅผ ์ด์ฉํ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๊ฐ๋ฐ๋ ๊ฐ๋ฅํ๋ค)
์ฝํ๋ฆฐ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์ด์ Hello World ๋ฅผ ์ถ๋ ฅํ๋ ์์ ๋ ์ฝํ๋ฆฐ ๊ณต์์ฌ์ดํธ์์ ํ์ธํ๊ธฐ ๋ฐ๋๋ค.
๊ทธ ์ฒซ ๋ฒ์งธ ์๊ฐ์ผ๋ก ์ฝํ๋ฆฐ ํ์ผ์ ๊ธฐ๋ณธ ๊ตฌ์กฐ๊ฐ ์ด๋ป๊ฒ ์๊ฒผ๋์ง, ๊ทธ๋ฆฌ๊ณ ๋ณ์ ์ ์๋ ์ด๋ป๊ฒ ํ๋์ง ์๋ฐ์ ์ด๋ป๊ฒ ๋ค๋ฅธ์ง ์ดํด๋ณด์๋ค.
1. ์ฝํ๋ฆฐ ํ์ผ ๊ตฌ์กฐ
- ์ฝํ๋ฆฐ ํ์ผ์ .kt ํ์ฅ์๋ฅผ ๊ฐ๋๋ค.
- ์๋ฐ๋ class ๋ธ๋ญ ๋ด์ main๋ฉ์๋๊ฐ ์กด์ฌํ์ง๋ง ์ฝํ๋ฆฐ์ ๋ฉ์ธํจ์๋ ํด๋์ค ๋ธ๋ญ๋ด์ ์กด์ฌํ๋ ๊ฒ์ด ์๋๋ค.
- package ์ ์ธ๋ถ ๋ฐ import ๋ฌธ์ ์๋ฐ์ ๋์ผํ๋ค.
- ์ฝํ๋ฆฐ์์ ํจ์๋ function์ ์ถ์ฝ์ด์ธ fun ์ผ๋ก ์์ํ๊ณ ๋ฆฌํดํ์ ์ ํจ์๋ช () ๋ค์ชฝ์ ์์นํ๋ค.
- ์ฝํ๋ฆฐ์์๋ statement๋ฅผ ์ธ๋ฏธ์ฝ๋ก ์ผ๋ก ์ข ๋ฃํ์ง ์๋๋ค.
2. ๋ณ์์ ํ์ , ์ ์ ๋ฐ ์ด๊ธฐํ
์ฝํ๋ฆฐ์์ ๋ณ์์ ํ์ ์ ์๋ฐ์ ๊ทธ๊ฒ๊ณผ ๋์ผํ์ง๋ง ์ ์ํ๋ ๋ฐฉ๋ฒ์ด ๋ค๋ฅด๋ค.
๋ฐ์ดํฐ ํ์ ์ ๊ด๊ณ์์ด ์์๋ val, ๋ณ์๋ var๋ก ์ ์ธํ๋ค.
๋ฐ์ดํฐ ํ์ ์ ๋ช ์ํด์ฃผ์ง ์์๋ ํ ๋นํด์ฃผ๋ ๊ฐ์ ๋ฐ๋ผ ์๋์ผ๋ก ๊ฒฐ์ ๋๋ค.
์ฝํ๋ฆฐ์์๋ val์ read-only variable๋ก ์ค๋ช ์ ํ๋ค.
val์ ์๋ฐ์ final๊ณผ ๊ฐ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๊ฐ์ ์ฌํ ๋น ํ๋ คํ ๊ฒฝ์ฐ ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
var ํค์๋๋ก ์ ์ธํ ๋ณ์์ ๊ฒฝ์ฐ ํ์ ์ด ํ๋ฒ ์ ํด์ง๋ฉด ๋ค๋ฅธ ํ์ ์ ํ ๋นํ ์ ์๋ค.
2-1. ๋ณ์ ์ ์
์ฝํ๋ฆฐ์์ ๋ณ์์ ์ ์(define)์ ์๋์ ๊ฐ์ด ํ๋ค. ์ด๊ธฐํ๋ฅผ ํ์ง ์๊ณ ์ ์๋ง ํ ๊ฒฝ์ฐ ํ์ ์ ํ์๋ก ๋ช ์ํด์ค์ผ ํ๋ค.
fun main() {
var i:Int
var s:String
var l:Long
var f:Float
var d:Double
}
2-2. ๋ณ์ ์ด๊ธฐํ
๋ณ์์ ์ด๊ธฐํ๋ ๊ฐ ๋ณ์์ ํ์ ์ ๋ง๋ ๊ฐ์ ํ ๋นํด์ฃผ๋ฉด ๋๋ค.
fun main() {
var i:Int
var s:String
var l:Long
var f:Float
var d:Double
i = 10
s = "string"
l = 10L
f = 10.2F
d = 10.5
var v = "string variable" // String ํ์
๋ณ์
var n = 123 // Int ํ์
๋ณ์
}
3. ํจ์ ์ ์
๋ ๊ฐ์ Intํ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ฌ๋ฐ์ Int ํ์ ์ ๋ฐํํ๋ ํจ์
fun sum(a: Int, b: Int): Int { return a + b}
์ง์ ๊ฐ์ ํ ๋นํด์ฃผ๋ ํจ์ (์ ํจ์์ ๋์ผํ ํจ์์ด๋ค)
fun sum(a: Int, b: Int) = a + b
๋ฆฌํด๊ฐ์ด ์๋ ํจ์๋ Unit (์๋ฐ์ void) ์ผ๋ก ์ ์
fun printSum(a: Int, b: Int): Unit { println("sum of $a and $b is ${a + b}")}
Unit ๋ฆฌํดํ์ ์ ์์จ์ค๋ ๋๋ค.
fun printSum(a: Int, b: Int) { println("sum of $a and $b is ${a + b}")}
4. ์คํธ๋ง ํ ํ๋ฆฟ
var a = 1
// simple name in template:
val s1 = "a is $a"
a = 2
// arbitrary expression in template:
val s2 = "${s1.replace("is", "was")}, but now is $a"
์๋ฐ์์ String ํด๋์ค๊ฐ ๊ฐ๊ณ ์๋ format ๋ฉ์๋์ ์ ์ฌํ ๊ธฐ๋ฅ์ ํ๋ ๊ฒ์ผ๋ก String์ ๋ด์ฉ์ด ๊ฐ๋ณ์ ์ผ ๋ ์ฌ์ฉํ ์ ์๋ค.
5. ์กฐ๊ฑด๋ฌธ
์กฐ๊ฑด๋ฌธ ์ฌ์ฉ๋ฒ์ ์๋ฐ์ ๋ค๋ฅผ๊ฒ ์๋ค.
fun maxOf(a: Int, b: Int): Int {
if (a > b) {
return a
} else {
return b
}
}
ํ์ง๋ง ์ฝํ๋ฆฐ์์๋ if๋ฌธ์ ํ๋์ ํํ์์ผ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค๋ ์ ์ด ๋ค๋ฅด๋ค.
fun maxOf(a: Int, b: Int) = if (a > b) a else b
if๋ฌธ์ ๊ฒฐ๊ณผ๊ฐ์ด maxOfํจ์์ ๋ฆฌํด๊ฐ์ด๋ผ๊ณ ์ ์ํ ๊ฒ์ผ๋ก, ๋ฐ๋ก ์์ maxOfํจ์์ ๋์ผํ ํจ์๋ผ๊ณ ๋ณผ ์ ์๋ค.
6. Null
์ฝํ๋ฆฐ์์ ๋ฐํ๊ฐ์ด nullable์ธ ๊ฒฝ์ฐ ์๋์ ๊ฐ์ด ํํํ ์ ์๋ค.
fun parseInt(str: String): Int? {
// ๋ฆฌํดํ์
์ด ๊ธฐ๋ณธ์ ์ผ๋ก Int์ด๋ null์ผ ์๋ ์๋ ํจ์
}
๊ทธ๋ฆฌ๊ณ ์ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ฅผ ๋ณด๋ฉด.
fun printProduct(arg1: String, arg2: String) {
val x = parseInt(arg1)
val y = parseInt(arg2)
// ์ฌ๊ธฐ์ `x * y` ์ฐ์ฐ์ ๋ฐ๋ก ํด๋ฒ๋ฆฌ๋ฉด x๋๋ y๊ฐ null์ผ ๊ฒฝ์ฐ ์๋ฌ๊ฐ ๋ฐ์ํ ์ ์๋ค.
// ๋ฐ๋ผ์ null ์ฒดํฌ๋ฅผ ๋จผ์ ํด์ผํ๋ค.
if (x != null && y != null) {
// null ์ฒดํฌ๊ฐ ์๋ฃ๋๋ฉด x ์ y ๋ ์๋์ผ๋ก non-nullable๋ก ์บ์คํ
๋๋ค
// (์ฝํ๋ฆฐ ๊ณต์ ๋ฌธ์์ ์ด๋ ๊ฒ ๋์์๋๋ฐ non-nullable๋ก ์บ์คํ
๋๋ค๋ผ๋๊ฒ ์์ง ์ ์ดํด๋ ์๋๋ค. ๊ทธ๋ฐ ํ์
์ด ์๋ค๋๊ฑด์ง..)
println(x * y)
}
else {
println("'$arg1' or '$arg2' is not a number")
}
}
์ด๋ ๊ฒ null ์ฒดํฌ๋ฅผ ํ๊ณ ๋๋ฉด non-nullable๋ก ์บ์คํ ์ด ๋๋ค๊ณ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ ์ผ๋ฐ ํ์ ์์๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค.
7. Type Check and Automatic Casts
fun getStringLength(obj: Any): Int? {
if (obj is String) {
// ์ด ๋ธ๋ญ ๋ด์์ `obj`๋ ์๋์ผ๋ก String ํ์
์ผ๋ก ๋ณํ๋๋ฉฐ String์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ฌ์ฉ์ด ๊ฐ๋ฅ
return obj.length
}
// `obj`๋ ํ์
์ฒดํฌ ๋ธ๋ญ ๋ฐ์์๋ ์ฌ์ ํ ์ด๋ค ํ์
๋ ๋ ์ ์๋ ์ํ์ด๋ค
return null
}
ํ์ ์ฒดํฌ ์ ๋ฐ๋๋ก(not์ ์ด์ฉ) ํ ๊ฒฝ์ฐ
fun getStringLength(obj: Any): Int? {
if (obj !is String) return null
// ์ if๋ฌธ์์ `obj`๊ฐ String์ด ์๋๋ฉด null์ ๋ฆฌํดํ๊ธฐ ๋๋ฌธ์, ์ฌ๊ธฐ๋ก ๋ด๋ ค์๋ค๋ฉด ๋ฌด์กฐ๊ฑด String์ผ ์ ๋ฐ์ ์๋ค.
// ๋ฐ๋ผ์ ์๋์ผ๋ก String ํ์
์ผ๋ก ๋ณํ๋๋ฉฐ, String์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
return obj.length
}
๋๋ ์ด๋ ๊ฒ๋ ์ฌ์ฉ๊ฐ๋ฅํ๋ค.
fun getStringLength(obj: Any): Int? {
// `&&`์ฐ์ฐ์ ์ค๋ฅธ์ชฝ์์๋ obj๊ฐ String์ด๋ผ๋ ๊ฒ์ ํ์ธํ ๋ค์ด๋ฏ๋ก,
// String ์ผ๋ก ์๋ ํ๋ณํ๋์ด String ์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค
if (obj is String && obj.length > 0) {
return obj.length
}
return null
}
8. For-Loop, While-Loop
loop๋ ์ด๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ ๋ค ๋น์ทํ๋ค. ์ฝํ๋ฆฐ์์๋ ์๋ฐ์ foreach๋ฌธ ์ฒ๋ผ for-loop๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
val items = listOf("apple", "banana", "kiwifruit")
for (item in items) {
println(item)
}
์ธ๋ฑ์ค ์ ๋ณด๋ฅผ ์ด์ฉํด์ผ ๊ฒฝ์ฐ ์๋์ฒ๋ผ ์ฌ์ฉ๊ฐ๋ฅํ๋ค.
val items = listOf("apple", "banana", "kiwifruit")
for (index in items.indices) {
println("item at $index is ${items[index]}")
}
while-loop๋ ์๋์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค.
val items = listOf("apple", "banana", "kiwifruit")
var index = 0
while (index < items.size) {
println("item at $index is ${items[index]}")
index++
}
9. when ํํ์
when expression์ ์๋ฐ์ switch-case๋ฌธ๊ณผ ์ ์ฌํ๋ฐ, ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๋ง๊ฒ ๋ณํ์์ผ๋์ ๊ฒ ๊ฐ๋ค
fun describe(obj: Any): String =
when (obj) {
1 -> "One"
"Hello" -> "Greeting"
is Long -> "Long"
!is String -> "Not a string"
else -> "Unknown"
}
10. Range (๋ฒ์)
์๋ฐ์์๋ loop๋ฅผ ๋๋ฆด ๋ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํด์ ์๋์ฒ๋ผ ๋ง์ด ์ฌ์ฉํ๋ค
for (int i = 0; i < x; i++) {
// ...
}
๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ์ฝํ๋ฆฐ์ผ๋ก ์ฎ๊ธฐ๋ฉด ์๋์ ๊ฐ๋ค
for (z in 1..10) {
println(z)
}
๊ทธ๋ผ ๋ง์ฝ ๋งค loop์๋ง๋ค i๊ฐ์ ์ฆ๋ถ์ i++๊ฐ ์๋๋ผ i=i+2 ์ฒ๋ผ ์จ์ผํ๋ค๋ฉด??? ์ด๋ป๊ฒ ์ธ ์ ์์๊น?
for (x in 1..10 step 2) {
// 1๋ถํฐ 10๊น์ง 2์ฉ ์ฆ๊ฐ์ํค๋ฉด์ ์ถ๋ ฅ
// ๊ฒฐ๊ณผ: 1~10 ์ค์์ ํ์ ์ถ๋ ฅ => 13579
print(x)
}
println()
for (x in 9 downTo 0 step 3) {
// ํฐ ์ซ์์์ ์์ ์ซ์๋ก ๋ด๋ ค๊ฐ๋ฉด์ loop๋ฅผ ๋๋ ์ผ์ด์ค์์๋ downTo ํค์๋๋ฅผ ์ฌ์ฉํ๋ค
// ๊ฒฐ๊ณผ: 9๋ถํฐ ์์ํด์ 3์ฉ ๋ด๋ ค๊ฐ๋ฉด์ x๊ฐ 0๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ๋ ๊น์ง ์ซ์ ์ถ๋ ฅ => 9630
print(x)
}
์ด๋ ๊ฒ ๋ค์ step ํค์๋๋ฅผ ์ด์ฉํ์ฌ ์ผ๋ง์ฉ ์ฆ๊ฐ์ํฌ ๊ฒ์ธ์ง๋ฅผ ์จ์ฃผ๋ฉด ๋๋ค.
๋ํ ์ธ๋ฑ์ค๊ฐ ํน์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ฌ๋์ง๋ ์๋์ ๊ฐ์ด ! ์ฐ์ฐ์๋ฅผ in๊ณผ ํจ๊ป ์ฌ์ฉํ์ฌ ํํํ ์ ์๋ค
val list = listOf("a", "b", "c")
if (-1 !in 0..list.lastIndex) {
println("-1 is out of range")
}
if (list.size !in list.indices) {
println("list size is out of valid list indices range, too")
}
referene: ์ฝํ๋ฆฐ ๊ณต์๋ฌธ์ - ๊ธฐ๋ณธ๋ฌธ๋ฒ