[Android(Kotlin)] kotlin 기초 - 1
카테고리: Android(Kotlin)
1. 변수 선언
1. 1. 변수 선언 기본
Kotlin은 두 키워드(val
및 var
)를 사용하여 변수를 선언한다
- 값이 변경되지 않는 변수에
val
을 사용한다.val
을 사용하여 선언된 변수에 값을 재할당할 수 없다. - 값이 변경될 수 있는 변수에
var
을 사용한다.
Int
타입의 count 변수에 10의 초기값을 할당하는 방법은 다음과 같다.
var count: Int = 10
다른 언어와 마찬가지로 수치 데이터에 따라 Byte, Short, Long, Float, Double을 사용할 수도 있다.
var
키워드는 필요에 따라 count에 값을 재할당할 수 있음을 의미한다. 다음과 같이 count의 값을 변경할 수 있다.
var count: Int = 10
count = 15
변경하고 싶지 않은 변수를 선언할 때는 val
키워드를 이용한다.
val languageName: String = "Kotlin"
Kotlin에서는 기본적으로 모두 val로 선언하고 필요한 경우에만 var을 사용하는 것이 바람직하다. val로 선언하더라도 그 변수가 가리키는 객체의 내부 값은 변경될 수 있다는 것을 명심하자
1.2. 유형 추론
Kotlin 컴파일러는 할당된 값의 유형을 기반으로 유형을 추론할 수 있다.
val languageName = "Kotlin"
“Kotlin” 값이 String
타입이므로 컴파일러는 languageName을 String
타입이라고 추론한다.
이는 정적으로 입력되므로 유형이 결정되면 절대 변경되지 않는다. 위의 예에서 languageName이 String
으로 추론되므로 String
클래스의 일부가 아닌 함수를 호출할 수 없다.
1.3. Null 안전성
일부 프로그래밍 언어에서는 초기 값을 명시적으로 제공하지 않고 변수를 선언할 수 있으며, 이러한 경우 변수에 일반적으로 null 값이 포함된다. 그러나 Kotlin에서 변수는 기본적으로 null을 보유할 수 없다.
즉 다음과 같은 예시는 유효하지 않다.
val languageName: String = null // Fails to compile
Kotlin에서 변수가 null값을 보유하기 위해서는 nullable 유형이어야 한다. 이 경우 ?를 변수 타입의 접미사로 지정하여 변수를 nullable로 선언 할 수 있다.
val languageName: String? = null
null을 보유하지 못하는 기본 특징 덕분에 NullPointerException
으로 부터 안전하지만 nullable 변수를 사용할 경우 당연히 NullPointerException
의 발생 위험이 있다.
nullable 변수의 일부 함수를 바로 사용할 경우 컴파일 오류가 발생할 수 있다. 예를 들어 위의 예시에서 languageName.length와 같은 코드를 사용할 경우 컴파일 오류가 발생한다. 이와 같은 상황을 벗어나기 위한 방법은 다음과 같다.
1. if문을 이용한 null 체크
val str1: String? = makeString()
val len =
if(str1 != null) str1.length else -1
2. 세이프콜(Safe call)
val str1: String? = makeString()
val len = str1?.legnth
해당 경우 len의 타입은 Int? 가 된다.
3. 엘비스 연산자
val str1: String? = makeString()
val len = str1?.length ?: -1
이 경우 len의 타입은 Int가 되고 str1이 null 일 경우 len은 -1, null이 아닐 경우 length의 결과가 len의 값이 된다.
2. 흐름 제어
2.1. 조건문
Kotlin의 조건부 논리를 구현하는 메커니즘 중 가장 일반적인 것은 if - else 문이다. 사용법은 다른 언어들과 크게 다르지 않다.
if (count == 42) {
println("I have the answer.")
} else if (count > 35) {
println("The answer is close.")
} else {
println("The answer eludes me.")
}
이러한 조건문은 스테이트풀(Stateful)을 나타내는 데 유용하나 반복된 작성이 일어날 수 있다. Kotlin은 이러한 반복을 피하기 위해 조건식을 제공한다. 위의 예시는 다음과 같이 작성될 수 있다.
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)
암시적으로 각 조건 분기는 마지막 줄에 표현식의 결과를 반환하므로 return 키워드를 사용할 필요가 없다. answerString에는 if-else 표현식의 결과로 초기 값이 할당된다. 유형추론을 사용하여 타입 명시를 생략할 수 있지만 명확한 값을 얻기 위해서는 유형 선언을 포함하는 것이 좋다.
조건문의 복잡도가 증가하면 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)
when 표현식은 분기별로 조건, 화살표, 결과로 표시한다. 조건이 true로 판정되면 오른쪽의 결과를 반환하고 다른 분기를 실행하지 않는다.
2. 2. 반복문
Kotlin에서 for 반복문의 기본 문법은 다음과 같다.
for(item in items)
print(item)
for(item : Int in items){
//...
}
다음은 범위 표현식을 이용한 예시이다.
//1 2 3 순으로 출력
for(i in 1..3)
println(i)
//10 8 6 4 2 0 순으로 출력
for(i in 10 downTo 0 step2){
println(i)
}
while문의 경우 java와 크게 다르지 않다.
while(x > 0){
//...
}
do{
//...
}while(y != null)