Jetpack Composeλ₯Ό νμ©ν μλλ‘μ΄λ μ ν리μΌμ΄μ κ°λ°μ μμν λ, μ½νλ¦°μ μΈλ ¨λ λ¬Έλ²μ λ¨Όμ μ 리νκ³ λ€μ΄κ°λ©΄ λμμ΄ λ©λλ€. νΉν λ€λ₯Έ μΈμ΄μ μ°¨λ³νλλ ν·κ°λ¦΄ μ μλ λΆλΆλ€μ μμ£Όλ‘ μ λ¦¬ν΄ λ³΄μμ΅λλ€.
μΉμΌλ‘ μ μ κ°λ₯ν μ½νλ¦° playgroundμμ μ§μ μ»΄νμΌ ν΄λ³΄λ©΄μ 곡λΆν΄λ³΄μΈμ!
https://play.kotlinlang.org
μΌλ° κ·μΉ
var
, val
μ¬μ©val
λ‘ μ μΈνλ€κ³ κ°μ²΄μ λ§΄λ² κ°λ λ³κ²½ν μ μλ κ²μ μλ β c++μ const
μ λ€λ¦var data: Int = 10
β μ΄λ κ² νμ
μ λͺ
μ κ°λ₯var a; a = 10;
β λΆκ°λ₯var a: Int; a = 10;
β κ°λ₯μ΄κΈ°κ° ν λΉ
lateinit
ν€μλlateinit var a: String
β κ°λ₯var
ν€μλλ‘ μ μΈλ κ²primitive type
μ΄ μλ κ²lazy
ν€μλval name: String by lazy { }
β μ΄λ κ² μ¬μ©λλ μμ μ μ΄κΈ°ν κ°λ₯{ }
λ΄λΆμ λͺ
μλ κ²λ€μ΄ νλμ© μ€νλκ³ λ§μ§λ§ κ°μΌλ‘ μ΄κΈ°νval a: Int by lazy { 10; 20; 30 }
β 30μΌλ‘ μ΄κΈ°νprimitive type
β Classλ‘ μ 곡λ¨
Byte
(1byte), Short
(2byte), Int
(4byte), Long
(8byte), Double
, Float
, Boolean
Number
μμvar a: Int = 10
, var b: Double? = null
β κ°λ₯λ¬Έμμ λ¬Έμμ΄
Char
νμ
μ Number
λ₯Ό μμνμ§ μμ β κ³μ° λ±μ μ¬μ©λ μ μμString
νμ
μ λ°μ΄ν, μΌμ€λ°μ΄νλ‘ νν"plus: ${a + 10 + pi()}"
, "plus: $a"
β μ΄λ κ² κ°λ₯Any
, Unit
, Nothing
Any
: μ΅μμ ν΄λμ€λ‘ λͺ¨λ ν΄λμ€ κ°λ¦¬ν¬ μ μμclass
λ λ°λμ μλμΌλ‘ Any
λ₯Ό μμνκ² λ¨Unit
: return
μ΄ μλ€λ κ²μ λͺ
μμ μΌλ‘ λνλ΄κΈ° μν ν΄λμ€Unit
μΌλ‘ μ μΈλ λ³μμλ Unit
λΉΌκ³ μ΄λ κ²λ λ΄κΈΈ μ μμfinal
ν€μλλ‘ μμλ λ§νμμNothing
: null
λ§μ λ΄κΈ° μν ν΄λμ€, return
μ΄ νμ null
μΌ λ μ¬μ©var a: Nothing? = null
β null
μ μ μΈν κ·Έ 무μλ λ΄μ§ λͺ»ν¨return
νμ
μ΄ κ·Έμ Noting
μ΄λΌλ©΄ λ°λμ Exception
μ λμ ΈμΌν¨fun add(a: Int, b: Int): Int
var
, val
νμ
μ μ¬μ©ν μ μμ β μλμΌλ‘ λ°λμ val
return
νμ
λͺ
μνμ§ μμ μ, Unit
μΌλ‘ κ°μ£Όfun add(a: Int, b: Int, isDeciaml: Boolean = true): Int
val result1 = add(5, b = 10)
Array
val data1: Array<Int> = Array(3, {0})
β κΈ°λ³Έμ μΌλ‘ μ λ€λ¦μΌλ‘ λνλ{0}
λ λλ€μμΌλ‘ val data: Array<Int> = Array(3) { 1 }
β μ΄ κ²½μ° λͺ¨λ 1λ‘ μ΄κΈ°ν λ¨[idx]
, get(idx)
, set(idx, value)
β μ΄λ°μμΌλ‘ μ κ·Ό κ°λ₯val data = arrayOf<Int>(10, 20, 30)
β μ΄λ° μμΌλ‘ μ λ€λ¦ ν¨μλ₯Ό ν΅ν΄ μ΄κΈ°νλ κ°λ₯primitive type
μ λν΄μBooleanArray
, ByteArray
, CharArray
, IntArray
, etcβ¦val data: IntArray = IntArray(3, {0})
, val data = intArrayOf(1, 2, 3)
List
, MutableList
val data: List<Int> = List<Int>(3, {0})
, val data = listOf<Int>(1, 2, 3)
mList.add(1)
, mList.add(3, 1)
, mutableList.set(2, 9)
, mutableList[2] = 1
Set
, MutableSet
Map
, MutableMap
var map = mapOf<String, String>(Pair("one", "1"), "two" to "2")
map.get("one")
if ~ else
var res = if (data > 0) { print("p"); true; } else { print("f"); false; }
when
if ~ else
μ²λΌ ννμμΌλ‘λ μ¬μ© κ°λ₯(μ΄ κ²½μ° else
λ°λμ λͺ
μ)( )
λ΄μ dataλ₯Ό λͺ
μνλ©΄ λ€μκ³Ό κ°μ κ²λ€μ΄ κ°λ₯when (data) {
"hello" -> println("data is hello")
"world" -> println("data is world")
else -> println("data is not valid data")
}
when (data) {
is String -> println("data is String")
20, 30 -> println("data is 20 or 30")
in 1..10 -> println("data is 1..10")
else -> println("data is not valid data")
}
( )
λ₯Ό μλ΅νλ κ²½μ° μ‘°κ±΄λ¬Έμ μμ±ν μ μμwhen {
data <= 0 -> println("data is <= 0")
data > 100 -> println("data is > 100")
else -> println("data is not valid")
}
val result = when {
data <= 0 -> "data is <= 0"
data > 100 -> "data is > 100"
else -> "data is not valid"
}
for
for (i in 1 .. 10) { β¦ }
β 1 λΆν° 10κΉμ§for (i in 1 until 10) { β¦ }
β 1λΆν° 9κΉμ§for (i in 2 .. 10 step 2) { β¦ }
β 2λΆν° 10κΉμ§ 2μ© μ¦κ°for (i in 1 downTo 10) { β¦ }
β 10λΆν° 1κΉμ§ 1μ κ°μfor (i in arrayOf<Int>(0, 1, 2).indices) { β¦ }
β 컬λ μ
νμ
λ°μ΄ν° λ°λ³΅for ((index, value) in arrayOf<Int>(0, 1, 2).withIndex()) { β¦ }
while
ν΄λμ€ μ μΈ
lateinit
ν€μλ μ¬μ©val user = User("minseok128")
μ£Ό μμ±μ
class User constructor() { }
β class λͺ
μΉ λ€μ constructor()
λͺ
μ ννclass User() { }
β constructor
μλ΅ ννinit { }
μ μ¬μ©νμ¬ μ£Ό μμ±μμ λ³Έλ¬Έ μμ± κ°λ₯class User(val name: String, private var count: Int)
β μ¦μ λ§΄λ²λ‘ μ μΈclass User(name: String, count: Int)
β λ§€κ°λ³μ μ€μ§ init λ΄μμλ§ μ κ·Ό κ°λ₯보쑰 μμ±μ
constructor
ν€μλλ‘ μ μΈνλ ν¨μ β λ€λ₯Έ λ§€κ°λ³μλ‘ μ¬λ¬ κ° μ μΈ κ°λ₯class User {
constructor(name: String) {
println("first constructor")
}
constructor(name: String, count: Int) {
println("second constructor")
}
}
val
ν€μλλ‘ μ μΈλ λ§΄λ² λ³μλ₯Ό μμ± μμ μ νΉμ κ°μΌλ‘ μ΄κΈ°ννκ³ μΆλ€λ©΄this()
ν΅ν΄ μ£Όμμ±μλ₯Ό νΈμΆclass User(name: String) {
init {
println("main constructor")
}
constructor(name: String, count: Int): this(name) {
println("first constructor")
}
constructor(name: String, count: Int, email: String): this(name, count) {
println("second constructor")
}
}
μμκ³Ό μμ±μ
open class Animal(val name: String) { }
β λ°λμ open
ν€μλ λͺ
μopen class Animal(val name: String) {}
class Sub1(name: String): Animal(name) {}
class Sub2 {
constructor(name: String): super(name) { }
}
super
λ₯Ό ν΅ν΄ νΈμΆν μ μμμ€λ²λΌμ΄λ©
open
ν€μλ λͺ
μoverride
ν€μλ λͺ
μvar
ν€μλλ‘ μ μΈλ λ³μλ μ¬μ μ κ°λ₯μ κ·Ό μ νμ
public
: λͺ¨λ νμΌμμ κ°λ₯internal
: κ°μ λͺ¨λ λ΄μμ κ°λ₯protected
: μ¬μ© λΆκ°private
: νμΌ λ΄λΆμμλ§ μ¬μ© κ°λ₯public
: λͺ¨λ ν΄λμ€μμ κ°λ₯internal
: κ°μ λͺ¨λ λ΄μμ κ°λ₯protected
: μμ κ΄κ³μ νμ ν΄λμ€μμ κ°λ₯private
: ν΄λμ€ λ΄λΆμμ κ°λ₯λ°μ΄ν° ν΄λμ€
data class DataClass(val name: String, val email: String, val age: Int)
equals
ν¨μtrue
β μλλ λμΌν κ°μ²΄μΈμ§λ₯Ό νμΈtoString
ν¨μString
return β μλλ 무μλ―Έν κ° μΆλ ₯μ€λΈμ νΈ ν΄λμ€
open class Super {
open var data = 10
open fun some() {
println("I am super some() : $data")
}
}
val obj = object : Super() {
override var data = 20
override fun some() {
println("I am object some() : $data")
}
}
class MyClass {
companion object {
var data = 10
fun some() {
println(data)
}
}
}
fun main() {
MyClass.data = 20 // OK
MyClass.some() // OK
}
λλ€ ν¨μ
val sum = { a: Int, b: Int -> a + b }
β μ΄ κ²½μ° μλμ κ°μ΄ νμ
μ΄ μΆλ‘ λ¨val sum: (Int, Int) -> Int = { a: Int, b: Int -> a + b }
println({ a: Int, b: Int -> a + b }(10, 20))
val sum = { a: Int, b: Int -> println("+"); a + b; }
β λ§μ§λ§ ννμμ΄ returnval func1 = { println("hi") }
β λ§€κ°λ³μ μλ κ²½μ° νμ΄ν μλ΅ κ°λ₯val func1: (Int) -> Unit = { println(it) }
β λ§€κ°λ³μ νλ itμΌλ‘ νν, νμ΄ν μλ΅νμ
val some: () -> Int = { 42 }
typealias MyFunType = (Int, Int) -> Unit
typealias MyFunType = (Int, Int) -> Boolean
val someFun: MyFunType = { no1, no2 -> no1 > no2 }
val someFun2: (Int, Int) -> Boolean = { no1, no2 -> no1 > no2 }
val someFun3: (no1: Int, no2: Int) -> Boolean = { no1, no2 -> no1 > no2 }
κ³ μ°¨ ν¨μ
fun hotFun2(data: Int, arg: (Int) -> Boolean): Int {
return if (arg(data)) 100 else 0
}
val result3 = hotFun2(10) {
println("high order function")
it > 50
}
println(result3)
?.
μ°μ°μ β λ νμ©μΌλ‘ μ μΈλ λ³μμ λ§΄λ²μ μ κ·ΌνκΈ° μν΄ μ¬μ©, nullμ returnν μ μμ?
μ°μ°μ β λ³μκ° nullμ κ°μ§ μ μμ λ type μμ λͺ
μ!!
μ°μ°μ β κ°μ²΄κ° nullμΌ λ μμΈλ₯Ό λ°μμν΄, nullμ νμ©νμ§λ§ μ€λ₯λ λ°μforEach
: μννλ©΄μ κ° μμμ λν΄ actionμ μν
public inline fun <T> Iterable<T>.forEach(action: (T) -> Unit): Unit
listOf(1, 2, 3).forEach { println(it) }
filter
: κ° μμμ λν predicate ν¨μμ returnμ΄ μ°ΈμΈ μμλ€λ§ ν¬ν¨λ 리μ€νΈλ₯Ό μμ±
public inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T>
val even = listOf(1, 2, 3, 4).filter { it % 2 == 0 }
partition
: κ° μμμ λν predicate ν¨μ κ²°κ³Όλ‘ λΆλ¦¬λ 2κ°μ 리μ€νΈλ₯Ό νμ΄λ‘ μμ±
public fun <T> Iterable<T>.partition(predicate: (T) -> Boolean): Pair<List<T>, List<T>>
val (even, odd) = listOf(1, 2, 3, 4).partition { it % 2 == 0 }
map
: κ° μμμ λν΄ transform ν¨μκ° μ μ©λ κ²°κ³Όλ‘ μ΄λ£¨μ΄μ§ 리μ€νΈλ₯Ό μμ±
public inline fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R>
val doubled = listOf(1, 2, 3).map { it * 2 }
any
: μμλ€ μ€ predicate ν¨μκ° μ°ΈμΈ μμκ° μ‘΄μ¬νλ©΄ trueλ₯Ό return
public inline fun <T> Iterable<T>.any(predicate: (T) -> Boolean): Boolean
val hasEven = listOf(1, 2, 3).any { it % 2 == 0 }
reduce
: κ° μμλ€μ operationμ μ μ©νμ¬, νλμ κ°μΌλ‘ λ§λ€κ³ return
public inline fun <S, T: S> Iterable<T>.reduce(operation: (acc: S, T) -> S): S
val sum = listOf(1, 2, 3, 4).reduce { acc, num -> acc + num }
distinct
: μ€λ³΅λλ μμκ° μ κ±°λ 리μ€νΈ λ°ν
public fun <T> Iterable<T>.distinct(): List<T>
val unique = listOf(1, 2, 2, 3).distinct()
find
/findLast
: 쑰건μ λ§μ‘±νλ κ°μ₯ μ/λ€μ μμλ₯Ό return, μμΌλ©΄ null
public inline fun <T> Iterable<T>.find(predicate: (T) -> Boolean): T?
val firstEven = listOf(1, 2, 3).find { it % 2 == 0 }
groupBy
: μ£Όμ΄μ§ keyμ λ§κ² ν€μ 리μ€νΈλ‘ μ΄λ£¨μ΄μ§ Mapμ μμ±
public inline fun <T, K> Iterable<T>.groupBy(keySelector: (T) -> K): Map<K, List<T>>
val group = listOf("a", "bb", "ccc").groupBy { it.length }
maxByOrNull
/minByOrNull
: selector κ°μ΄ κ°μ₯ ν°/μμ μμλ₯Ό return, μμΌλ©΄ null
public inline fun <T, R: Comparable<R>> Iterable<T>.maxByOrNull(selector: (T) -> R): T? public inline fun <T, R: Comparable<R>> Iterable<T>.minByOrNull(selector: (T) -> R): T?
val maxString = listOf("a", "bb", "ccc").maxByOrNull { it.length } val minString = listOf("a", "bb", "ccc").minByOrNull { it.length }
μ°μ μ μ©νκ³ ν·κ°λ¦΄λ§ν λ¬Έλ² μ 리λ€μ! κ°μ¬ν©λλ€
μ λ§κ³ λ λ§μ λΆλ€μκ² λμμ΄ λ κ±°κ°μμ!!γ
γ
γ
λ§μΉ¨ λ΄μΌ μνμΈλ° λ무 λμλμ΄μ!