코틀린은 var, val 두 개의 키워드를 사용하여 변수를 선언할 수 있다.
var
: 값이 변경될 수 있는 변수에 선언
val
: 값이 변경될 수 없는 변수에 선언
const val
: val과 동일한 역할을 하나, 런타임 시간에 값이 할당되는 val과 달리 컴파일 시간에 값이 할당된다. 따라서 오직 문자열이나 기본 자료형에만 할당될 수 있고, 클래스의 프로퍼티나 지역변수로 할당할 수 없다.
const val로 선언하고 싶다면 클래스 내의 companion object 또는 object 내에서 선언해야 한다.
class Example {
var num1 = 0
val num2 = 1
companion object {
const val stringValue = "hello"
}
}
object Example {
var num1 = 0
val num2 = 1
const val stringValue = "hello"
}
코틀린 컴파일러는 변수에 초기 값이 할당될 때 할당된 값의 타입을 기반으로 변수 타입을 추론한다. 이러한 코틀린의 타입 추론 방식은 간결성과 안정성을 보장할 수 있다.
var num : Int = 0
var num = 0
0은 정수, Int 타입이기 때문에 컴파일러가 num도 Int 타입임을 추론할 수 있다. 따라서 Int 타입의 변수에서 호출할 수 없는 함수(toUpperCase는 String 타입의 변수서에만 호출할 수 있는 함수)는 호출할 수 없다.
코틀린 변수는 기본적으로 null 값을 보유할 수 없다.
따라서 null 값을 포함해야 하는 변수는 nullable타입이어야 하고, '?' 를 변수 타입에 사용해서 해당 변수가 null 값을 허용할 수 있도록 만들 수 있다.
val num : Int ?= null
코틀린에선 if문을 사용해 변수에 값을 할당할 수 있다.
if (count == 42) {
println("I have the answer.")
} else if (count > 35) {
println("The answer is close.")
} else {
println("The answer eludes me.")
}
위 예시처럼 보통의 if문으로 조건문을 만들 수도 있지만, 위 예시처럼 작성하게 되면 특정 구문(println)을 반복하게 된다. 아래의 예시처럼 코드를 작성한다면 이러한 반복 호출을 피할 수 있다. 또한 각 조건식은 마지막 코드의 실행 결과를 반환하기 때문에, return 키워드를 사용할 필요가 없다.
fun main(){
count(39)
}
fun count(count: Int){
val answerString: String = if (count == 42) {
"I have the answer."
} else if (count > 35) {
"The answer is close."
} else {
"The answer eludes me."
}
println(answerString)
}
결과 : The answer is close
보통 2개 정도의 조건문을 만든다면 if문을 사용하면 되지만, 3개 이상의 조건문을 만들고 싶다면 when을 사용하는 것이 좋다. when은 자바의 switch문과 동일한 역할을 한다.
val answerString = when {
count == 42 -> "I have the answer."
count > 35 -> "The answer is close."
else -> "The answer eludes me."
}
println(answerString)
(접근제한자(생략가능, 생략 시 public으로 지정)) 함수명() : 반환형 { /*함수 내용*/ }
fun getName() : String {
return "minji"
}
코틀린에서의 기본적인 함수 선언 형태는 위와 같으며, return을 생략하거나 조건문을 사용하는 등 다양한 방식으로 간소화하여 선언할 수도 있다. 위 함수에선 return을 생략하여 다음과 같이 선언할 수 있다.
fun getName() : String = "minji"
fun mySnack(snack: String) : String {
val snackData : String = if (snack == "coffee") {
"I ate coffee."
} else {
"I ate ice cream."
}
return snackData
}
코틀린을 사용하면 if문을 사용해 변수에 값을 할당할 수 있다고 했다. 위 함수에서도 if문을 적용한다면 함수를 더욱 더 간결하게 선언할 수 있다.
fun main(){
println(mySnack("coffee"))
}
fun mySnack(snack: String) : String {
return if (snack == "coffee") {
"I ate coffee."
} else {
"I ate ice cream."
}
}
결과: I ate coffee.
더욱 나아가 반환 키워드를 if문으로 바꿔서 사용할 수도 있다.
fun main(){
println(mySnack("coffee"))
}
fun mySnack(snack: String) : String = if (snack == "coffee") {
"I ate coffee."
} else {
"I ate ice cream."
}
결과 : I ate coffee.
코틀린에서는 '익명 함수', 말 그대로 이름이 없는 함수를 정의할 수 있다. 익명 함수는 일반적인 함수를 선언할 때 처럼 fun 키워드를 사용하지 않는다. 익명 함수는 람다식과 유사한 형태를 보이는데, 람다식에선 return, break, continue와 같은 제어문을 사용하기가 어렵기 때문에 함수 내 조건에 따라 실행을 중단하고 리턴해야 하는 경우에는 익명 함수를 사용하는 것이 좋다고 한다. 익명 함수는 코드 마지막줄의 결과가 반환되며, return 키워드를 사용하지 않는다.
fun main(){
val snackList = arrayListOf<String>("Cookie", "Banana", "IceCream")
val numberOfSnacks : (List<String>) -> Int = { input ->
input.size
}
val num = numberOfSnacks(snackList)
println(num)
}
결과 : 3
위 예시에선 String 타입의 리스트를 입력값으로 받고, 리스트의 크기, 즉 Int 타입의 데이터를 리턴한다.
https://smoh.tistory.com/236
https://kimch3617.tistory.com/entry/Kotlin%EC%97%90%EC%84%9C-val-%EC%99%80-const-val-%EC%9D%98-%EC%B0%A8%EC%9D%B4