val 변수명: 타입 = 값
value의 줄임말로 초깃값이 할당되면 바꿀 수 없는 변수
var 변수명: 타입 = 값
variable의 줄임말로 초깃값이 할당된 후에도 값을 바꿀 수 있는 변수
val data1: Int = 10
val data2 = 10
data1처럼 명시적으로 타입을 선언 할 수도 있고,
타입을 명시하지 않아도 선언한 값에 따라 자동으로 타입이 지정 됨
val data1: Int // 오류
val data2 = 10 // 성공
fun printData() {
val data3: Int
println("$data3") // 오류
data3 = 10
println("$data3") // 성공
}
class user {
val data4: Int // 오류
val data5: Int = 10 // 성공
}
최상위에 선언한 변수 또는 클래스의 멤버 변수는 선언 동시에 초깃값을 할당해야 함
lateinit var data1: String // 성공
lateinit val data2: Int // 오류
lateinit val data3: String // 오류
lateinit은 var만 사용 가능
Int, Long, Short, Double, Float, Boolean, Byte에는 불가능
val data4: Int by lazy {
println("in lazy......")
10
}
fun main() {
println("in main......")
println(data4)
}
/*실행결과
in main......
in lazy......
10
*/
by lazy {}는 변수가 최초로 사용되는 순간 중괄호로 묶은 코드 부분이 실행되고, 중괄호 부분의 마지막 줄이 변수의 초깃값이 됨
fun main() {
val str1 = "Hello \nWorld"
val str2 = """
Hello
World
"""
println("$str1")
println("$str2")
}
/* 실행결과
Hello
World
Hello
World
*/
fun some(): Unit {
println(10 + 20)
}
val data1: Nothing? = null
Nothing으로 선언한 변수에는 null만 대입 가능
데이터로서는 의미 X
var data1: Int = 10
data1 = null // 오류
var data2: Int? = 10
data2 = null // 성공
타입 뒤에 물음표를 추가하면 널 허용으로 선언
fun some(data1: Int) {
data1 = 20 // 오류
}
매개변수는 자동으로 val로 적용되며 변경 불가능
fun main() {
fun some(data1: Int, data2: Int = 10): Int {
return data1 * data2
}
println(some(10))
printlne(some(10,20))
}
/* 실행결과
100
200
*/
매개변수에 기본값을 선언했다면 그 인자를 호출하지 않아도 선언문에서 명시한 기본값이 적용됨
some(data2 = 20, data1 = 10)
매개변수명을 지정 호출하게 되면 순서와 상관없이 지정 가능
val data1: Array<Int> = Array(3, { 0 }) /* data1 : {0, 0, 0} */
data1[0] = 10
data2[0] = 20
data1.set(2, 30)
/* data1 : {10, 20, 30}
data1.size : 3
*/
배열의 데이터를 접근 할 경우 []를 이용해도 되고, set()이나 get()을 사용 가능
val data1: IntArray = IntArray(3, { 0 })
val data2: BooleanArray = BooleanArray(3, { false })
BooleanArray, ByteArray, CharArray, DoubleArray, FloatArray, IntArray, LongArray, ShortArray 클래스 사용 가능
val data1 = arrayOf<Int>(10, 20, 30)
arrayOf를 사용하면 배열 선언 시 값 할당 가능
arrayOf도 기초타입 배열 사용 가능
Collection 인터페이스를 타입으로 표현한 클래스
List: 순서가 있는 데이터 집합으로 데이터의 중복 허용
Set: 순서가 없으며 데이터의 중복 허용 X
Map: 키와 값으로 이루어진 데이터 집합으로 순서가 없으며 키의 중복 허용 X
구분 | 타입 | 함수 | 특징 |
---|---|---|---|
List | List | listOf() | 불변 |
MutableList | mutableListOf() | 가변 | |
Set | Set | setOf() | 불변 |
MutableSet | mutableSetOf() | 가변 | |
Map | Map | mapOf() | 불변 |
MutableMap | mutableMapOf() | 가변 |
불변 클래스는 size()와 get() 함수만 사용 가능하지만,
가변 클래스는 add()와 set() 함수도 사용할 수 있음
var map = mapOf<String, String>(Pair("one", "hello"), "two" to "world")
map은 키와 값을 pair 객체로 표현 하거나 키 to 값으로 표현 가능
if () {
...
} else {
...
}
if () {
...
} else if () {
...
} else {
...
}
기존 문법과 동일
val result = if (data > 0) {
true
} else {
false
}
if 나 else 각 영역의 마지막 줄이 반환값에 해당
var data = 10
when(data) {
is String -> println("string")
10 -> println("10")
20 -> println("20")
in 20..30 -> println("20..30")
else -> {
println("else")
}
}
switch문과 유사
var data = 10
when {
data <= 0 -> println(" <= 0 ")
data > 100 -> println(" > 100 ")
else -> println("else")
}
if 문처럼 조건만 명시해서 사용 가능
var sum: Int = 0
for(i in 1..10) { ... } // 1부터 10까지 1씩 증가
for(i in 1 until 10) { ... } // 1부터 9까지 1씩 증가
for(i in 2..10 step 2) { ... } // 2부터 10까지 2씩 증가
for(i in 10 downTo 1) { ... } // 10부터 1까지 1씩 감소
var data = arrayOf<Int>(10, 20, 30)
for(i in data.indices) {
print(data[i])
if (i !== data.size-1) print(",")
}
/* 실행결과
10, 20, 30
*/
컬렉션 타입 활용 예
var data = arrayOf<Int>(10,20,30)
for((index, value) in data.withIndex()){
print(value)
}
withIndex()를 사용해 인덱스 가져오기
var x = 0
var sum1 = 0
while(x < 10) {
sum1 += ++x
}
while 사용 예
Do it! 깡쌤의 안드로이드 프로그래밍 with 코틀린 (개정판)