- 표현력과 간결함
- 널 안전성 지원(널 허용, 불허용)
- 자바와의 상호 운용성
- 코루틴을 사용한 비동기 프로그래밍
val data1: Int = 10 // 타입 지정
var data2 = 10
fun main() {
data1 = 20 // 오류
data2 = 20 // 성공
}
val은 value로, 초깃값이 할당후 바꾸기 불가능
var은 variable로, 초깃값이 할당후 바꾸기 가능
val data1: Int // 오류
class User {
val data4: Int // 오류
}
최상위 선언 변수 또는 클래스 멤버 변수는 선언과 동시에 초기화 해야함.
lateinit var data1: Int // 오류
lateinit val data2: String // 오류
lateinit var data3: String // 성공
lateinit으로 선언한 변수는 바로 초기화 하지 않아도 된다.
단, var변수 그리고 primitive type에서는 사용 불가능하다.
val data4: Int by lazy {
println("lazy..")
10
}
fun main() {
println(data + 10)
println(data)
}
by lazy를 사용한 data4는 main함수에서 처음으로 사용될 때 중괄호 안이 실행된다.
실행 결과는 아래와 같다.
lazy..
20
10
코틀린의 모든 변수는 객체라는 것을 명심하자.
-> null 대입이 가능
fun main() {
val name: String = "kkang"
println("name : $name")
}
String 타입의 데이터에 변숫값을 포함할 때는 $ 기호를 이용한다.
실행 결과는 아래와 같다.
name : kkang
val data1: Any = 10
val data2: Any = "hello"
Any는 코틀린에서 최상위 클래스이다. 모든 타입의 데이터를 할당할 수 있다.
fun some(): Uint {
println(10 + 20)
}
==========================================
fun some() {
println(10 + 20)
}
Uint는 반환문이 없음을 명시적으로 나타낼 때 사용된다.
해당 타입으로 변수를 선언할 수 있지만 의미는 없다.
위 둘은 같은 코드이다.
null이나 예외를 반환하는 타입
var data1: Int = 10
data1 = null // 오류
var data2: Int? = 10
data2 = null // 성공
타입에 물음표를 붙이면 널 허용 나머지는 불허용.
fun some(data1: Int): Int {
return data1 * 10
}
매개변수는 data1, 반환 타입 Int이다.
매개변수는 val이 자동으로 적용되며, 변경하려 할 시 오류가 뜬다.
val data1: Array<Int> = Array(3, { 0 })
// 0으로 초기화한 데이터 3개 나열한 정수형 배열
val data2: IntArray = IntArray(3, { 0 })
val data3 = arrayOf<Int>(10, 20, 30)
val data4 = intArrayOf(10, 20, 30)
한 타입의 Array를 선언하는데 기초타입의 경우 다양한 방식으로 표현이 가능하다.
각 클래스는 불변이며, 각각 listOf(), setOf(), mapOf()로 표현 가능하다.
가변 타입은 앞에 Mutable을 붙이면 된다.
var list = listOf<Int>(10, 20, 30)
var mutableList = mutableListOf<Int>(10, 20, 30)
var map = mapOf<String, String>(Pair("one", "hello"), "two" to "world")
map의 경우 Pair 또는 to를 사용해 key, value를 지정할 수 있다.
var data = 10
val result = if (data > 0) {
true
} else {
false
}
if~else 문을 결괏값을 반환하는데 사용한다.
else문을 생략할 수 없다.
var data = 10
when (data) {
10 -> println(10)
20 -> println(20)
else -> {
println("another")
}
}
data의 값이 10이므로 10이 출력된다.
when 괄호 안에 들어오는 타입은 다양하게 사용 가능하다.
외에도 아래와 같이 사용할 수 있다.
var data: Any = 10
when (data) {
is String -> ...
20, 30 -> ...
in 1.. 10 -> ...
else -> ...
]
데이터를 명시하지 않는 경우
var data = 10
when {
data >= 10 ->...
}
표현식으로 사용하는 경우
var data = 10
val result = when {
data >= 10 -> ...
}
for (i in 1..10)
1 ~ 10까지 1씩 증가해서 i에 대입하여 사용
var data = arrayOf<Int>(10, 20, 30)
for (i in data.indices)
배열의 길이가 3이므로 i는 0, 1, 2가 된다.