1๏ธโฃ ๋ณ์์ ์์ ์ ์ธ - val, var
- `val` : Value - ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ(immutable) ๋ณ์๋ก, ํ ๋ฒ ๊ฐ์ ํ ๋นํ๋ฉด ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์ฃผ๋ก ์์๋ฅผ ์ ์ธํ ๋ ์ฌ์ฉํ๋ฉฐ, ์๋ฐ์์ `final` ํค์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋น์ทํฉ๋๋ค.
- `var` : Variable - ๋ณ๊ฒฝ ๊ฐ๋ฅํ(mutable) ๋ณ์. ๊ฐ์ ๋์ค์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
val name = "ํ๊ธธ๋" // ์์, ๋ณ๊ฒฝ ๋ถ๊ฐ
var age = 25 // ๋ณ์, ๋ณ๊ฒฝ ๊ฐ๋ฅโจ
age = 30 // ๊ฐ๋ฅ
2๏ธโฃ ๋ฐ์ดํฐ ํ์ - Int, Double, Boolean, String, Char
์ฝํ๋ฆฐ์ ํ์ ์ ์๋์ผ๋ก ์ถ๋ก ํ ์ ์์ง๋ง, ํ์ํ ๊ฒฝ์ฐ ๋ช ์์ ์ผ๋ก ์ง์ ํ ์๋ ์์ต๋๋ค. ์ด๋ ๋ณ์๋ ํจ์ ์ด๋ฆ ๋ค์ ์ฝ๋ก (:)์ด ์ค๊ณ , ๊ทธ ๋ค์ ํ์ ์ ๋ช ์ํ์ฌ ๋ฐ์ดํฐ ํ์ ์ ์ ํํ๊ฒ ์ง์ ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ฝ๋์ ๊ฐ๋ ์ฑ์ ๋์ด๊ณ , ํ์ ๊ด๋ฆฌ๊ฐ ์ฉ์ดํด์ง๋๋ค. ๋ช ์์ ์ธ ํ์ ์ ์ธ์ ์๋์น ์์ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ๋ ๋์์ด ๋ฉ๋๋ค. ๋ฐ๋ฉด, ์๋ฐ์์๋ ๋ชจ๋ ๋ณ์์ ํจ์์ ํ์ ์ ๋ช ์์ ์ผ๋ก ์ ์ธํด์ผ ํ๋ฏ๋ก ์ฝํ๋ฆฐ๋ณด๋ค ๋ ๋ง์ ํ์ ์ ์ธ์ด ํ์ํฉ๋๋ค.
- ๊ธฐ๋ณธ ํ์ : `Int`, `Long`, `Float`, `Double`, `Boolean`, `String`
// ๊ธฐ๋ณธ ๋ฐ์ดํฐ ํ์
์ ์ธ ์์
val name: String = "ํ๊ธธ๋" // name์ String ํ์
โจ์ด๋ฉฐ, "ํ๊ธธ๋"์ด๋ผ๋ ๋ฌธ์์ด์ด ํ ๋น๋จ.
val age: Int = 25 // age๋ Int ํ์
์ผ๋ก 25๋ผ๋ ์ ์ ๊ฐ์ด ํ ๋น๋จ.
val isStudent: Boolean = true // isStudent๋ Boolean ํ์
์ผ๋ก true ๊ฐ์ด ํ ๋น๋จ.
// ์ฝํ๋ฆฐ์ ํ์
์ ์๋์ผ๋ก ์ถ๋ก ํ๊ธฐ ๋๋ฌธ์ ์๋์ฒ๋ผ ํ์
์ ์๋ตํ ์๋ ์์.
val inferredName = "ํ๊ธธ๋" // ํ์
์ ๋ช
์ํ์ง ์์๋, ์ปดํ์ผ๋ฌ๊ฐ ์๋์ผ๋ก String ํ์
์ผ๋ก ์ถ๋ก ํจ.
val inferredAge = 25 // ์ปดํ์ผ๋ฌ๊ฐ Int ํ์
์ผ๋ก ์ถ๋ก ํจ.
val inferredIsStudent = true // Boolean ํ์
์ผ๋ก ์ถ๋ก ๋จ.
โ ํ์ ์บ์คํ (as ํค์๋)
์ฝํ๋ฆฐ์์ `as` ํค์๋๋ ๋ช ์์ ํ์ ์บ์คํ ์ ์ฌ์ฉ๋ฉ๋๋ค. ๊ฐ์ฒด๋ฅผ ๋ค๋ฅธ ํ์ ์ผ๋ก ๋ณํํ ๋ ์ฌ์ฉํ๋ฉฐ, ๋ณํ์ด ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ ClassCastException์ด ๋ฐ์ํฉ๋๋ค.
val view = findViewById(R.id.someView) // findViewById ๋ฉ์๋๋ View ํ์
์ ๋ฐํ.
val textView = view as TextView // 'as' ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ View ํ์
์ TextView๋ก ๋ณํโจ
// ์์ ํ ํ์
์บ์คํ
(as?) ์์
val safeTextView = view as? TextView // ๋ณํ์ด ์คํจํ๋ฉด null์ ๋ฐํํ์ฌ ์์ธ๋ฅผ ๋ฐฉ์งํจ.
3๏ธโฃ ์กฐ๊ฑด๋ฌธ - if, when
- `if-else` : ํํ์์ผ๋ก ๊ฐ์ ๋ฐํํ ์ ์์ด, ์๋ฐ์ ์ผํญ ์ฐ์ฐ์ ์์ด๋ ํ ์ค๋ก ์กฐ๊ฑด ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
fun maxOf(a: Int, b: Int): Int {
return if (a > b) a else b // ์ผํญ ์ฐ์ฐ์ ๋์ ์ฌ์ฉ
}
- `when` : ํํ์์ผ๋ก ์ฌ์ฉํ ์ ์๊ณ , ๋จ์ ๊ฐ ๋น๊ต๋ฟ๋ง ์๋๋ผ ๋ฒ์, ์กฐ๊ฑด์, ํ์ ๊น์ง ์ฒ๋ฆฌํ ์ ์์ด, ์๋ฐ์ `switch`๋ณด๋ค ๋ ๊ฐ๋ ฅํ๊ณ ์ ์ฐํ ์กฐ๊ฑด ์ฒ๋ฆฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
val x = 1
when (x) {
1 -> println("x๋ 1")
2 -> println("x๋ 2")
else -> println("x๋ 1๋ 2๋ ์๋")
}
// ์ฌ๋ฌ ๊ฐ ๋น๊ต ๋ฐ ์กฐ๊ฑด์ ์ฌ์ฉ ๊ฐ๋ฅ
val result = when (x) {
in 1..10 -> "x๋ 1๊ณผ 10 ์ฌ์ด"
else -> "x๋ ๋ฒ์๋ฅผ ๋ฒ์ด๋จ"
}
4๏ธโฃ ๋ฐ๋ณต๋ฌธ - for, while
- `for`: ๋ฒ์(..), until, step์ ํ์ฉํด ๋ฐ๋ณต ํ์๋ฅผ ์ ์ฐํ๊ฒ ์ ์ดํ ์ ์์ด ์๋ฐ๋ณด๋ค ๊ฐ๊ฒฐํฉ๋๋ค.
for (fruit in fruits) {
println(fruit)
}
for (i in 1..5) {
println(i)
}
// step, until ์ฌ์ฉ ์์
for (i in 1 until 5 step 2) {
println(i) // 1, 3 ์ถ๋ ฅ
}
- `while`: ์๋ฐ์ ๋์ผํ๊ฒ ๋์ํ๋ฉฐ, ์กฐ๊ฑด์ด ์ฐธ์ผ ๋ ๋ฐ๋ณต ์คํํฉ๋๋ค.
var i = 0
while (i < 5) {
println(i)
i++
}
5๏ธโฃ ํจ์ ์ ์ธ - fun
์ฝํ๋ฆฐ์์ ํจ์๋ `fun` ํค์๋๋ฅผ ์ฌ์ฉํด ์ ์ธํฉ๋๋ค. ํจ์๋ ๋งค๊ฐ๋ณ์์ ๋ฐํ ํ์ ์ ํจ๊ป ์ ์ํ ์ ์์ผ๋ฉฐ, ๊ฐ๊ฒฐํ ํํ์์ผ๋ก๋ ์์ฑ์ด ๊ฐ๋ฅํฉ๋๋ค. ์๋ฐ์์๋ `function` ํค์๋๊ฐ ์๊ณ , ๋์ ๋ฐํ ํ์ ์ ๋จผ์ ๋ช ์ํ ํ ๋ฉ์๋๋ฅผ ์ ์ธํฉ๋๋ค.
// ๊ธฐ๋ณธ ๋ฌธ๋ฒ
fun ํจ์๋ช
(๋งค๊ฐ๋ณ์1: ํ์
, ๋งค๊ฐ๋ณ์2: ํ์
): ๋ฐํํ์
{
// ํจ์ ๋ณธ๋ฌธ
return ๊ฐ
}
// ๋ฐํ ํ์
์ด Unit์ธ ํจ์๋ ๋ฐํ๊ฐ์ด ์์ผ๋ฉฐ, Unit์ ์๋ตํ ์ ์์.โจ
fun sayHello() {
println("Hello!")
}
// Unit ๋ฐํ ํ์
์ ๋ช
์์ ์ผ๋ก ์์ฑํ ๊ฒฝ์ฐ (ํ์ง๋ง ์๋ตํด๋ ๋ฌด๋ฐฉ)
fun sayHello(): Unit {
println("Hello!")
}
// ๋ ์ ์๋ฅผ ๋ํ ๊ฐ์ ๋ฐํํ๋ ํจ์. ๋ฐํ ํ์
์ Int.โจ
fun add(a: Int, b: Int): Int {
return a + b
}
// ๋จ์ผ ํํ์ ํจ์ : ์ค๊ดํธ์ return์ ์๋ตํ๊ณ =์ ์ฌ์ฉํด ๊ฐ๊ฒฐํ๊ฒ ์์ฑ ๊ฐ๋ฅ.โจ
fun addSimple(a: Int, b: Int): Int = a + b
// ๊ธฐ๋ณธ๊ฐ ๋งค๊ฐ๋ณ์ : ๋งค๊ฐ๋ณ์์ ๊ธฐ๋ณธ๊ฐ์ ์ค์ ํ์ฌ ํธ์ถ ์ ์๋ต ๊ฐ๋ฅ.
fun greet(name: String = "ํ๊ธธ๋") {
println("Hello, $name!")
}
// ์ด๋ฆ ์๋ ์ธ์ : ํจ์ ํธ์ถ ์ ๋งค๊ฐ๋ณ์ ์ด๋ฆ์ ์ง์ ํด ์์ ์๊ด์์ด ํธ์ถ ๊ฐ๋ฅ.
fun displayInfo(name: String, age: Int) {
println("์ด๋ฆ: $name, ๋์ด: $age")
}
fun main() {
displayInfo(age = 25, name = "ํ๊ธธ๋") // ์ถ๋ ฅ: ์ด๋ฆ: ํ๊ธธ๋, ๋์ด: 25โจ
}
6๏ธโฃ ๋ ์์ ์ฑ(Null Safety) - ?, ?., ?:
์ฝํ๋ฆฐ์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ณ์์ null ๊ฐ์ ํ์ฉํ์ง ์์ผ๋ฉฐ, null์ ๊ฐ์ง ์ ์๋ ๋ณ์๋ nullable ํ์ ์ผ๋ก ์ ์ธํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ํด ๋ณ์ ๋ค์ `?`๋ฅผ ๋ถ์ฌ ํด๋น ๋ณ์๊ฐ null์ ๊ฐ์ง ์ ์๋๋ก ํ์ํฉ๋๋ค. ์ฆ, `?`๋ฅผ ์ฌ์ฉํ์ฌ ์ฝํ๋ฆฐ์ null ์์ ์ฑ์ ๋ณด์ฅํฉ๋๋ค. ์๋ฐ์์๋ ๋ณ๋์ ์ฒ๋ฆฌ ์์ด null์ ํ์ฉํ๋ฉฐ, ์ด๋ก ์ธํด ๋ฐ์ํ๋ NullPointerException์ ์๋์ผ๋ก ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
var name: String? = null // name์ null์ ๊ฐ์ง ์ ์์โจ
- ์์ ํ ํธ์ถ ์ฐ์ฐ์ `?.` : null์ผ ์ ์๋ ๋ณ์๋ฅผ ์์ ํ๊ฒ ํธ์ถํฉ๋๋ค.
val length = name?.length // name์ด null์ด๋ฉด null ๋ฐํ
- ์๋น์ค ์ฐ์ฐ์ `?:` : null์ผ ๊ฒฝ์ฐ ๋์ฒด๊ฐ์ ๋ฐํํฉ๋๋ค.
val length = name?.length ?: 0 // name์ด null์ด๋ฉด 0 ๋ฐํ
* ๋กํฐ๋กค์ ํฉ์ ๋ผ๊ณ ๋ถ๋ ธ๋ ๊ฐ์ ์๋น์ค์ ํค์ด์คํ์ผ์ ๋ฎ์๋ค๊ณ ํ์ฌ ์ด๋ฆ์ด ๋ถ์ฌ์ก๋ค.
7๏ธโฃ ์ปฌ๋ ์ - List, Set, Map
- `List` : ์์๊ฐ ์๋ ๋ฐ์ดํฐ์ ๋ชจ์์ ๋๋ค.
val fruits = listOf("Apple", "Banana", "Cherry") // ์ฝ๊ธฐ ์ ์ฉ
val mutableFruits = mutableListOf("Apple", "Banana") // ์์ ๊ฐ๋ฅ
- Set` : ์ค๋ณต๋์ง ์๋ ๋ฐ์ดํฐ์ ๋ชจ์์ ๋๋ค.
val uniqueNumbers = setOf(1, 2, 3, 3) // ์ค๋ณต๋ 3์ ๋ฌด์
- `Map` : ํค-๊ฐ ์์ผ๋ก ์ด๋ฃจ์ด์ง ๋ฐ์ดํฐ์ ๋๋ค.
val scores = mapOf("Math" to 90, "English" to 85)
8๏ธโฃ ๋๋ค ํํ์
์ฝํ๋ฆฐ์ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ง์ํ๋ฉฐ, ์ด๋ฅผ ํตํด ์ฝ๋๋ฅผ ๋์ฑ ๊ฐ๊ฒฐํ๊ณ ์ง๊ด์ ์ผ๋ก ์์ฑํ ์ ์์ต๋๋ค. ๋๋ค์์ ์ต๋ช ํจ์๋ก, ๋งค๊ฐ๋ณ์์ ํจ๊ป ์งง์ ์ฝ๋๋ก ํํํ ์ ์์ด ๊ฐ๋ ์ฑ์ด ๋ฐ์ด๋ฉ๋๋ค. ์๋ฐ๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ง์ํ์ง๋ง, ์ฝํ๋ฆฐ์ ๋๋ค์๊ณผ ๊ณ ์ฐจ ํจ์ ๋ฑ์ ์ฌ์ฉ์ด ๋ ๊ฐ๊ฒฐํ๊ณ ์ ์ฐํฉ๋๋ค.
val sum = { a: Int, b: Int -> a + b } // ๋ ๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ์ ๋ํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ๋๋ค์
println(sum(3, 4)) // ๊ฒฐ๊ณผ: 7
๋ํ, ์ปฌ๋ ์ ๊ณผ ํจ๊ป ๋๋ค์์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
val numbers = listOf(1, 2, 3, 4)
val doubled = numbers.map { it * 2 } // ๊ฐ ์์๋ฅผ 2๋ฐฐ๋ก ๋ง๋ ๋ฆฌ์คํธ ๋ฐํ
println(doubled) // ๊ฒฐ๊ณผ: [2, 4, 6, 8]
9๏ธโฃ ํด๋์ค์ ๊ฐ์ฒด
์ฝํ๋ฆฐ์์ ํด๋์ค๋ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๊ธฐ๋ณธ ๋จ์์ ๋๋ค. ํด๋์ค๋ ์์ฑ๊ณผ ๋ฉ์๋๋ฅผ ์ ์ํ์ฌ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๋์์ ๊ตฌ์ฑํฉ๋๋ค. ์๋ฐ์ ์ ์ฌํ์ง๋ง, ์ฝํ๋ฆฐ์ `data class`, `sealed class` ๋ฑ ๋ ๊ฐ๊ฒฐํ๊ณ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
class Person(val name: String, var age: Int)
val person = Person("ํ๊ธธ๋", 25)
println(person.name) // ๊ฒฐ๊ณผ: ํ๊ธธ๋
- ๊ธฐ๋ณธ ์์ฑ์ : ํด๋์ค ์ ์ ์ ์์ฑ์๋ฅผ ๋ฐ๋ก ์ ์ธํ ์ ์์ต๋๋ค.
class Person(val name: String, val age: Int)
๐ ๋ฐ์ดํฐ ํด๋์ค (data class)
์ฝํ๋ฆฐ์ ๊ฐ๋จํ ๋ฐ์ดํฐ ์ ์ฅ์ฉ ํด๋์ค๋ฅผ ์ฝ๊ฒ ๋ง๋ค ์ ์๋ ๋ฐ์ดํฐ ํด๋์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ์ดํฐ ํด๋์ค๋ ์๋์ผ๋ก `toString()`, `equals()` ๊ฐ์ ๋ฉ์๋๋ฅผ ์์ฑํด ์ค๋๋ค. ์๋ฐ์์ ์ฃผ๋ก DTO(Data Transfer Object)๋ VO(Value Object) ๊ฐ์ ํด๋์ค์ ํ์ฉ๋๋ฉฐ, ์ด์ ์ ์ฌํ ์ญํ ์ ํฉ๋๋ค. ์๋ฐ์์๋ ์ด๋ฌํ ๋ฉ์๋๋ฅผ ์๋์ผ๋ก ์์ฑํด์ผ ํ์ง๋ง, ์ฝํ๋ฆฐ์์๋ ๋ฐ์ดํฐ ํด๋์ค๋ฅผ ์ฌ์ฉํด ๋์ฑ ๊ฐ๊ฒฐํ๊ณ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
data class User(val name: String, val age: Int)
val user = User("ํ๊ธธ๋", 25)
println(user) // ๊ฒฐ๊ณผ: User(name=ํ๊ธธ๋, age=25)
๐ก ์์ฝ
- ๋ณ์์ ์์: val(์์), var(๋ณ์)
- ํจ์ ์ ์ธ: fun
- ์กฐ๊ฑด๋ฌธ: if, when
- null ์์ ์ฑ: ?, ?:
- ์ปฌ๋ ์ : List, Set, Map
- ๋ฐ๋ณต๋ฌธ: for, while
- ๋๋ค์: ์ต๋ช ํจ์
- ํด๋์ค์ ๊ฐ์ฒด: ํด๋์ค ์ ์ธ ๋ฐ ๊ฐ์ฒด ์์ฑ
- ๋ฐ์ดํฐ ํด๋์ค: ๊ฐ๋จํ ๋ฐ์ดํฐ ์ ์ฅ ํด๋์ค