#1. ν¨μ
Hello, world!
fun main(args: Array<String>) {
println("Hello, world!")
}
- ν¨μλ₯Ό μ μΈν λ fun ν€μλλ₯Ό μ¬μ©νλ€.
- λ³μλ₯Ό μ μΈν λλ νλΌλ―Έν° μ΄λ¦ λ€μ νμ μ μ΄λ€.
- ν¨μλ₯Ό μ΅μμ μμ€μ μ μν μ μλ€. ν΄λμ€ μμ λ£μ΄μΌ ν νμκ° μλ€.
- λ°°μ΄λ μΌλ°μ μΈ ν΄λμ€μ λ§μ°¬κ°μ§λ€.
- μΈλ―Έμ½λ‘ (;)μ λΆμ΄μ§ μμλ λλ€.
statement(λ¬Έ)κ³Ό expression(μ)μ ꡬλΆ
- μ: κ°μ λ§λ€μ΄λ΄λ©°, λ€λ₯Έ μμ νμμμλ‘ κ³μ°μ μ°Έμ¬ν μ μλ€.
- λ¬Έ: μμ μ λλ¬μΈκ³ μλ κ°μ₯ μμͺ½ λΈλμ μ΅μμ μμλ‘ μ‘΄μ¬νμ¬ μλ¬΄λ° κ°μ λ§λ€μ΄λ΄μ§ μλλ€.
μλ°μμλ λͺ¨λ μ μ΄κ΅¬μ‘°κ° 'λ¬Έ'μΈ λ°λ©΄, μ½νλ¦°μμλ 루νλ₯Ό μ μΈν λλΆλΆμ μ μ΄κ΅¬μ‘°κ° 'μ'μ΄λ€.
μμ΄ λ³Έλ¬ΈμΈ ν¨μ (expression body function)
// λΈλμ΄ λ³Έλ¬ΈμΈ ν¨μ
fun max(a: Int, b: Int): Int {
return if (a > b) a else b
}
// μμ΄ λ³Έλ¬ΈμΈ ν¨μ
fun max(a: Int, b: Int): Int = if (a > b) a else b
// λ°ν νμ
μλ΅λ κ°λ₯νλ€.
fun max(a: Int, b: Int) = if (a > b) a else b
μμ΄ λ³Έλ¬ΈμΈ ν¨μλ λ°ν νμ μ μ μ§ μμλ μ»΄νμΌλ¬κ° ν¨μ λ³Έλ¬Έ μμ λΆμνμ¬ ν¨μ λ°ν νμ μ μ ν΄ μ€λ€.
-> νμ μΆλ‘
#2. λ³μ
val question = "μΆ, μ°μ£Ό, κ·Έλ¦¬κ³ λͺ¨λ κ²μ λν κΆκ·Ήμ μΈ μ§λ¬Έ"
val answer = 42 //Int νμ
μΌλ‘ νμ
μΆλ‘
val yearToCompute = 7.5e6 //Double νμ
μΌλ‘ νμ
μΆλ‘
μ΄κΈ°ν μμ μ¬μ©νμ§ μκ³ λ³μλ₯Ό μ μΈνλ €λ©΄ λ³μ νμ μ λ°λμ λͺ μν΄μΌ νλ€.
val answer: Int answer = 42
λ³κ²½ κ°λ₯ν / λ³κ²½ λΆκ°λ₯ν λ³μ
- val (value): λ³κ²½ λΆκ°λ₯ν μ°Έμ‘°λ₯Ό μ μ₯νλ λ³μ - μλ°μ final λ³μ
- var (variable): λ³κ²½ κ°λ₯ν μ°Έμ‘° - μλ°μ μΌλ° λ³μ
κΈ°λ³Έμ μΌλ‘λ λͺ¨λ λ³μλ₯Ό valλ‘ μ μΈνκ³ , λμ€μ κΌ νμν λμλ§ varλ‘ λ³κ²½νλ κ²μ΄ μ’λ€.
val λ³μλ ν λ²λ§ μ΄κΈ°νλΌμΌ νλ€.
쑰건μ λ°λΌ val κ°μ λ€λ₯Έ μ¬λ¬ κ°μΌλ‘ μ΄κΈ°νν μλ μλ€.
val message: String
if (canPerformOperation()) {
message = "Success"
} else {
message = "Failed"
}
β val μ°Έμ‘° μ체λ λΆλ³μΌμ§λΌλ, κ·Έ μ°Έμ‘°κ° κ°λ¦¬ν€λ κ°μ²΄ λ΄λΆ κ°μ λ³κ²½λ μ μλ€.
val languages = arrayListOf("Java") //λΆλ³ μ°Έμ‘° μ μΈ
language.add("Kotlin") //μ°Έμ‘°κ° κ°λ¦¬ν€λ κ°μ²΄ λ΄λΆ λ³κ²½
var λ³μμ 'κ°'μ λ³κ²½ν μ μμ§λ§ λ³μμ 'νμ 'μ κ³ μ λλ€.
var answer = 42 answer = "no answer" //Error: type mismatch
#3. λ¬Έμμ΄ ν νλ¦Ώ
fun main(args: Array<String>) {
val name = if (args.size > 0) args[0] else "Kotlin"
println("Hello, $name!")
}
=> μλ°μ ("Hello" + name + "!")κ³Ό λμΌν κΈ°λ₯
볡μ‘ν μμ {}λ‘ λλ¬μΈμ λ¬Έμμ΄ ν νλ¦Ώ μμ λ£μ μ μλ€.
fun main(args: Array<String>) {
if (args.size > 0) {
println("Hello, ${args[0]}!")
}
}
#4. νλ‘νΌν°
μλ°μμλ λ°μ΄ν°λ₯Ό νλμ μ μ₯νλ©°, νλμ κ°μμ±μ κΈ°λ³Έ λΉκ³΅κ°(private)μ΄λ€.
λ°μ΄ν°μ μ κ·Όνλ ν΅λ‘λ‘ μΈ μ μλ μ κ·Όμ λ©μλ(λ³΄ν΅ Getter)λ₯Ό μ 곡νκ³ , νλλ₯Ό λ³κ²½ν Setterλ₯Ό μΆκ° μ 곡ν μ μλ€.
μλ°μμλ νλμ μ κ·Όμλ₯Ό λ¬Άμ΄ νλ‘νΌν°λΌκ³ λΆλ₯Έλ€.
μ½νλ¦°μ νλ‘νΌν°λ₯Ό μΈμ΄ κΈ°λ³Έ κΈ°λ₯μΌλ‘ μ 곡νλ©°, μλ°μ νλμ μ κ·Όμ λ©μλλ₯Ό μμ ν λμ νλ€.
νλ‘νΌν° μ μΈμ valμ΄λ varμ μ¬μ©νλ€.
class Person(
val name: String, //μ½κΈ° μ μ©, (λΉκ³΅κ°) νλμ (곡κ°) Getter μμ±λ¨
var isMarried: Boolean //λ³κ²½ κ°λ₯, (λΉκ³΅κ°) νλ / (곡κ°) Getter / (곡κ°) Setter μμ±λ¨
)
μ½νλ¦°μ κ°μ μ μ₯νκΈ° μν λΉκ³΅κ° νλμ κ·Έ νλμ λν Setter, Getterλ‘ μ΄λ€μ§ κ°λ¨ν λν΄νΈ μ κ·Όμ ꡬνμ μ 곡νλ€.
val person = Person("Bob", true) //new ν€μλμμ΄ μμ±μ νΈμΆ
println(person.name) //νλ‘νΌν° μ΄λ¦μ μ§μ μ¬μ©ν΄λ μ½νλ¦°μ΄ μλμΌλ‘ Getterλ₯Ό νΈμΆνλ€.
Backing field (λ·λ°μΉ¨νλ νλ)
: νλ‘νΌν°μ κ°μ μ μ₯νκΈ° μν νλ
νλ‘νΌν°μ κ°μ κ·Έλκ·Έλ κ³μ°νκΈ° μνλ€λ©΄ Custom Getterλ₯Ό μμ±νλ©΄ λλ€.
컀μ€ν μ κ·Όμ
class Rectangle(val height: Int, val width: Int) {
val isSquare: Boolean
get() { //νλ‘νΌν° Getter μ μΈ
return height = width
}
}
-> νλ‘νΌν°μ μ κ·Όν λλ§λ€ Getterκ° νλ‘νΌν°μ κ°μ λ§€λ² λ€μ κ³μ°νλ€.
• νλΌλ―Έν°κ° μλ ν¨μ μ μ vs. 컀μ€ν Getter μ μ
ꡬνμ΄λ μ±λ₯μ λΉμ·, μ°¨μ΄μ μ κ°λ μ±
μΌλ°μ μΌλ‘ ν΄λμ€μ νΉμ±μ μ μνκ³ μΆλ€λ©΄, νλ‘νΌν°λ‘ μ μν΄μΌ νλ€.
#5. enum
μ½νλ¦°μμ enumμ soft keyword -> class μμ μμ λλ₯Ό μ μΈνλ©΄ λ€λ₯Έ μ΄λ¦μ μ°μΌ μ μλ€.
(cf. keyword: λ³μ λ± μ΄λ¦μ μ¬μ© λΆκ°λ₯, μ - class)
enum class Color(
val r: Int, val g: Int, val b: Int
) {
RED(255, 0, 0), ORANGE(255, 165, 0),
YELLOW(255, 255, 0), GREEN(0, 255, 0), BLUE(0, 0, 255),
INDIGO(75, 0, 130), VIOLET(238, 130, 238); //μ¬κΈ°μλ λ°λμ μΈλ―Έμ½λ‘ μ μ¬μ©ν΄μΌ νλ€.
fun rgb() = (r * 256 + g) * 256 + b //λ©μλ μ μ
}
fun getMnemonic(color: Color) =
when (color) {
Color.RED -> "Richard"
Color.ORANGE -> "Of"
Color.YELLOW -> "York"
Color.GREEN -> "Gave"
Color.BLUE -> "Battle"
Color.INDIGO -> "In"
Color.VIOLET -> "Vain"
}
- when : ifμ λ§μ°¬κ°μ§λ‘ whenλ κ°μ λ§λ€μ΄λ΄λ 'μ'μ΄λ€.
- μλ°μ λ¬λ¦¬ κ° λΆκΈ°μ λμ breakλ₯Ό λ£μ§ μμλ λλ€.
- ν λΆκΈ° μμμ μ¬λ¬ κ°μ λ§€μΉ ν¨ν΄μΌλ‘ μ¬μ©ν μλ μλ€. (κ° μ¬μ΄ ',' μ¬μ©)
- μΈμλ‘ μ무 κ°μ²΄λ μ¬ μ μλ€.
- μΈμμμ΄ νΈμΆν μλ μλ€.
#6. μ€λ§νΈ μΊμ€νΈ: νμ κ²μ¬μ νμ μΊμ€νΈλ₯Ό μ‘°ν©
μμ : λ§μ μ°μ μ κ³μ°
- ν¨μ μμ νΈλ¦¬κ΅¬μ‘°λ‘ μ μ₯
- μ΄λ€ μμ΄ μλΌλ©΄ κ·Έ κ°μ λ°ννλ€.
- μ΄λ€ μμ΄ ν©κ³λΌλ©΄ μ’νκ³Ό μ°νμ κ°μ κ³μ°ν λ€μ κ·Έ λ κ°μ ν©ν κ°μ λ°ννλ€.
interface Expr
class Num(val value: Int) : Expr
class Sum(val left: Expr, val right: Expr) : Expr
μ½νλ¦°μμλ isλ₯Ό μ¬μ©ν΄ λ³μ νμ
μ κ²μ¬νλ€.
isλ‘ κ²μ¬νλ©΄ μ»΄νμΌλ¬κ° μΊμ€ν
ν΄μ€λ€. -> μ€λ§νΈ μΊμ€νΈ
- μ€λ§νΈ μΊμ€νΈλ₯Ό μ¬μ©νλ €λ©΄ valμ΄μ΄μΌ νλ€.
- λͺ μμ μΌλ‘ νμ μΊμ€ν νλ €λ©΄ as ν€μλλ₯Ό μ¬μ©νλ€.
if μ¬μ©
fun eval(e: Expr): Int =
if (e is Num) {
e.value //if λΆκΈ°μ λΈλμ μ¬μ©νλ κ²½μ°, κ·Έ λΈλμ λ§μ§λ§ μμ΄ κ·Έ λΆκΈ°μ κ²°κ³Ό κ°μ΄λ€.
} else if (e is Sum) {
eval(e.right) + eval(e.left)
} else {
throw IllegalArgumentException("Unknown expression")
}
if λμ when μ¬μ©
fun eval(e: Expr): Int =
when (e) {
is Num -> e.value
is Sum -> eval(e.right) + eval(e.left)
else -> throw IllegalArgumentException("Unknown expression")
}
- λΈλμ λ§μ§λ§ μμ΄ λΈλμ κ²°κ³Ό κ·μΉ
- ν¨μμ λν΄μλ μ±λ¦½νμ§ μλλ€.
- μμ΄ λ³Έλ¬ΈμΈ ν¨μλ λΈλμ λ³Έλ¬ΈμΌλ‘ κ°μ§ μ μκ³ , λΈλμ΄ λ³Έλ¬ΈμΈ ν¨μλ λ΄λΆμ returnλ¬Έμ΄ λ°λμ μμ΄μΌ νλ€.
#7. μ΄ν°λ μ΄μ
while 루ν
while, do-while -> μλ°μ κ°λ€.
while (쑰건) {
...
}
do {
...
} while (쑰건)
μμ λν μ΄ν°λ μ΄μ
- λ²μ (range): λ κ°μΌλ‘ μ΄λ£¨μ΄μ§ ꡬκ°
- .. μ°μ°μλ‘ μμ κ°κ³Ό λ κ°μ μ°κ²°ν΄μ λ²μλ₯Ό λ§λ λ€. (νꡬκ°)
- λ¬Έμ νμ μ κ°μλ μ μ©ν μ μλ€.
val oneToTen = 1..10
for (i in 100 downTo 1 step 2) { //100λΆν° 1κΉμ§ 2μ© μ€μ¬κ°λ©° λ°λ³΅
...
}
λ κ°μ ν¬ν¨νμ§ μλ λ²μ -> until μ¬μ©
(x in until size)
//equals
(x in 0..size-1)
맡μ λν μ΄ν°λ μ΄μ
val binaryReps = TreeMap<Char, String>()
for (c in 'A'..'F') {
val binary = Integer.toBinaryString(c.toInt())
binaryReps[c] = binary
}
for ((letter, binary) in binaryReps) { //맡μ ν€μ κ°μ λ λ³μμ κ°κ° λμ
νλ€. - ꡬ쑰 λΆν΄ ꡬ문
println("$letter = $binary")
}
inμΌλ‘ 컬λ μ μ΄λ λ²μμ μμ κ²μ¬
- in: μ΄λ€ κ°μ΄ λ²μμ μνλμ§ κ²μ¬
- !in: λ²μμ μνμ§ μλμ§ κ²μ¬
#8. μ½νλ¦°μ μμΈ μ²λ¦¬
fun readNumber(reader: BufferedReader): Int? { //throws λͺ
μν νμκ° μλ€.
try {
val line = reader.readLine()
return Integer.parseInt(line)
}
catch (e: NumberFormatException) {
return null
}
finally {
reader.close()
}
}
μ½νλ¦°μ μ²΄ν¬ μμΈμ μΈμ²΄ν¬ μμΈλ₯Ό ꡬλ³νμ§ μλλ€.
tryλ 'μ'μ΄λ―λ‘, try κ°μ λ³μμ λμ
ν μ μλ€. λ§μ§λ§ μμ κ°μ΄ μ 체 κ²°κ³Ό κ°μ΄λ€.
ifμ λ¬λ¦¬ tryλ νμ {}λ‘ κ°μΈμΌ νλ€.
'κ°λ° > Kotlin' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Kotlin In Action] 5. λλ€λ‘ νλ‘κ·Έλλ° (1) | 2021.05.29 |
---|---|
[Kotlin In Action] 4. ν΄λμ€, κ°μ²΄, μΈν°νμ΄μ€ (0) | 2021.05.19 |
[Kotlin In Action] 3. ν¨μ μ μμ νΈμΆ (0) | 2021.05.10 |
[Kotlin In Action] 1. μ½νλ¦°μ΄λ 무μμ΄λ©°, μ νμνκ°? (0) | 2021.05.09 |
Kotlin constructor μ 리 (0) | 2021.04.08 |