대학 강의 학습 일지입니다.
기존 MainActivity.kt가 있었던 디렉토리에 Main.kt 만들어서 코드 작성해야 한다.
var i : Int = 10 // 'Int' 안 써도 자동으로 Int로 인식됨
var name : String = "Suzzang"
var value : Double = 2.5
위와 같은 형식으로 변수를 선언한다. ‘Int’에서 대문자임에 주의하자.
자료형을 따로 적어주지 않아도 자동으로 인식되어 설정된다.
val constant = 100 // 'val'으로 선언하면 값을 바꿀 수 없는 상수로 선언됨
constant = 200 // 에러 발생
‘val’로 변수를 선언하면 상수로 선언되어, 선언 이후에 값을 변경하려고 하면 에러가 뜬다.
const val constant2 = 100 // 'const val'로 선언하면 컴파일 시간 상수로 선언됨, 함수 외부에서 선언해야 함
‘const val’을 붙이면 컴파일 시간 상수로 선언되고, 이는 함수 안에서 선언하면 에러가 뜬다.
package com.example.firstapp
const val MY_CONSTANT = 100
fun main() {
var i : Int = 10 // 'Int' 안 써도 자동으로 Int로 인식됨
var name : String = "Suzzang"
var value : Double = 2.5
val constant = 100 // 'val'으로 선언하면 값을 바꿀 수 없는 상수로 선언됨
constant = 200 // 에러 발생
const val constant2 = 100 // 'const val'로 선언하면 컴파일 시간 상수로 선언됨, 함수 외부에서 선언해야 함
}
이렇게 함수 밖에 선언해야 한다.
대부분의 경우 세미콜론을 찍지 않아도 되고, 그걸 더 추천한다.
아주 가끔 세미콜론을 찍어야 하는 경우가 있기도 하다.
var num1 : Int = 10
var longValue : Long = 10L // 'L'을 붙여서 Long 타입으로 지정
num1 = longValue // Error!
num1 = (Int)longValue // Error!
할당하려는 숫자 뒤에 ‘L’을 붙이면 Long 타입으로 지정할 수 있다.
Kotlin에서는 type casting이 지원되지 않기 때문에, Int 타입 변수에 Long 타입 변수를 대입하려고 하면 에러가 뜬다.(원래 비슷한 언어인 Java에서는 됨)
(Int)를 붙여 명시적 형변환을 하려고 해도 에러가 뜬다.
num1 = longValue.toInt()
longValue = num1.toLong()
이렇게 해야만 형변환이 정상적으로 작동된다.
var word = "20"
num1 = word.toInt()
print(num1) // 20
num1 = 100
word = num1.toString()
print(word) // 100
위와 같이 Int형과 String형 사이에 형변환도 잘 이루어지는 것을 알 수 있다.
var i = 50
if (i > 100) {
print("i > 100")
} else if (i > 30) {
print("i > 30")
} else {
print("else")
}
if 문도 보통의 경우와 같이 사용할 수 있다.
when (i){
100 -> {
print("i = 100")
}
50 -> {
print("i = 50")
}
else -> {
print("else")
}
}
위와 같이 when 문을 사용할 수도 있다.
print(
if (i == 100){
"i = 100"
} else if (i == 30){
"i = 30"
} else {
"else"
}
)
위와 같이 ‘조건문’이 아니라 ‘실행문’이 가장 바깥쪽에 위치하고, 조건을 안쪽에 작성할 수도 있다.
var str = (
if (i == 100){
"i = 100"
} else if (i == 50){
"i = 50"
} else {
"else"
}
)
이렇게 값을 할당하는 데에도 사용할 수 있다.
var x = if (i>20) 10 else 20
Kotlin에서의 if 문은 단순히 문장을 실행만 하는 것이 아니라 값을 반환하기 때문에, 위와 같이 값을 설정하여 변수에 값이 할당되게 할 수도 있다.
var items = listOf(1, 2, 3, 4, 5)
기본적으로 listOf 를 통해 리스트 형을 선언할 수 있다.
var items = listOf(1, 2, 3, 4, 5)
for (item in items) {
print(item)
}
items.forEach { item ->
print(item)
}
위와 같이 for 문을 사용할 수도 있지만,
forEach 문을 사용할 수도 있다. (Javascript에서와 동일하다.)
items.forEachIndexed() { index, item ->
println("Item at $index is $item")
}
forEachIndexed 를 사용하면, 따로 index를 지정해 명시할 수도 있다. index를 첫번째 인자에 써줘야한다.
for ((index, item) in items.withIndex()) {
println("Item at $index is $item")
}
동일한 동작을 하는 코드를 이렇게 for 문으로 작성할 수도 있다.
for (i in 0..(items.size - 1)){
print(items[i])
}
이렇게 for 문에 범위를 지정해서도 할 수 있다.
var mutitems = mutableListOf(1, 2, 3, 4, 5) // [1,2,3,4,5]
mutitems.add(6) // 맨 뒤에 6을 추가
println(mutitems) // [1,2,3,4,5,6]
mutitems.add(2, 7) // index가 2인 곳에 7을 삽입
println(mutitems) // [1,2,7,3,4,5,6]
mutitems.removeAt(0) // index가 0인 요소를 삭제 (주의할점!! 그냥 'remove'와 다름!)
println(mutitems) // [2,7,3,4,5,6]
mutitems.remove(2) // 해당 값인 요소를 삭제
println(mutitems) // [7,3,4,5,6]
mutableListOf 로 선언한 mutableList는 말 그대로 요소를 삭제하거나 수정할 수 있는 자료형이다.(그럼 그냥 List는 못바꾸나?)
var i : Int? = null
var k : Int = null // Error!
위와 같이 null 값으로 변수를 초기화 할 때는 기존 변수 타입(Int, Long 등) 뒤에 ? 을 붙여 선언해야 한다.
var i : String? = null
var j : Int
j = i?.length ?: -1
println(j)
i?.let{
println(i) // i가 null(false)이 아닐 때만 안의 실행문 실행
}
물음표를 붙여 선언한 변수는 위와 같이 .length 와 같은 프로토타입 함수를 사용할 때 등에도 물음표를 붙여야한다.
그리고 세 번째 줄과 같이 ?: 의 문법으로 if 조건문을 쓸 필요없이 간단하게 한 줄로 null 예외처리를 해줄 수 있다.
마찬가지로 let 문으로도 작성해줄 수 있다.
val 과 const val 의 차이는 뭘까?