조건문
블록의 표현식이 길어질 때
조건문 블록의 표현식이 길어지면 중괄호로 감싸야한다.
또한, 람다식처럼 블록의 마지막 표현식이 변수에 반환되어 할당이 된다.
위의 예제에서 readLine()은 콘솔로부터 문자열을 입력받는 함수로, non-null 단정 기호를 통해 null 값을 받지 않으며 toInt를 통해 Int 타입의 값만 입력받도록 제한하였다.
입력받은 값에 따라 a>b이면 max는 String 타입, 123 문자열을 출력하게 되고, a<b이면 Int 타입, 입력 받은 b 값을 출력하게 된다.
in연산자와 범위 연산자
Kotlin에서는 포함 여부 확인을 위한 in 연산자와 2개의 점(..)으로 구성된 범위 연산자를 제공한다.
변수 이름 in 시작 값..마지막 값
위와 같은 방식으로 범위 연산자를 사용한다.
이처럼 사용하게 되는데, JAVA에서 주로 사용하던 >= && <= 타입의 조건문을 간단하게 표현할 수 있는 것이다.
a in 0..10
a >= 0 && a <= 10
when문
when문은 JAVA에서 사용하던 switch 문과 비슷한 역할을 할 수 있는 조건문이다.
인자를 사용할 수도 있고 사용하지 않을 수도 있다.
when (인자) {
인자에 일치하는 값 혹은 표현식1 -> 수행할 문장
인자에 일치하는 값 혹은 표현식2 -> { 수행할 문장 }
...
else -> 수행할 문장
}
위와 같이 사용할 수 있으며, 수행할 문장이 한 줄일 경우 중 괄호를 생략할 수 있다.
인자가 없는 경우에는, 인자에 일치하는 값 혹은 표현식 자리에 조건 혹은 표현식이 들어가면 된다.
즉, 다음과 같이 사용하면 된다.
when (x) {
0 -> println("x == 0")
1,2 -> println("x is 1,2")
else -> println("기타")
}
when {
y in 0..10 -> println("y in 0..10")
y in 30..50 -> println("y in 30..50")
else -> println("기타")
}
인자가 있으면 표현식에 인자를 생략해도 되며, 인자가 없으면 표현식에 인자를 명시해주어야 한다.
위의 if-else문을 사용한 예제를 when 문으로 변경하면 다음과 같다.
*
표현식에 반환 값을 사용하거나, is 키워드를 사용해도 된다.
입력 받은 값을 인자로 사용할 경우, 인자에 직접 입력을 받아서 사용해도 된다.
Any 자료형의 활용
Any 자료형을 사용하면 모든 자료형을 사용할 수 있다.
따라서, when문에 Any를 사용하게 되면 다양한 자료형이 해당 메서드에 들어왔을 때의 처리가 가능해진다.
반복문
for문
for문은 JAVA에서 사용하는 것과 동일하게 쓰이며, 기본형은 JAVA와 다르다.
for (요소 변수 in 컬렉션 또는 범위) { 반복할 본문 }
여기서 범위를 사용할 때는 in, .. 키워드를 사용한다.
범위를 조건으로 사용 할 때 사용하는 키워드는 in, .. 외에 downTo, step 키워드가 추가로 존재한다.
- downTo : .. 가 상행이라면 downTo는 하행에 사용한다. 4 downTo 1 이라면 4, 3, 2, 1 순이 된다.
- step : 보통 범위를 사용할 때 1씩 증,감하지만 더 높은 수로 증감이 필요할 때가 있다. 그 때 step을 사용하여 step 뒤의 수 만큼 증감할 수 있도록 한다.
for (i in 5 downTo 2 step 2) println(i)
위와 같은 예시가 있다면, i를 5부터 2까지 2씩 감소하여 출력한다는 의미가 된다.
흐름 제어
흐름 제어문
- return : 함수에서 결과값을 반환하거나 지정된 라벨로 이동
- break : 조건식에 상관없이 반복문을 끝낸다
- continue : 본문을 모두 수행하지 않고 반복문의 조건식으로 넘어간다
예외 처리문
- try - catch : try 블록의 본문을 수행하는 도중 예외가 발생하면 catch 블록의 본문을 수행
- try - catch - finally : 예외가 발생해도 finally 블록 본문은 항상 실행.
Unit 반환
Unit은 JAVA에서 Void와 비슷하게 사용되지만, Void의 경우 반환 값이 아예 존재하지 않는다는 것이지만 Unit은 반환값이 존재하지 않는게 아닌 Unit이라는 자료형 자체를 반환하게 되는 것이다.
따라서, 다음과 같이 사용할 수 있다.
*
람다식에서 return은 inline 일 경우 사용이 가능하지만, break, continue는 사용이 불가능하다.
람다식에서 라벨과 함께 return 사용
inline 함수가 아닌 경우, 람다식에서 return을 사용하기 위해서는 라벨을 지정하여 사용해야 한다.
라벨은, 라벨 이름@ 으로 라벨을 지정하고 return@라벨 이름 으로 return을 사용한다.
이 때, 라벨 이름@ 으로 라벨 시작 지점을 지정하지 않고, return@함수 이름 을 사용하는 경우, 해당 함수 호출 지점이 라벨 시작 지점으로 암묵적으로 지정된다.
labelSample2에서는 암묵적 라벨을 사용한 것이다.
익명 함수
inline, 라벨을 붙이는 것 말고 return을 사용하기 위해서는 람다식이 아닌 익명 함수를 넣어서 사용하는 방법이 있다.
이처럼 람다식을 사용하지 않으면 라벨을 붙이지 않고도 return을 사용할 수 있다.
여기서, 람다식도 익명 함수에 포함되는데, 익명 함수인 람다식에서 return을 사용하려면 lambda라벨을 사용해야 한다.
break문과 continue 문
break문과 continue문은 JAVA에서 사용하는 것과 비슷하게 사용할 수 있는데, 라벨을 붙여 좀 더 편리하게 사용이 가능하다.
일반적으로 break, continue를 사용하면 해당 키워드가 들어있는 블록에 영향을 주지만, 2중 반복문과 같은 경우 라벨을 사용하여 키워드 밖에 있는 블록으로 한번에 이동이 가능하다.
@first 라벨을 붙이지 않았다면, second 라벨이 붙어있는 for문의 밖으로 이동하여 반복문을 돌겠지만, @first라벨을 붙였기 때문에 first@ 라벨을 선언한 i를 사용하는 for문을 나가게 되어 after for i 를 출력하고 끝나게 된다.
continue도 마찬가지로 사용이 가능하며, 위의 예제에서 break를 continue로 바꾸어 사용하면 된다.
예외 처리
사용자 정의 예외
class 사용자 정의 예외 클래스(message: String) : Exception(message)
와 같이 사용자 정의 에외 클래스를 선언하여 사용이 가능하다.
이처럼 예외 클래스를 만들고, 코드 내에서 throw를 사용해 예외를 던져 해당 예외가 발생하도록 하여 사용한다.
'Language > Kotlin' 카테고리의 다른 글
[Kotlin] 6장. 프로퍼티와 초기화 (0) | 2020.07.03 |
---|---|
[Kotlin] 5장. 클래스와 객체 (0) | 2020.06.29 |
[Kotlin] 3장. 함수와 함수형 프로그래밍 3 - 다양한 함수 (0) | 2020.06.25 |
[Kotlin] 3장. 함수와 함수형 프로그래밍 2 - 고차 함수와 람다식 (0) | 2020.06.25 |
[Kotlin] 3장. 함수와 함수형 프로그래밍 1 - 함수형 프로그래밍 (0) | 2020.06.25 |