코틀린 프로그래밍 세번째.
제어문입니다. 자바에서 제어문은 for
, if
, switch case
, while
구문 정도가 있었습니다.
코틀린에서 어떻게 사용하는지 살펴보겠습니다.
if
조건문String str = "";
int num = 50
if(num > 30){
str = "abc";
}else{
str = "bcd";
}
System.out.println(str); // abc
자바에서의 if
문은 위와 같이 어떤 조건이 성립할 때 처리식을 처리해주는 구조였습니다. 코틀린에서의 if문은 이와 조금 다른 구조로 쓸 수 있는데 그 점에 착안해서 살펴보겠습니다.
위의 자바 코드를 코틀린에서 구현할 경우 다음과 같이 할 수 있습니다.
var num:Int = 50
val str:String = if(num > 30){
"abc"
}else{
"bcd"
}
println("$str") // abc
물론 자바코드와 같이 str
을 빈 문자열로 선언해주고 값을 조건에 맞게 갈아끼우는 방법도 사용할 수 있습니다.
var num:Int = 50
var str:String = ""
if(num > 30){
str = "abc"
}else{
str = "bcd"
}
println("$str")
코틀린에는 우리가 흔히 알고 있는 그 모양의 삼항연산자가 없습니다!
예를 들어 자바코드에서
int num = 50;
String str = (num > 30) ? "abc" : "bcd";
str
변수에 대입되어 있는 형태의 식이 삼항연산자인데, 코틀린에서는 이 형태로 쓸 수가 없습니다.
때문에 아래와 같은 별도의 형식을 갖춰서 비슷한 느낌을 줄 수 있습니다.
var num:Int = 30
val str = if(num > 30) "abc" else "bcd"
println("$str")
is
의 쓰임"A
는 B
이다"를 영어 문장으로 표현하면 "A is B"가 됩니다. 마찬가지로 어떤 변수가 특정 자료형인지 아닌지를 boolean
값으로 반환해주는 것이 있는데 이것이 바로 is
입니다.
예를 들어서
var num:Int = 50
if (num is Int) {
println("num은 숫자임")
} else {
println("num은 숫자가 아님")
}
라고 한다면 num
이 Int
형태인지 조건을 따져서 해당하는 메시지를 출력하게 해줍니다.
&&
||
and
or
자바에서 사용하는 논리연산자 &&
, ||
를 그대로 사용할 수 있습니다. 뿐만 아니라 파이썬에서 사용하는 and
와 or
연산자도 대응합니다.
이 때, &&
== and
, ||
== or
로 서로 같은 의미를 갖습니다.
if((num > 0) && (num < 300)){
println("num는 30보다 작다")
}
if((num > 0) and (num < 300)){
println("num는 30보다 작다")
}
if((num > 0) || (num < 300)){
println("num는 30보다 작다")
}
if((num > 0) or (num < 300)){
println("num는 30보다 작다")
}
성적을 평가하는 로직이 있다고 가정해봅시다.
점수에 따라서 mark
변수에 성적을 저장하는데 점수의 범위는 부등호를 사용하지 않고 ..을 사용해서 나타낸다면 아래와 같이 나타낼 수 있겠습니다.
var score:Int = 85
var mark = if (score >= 90) {
"A"
} else if (score in 80..89) {
"B"
} else if (score in 70..79) {
"C"
} else {
"D"
}
println(mark) // "B"
switch case
구문switch case
우선 자바에서의 switch case
구문은 스위치에 명시된 값을 기준으로 어떤 조건을 만족할 때(케이스) 각각 처리할 작업을 나열합니다.
String s = ""
int num = 3
switch(num){
case 0:
s = "abc"
break;
case 1:
s = "bcd"
break;
case 2:
s = "cde"
break;
default:
s = "xyz"
}
switch case
코틀린에서는 스위치 케이스 구문이 직접 존재하지는 않고, when
구문을 사용해서 람다식으로 표현 해줍니다.
위의 자바 코드를 코틀린의 형태로 바꿔보면
var num:Int = 3
var s:String = when(num) {
0 -> "abc"
1 -> "bcd"
2 -> "cde"
else -> "xyz"
}
println(s) // xyz
아래와 같은 예시도 참고해볼 수 있습니다. 파라미터로 들어가는 값을 받아서 범위 내에 속하는 값인지 검사 후 grade
를 갱신합니다.
val score = 85.0
var grade:Char = 'F'
when(score){
in 90.0..100.0 -> grade = 'A'
in 80.0..89.9 -> grade = 'B'
in 70.0..79.9 -> grade = 'C'
!in 70.0..100.0 -> grade = 'F'
}
for each
구문for each
구문은 자바에서 향상된 for문이라고 불리는 것과 매우 유사합니다.
배열 내부를 하나씩 순회하며 원소에 대해 특정 작업을 하고자 할 때 익히 사용됩니다.
val array = arrayOf<Int>(1, 2, 3)
for(number in array){
println(number)
}
array
배열 내부를 순회하면서 원소를 하나씩 출력해줍니다.
자바에서 표준 for
루프라고 하면,
for(int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
이런 모양을 상상할 수 있지만, 코틀린에서는 지원하지 않는 문법입니다.
그래서 for each문을 사용해야 하는 것입니다.
물론 범위를 지정해 줄 수 있습니다.
for(i in 0 until 100){ // 0부터 99까지 순차적으로
println(i)
}
for(i in 0 downTo 100) { // 100부터 0까지 역순으로
println(i)
}
또한 step
이라는 옵션을 추가할 수 있는데, 이는 step만큼 건너뛰면서 값을 반환해줍니다.
for (i in 0 until 100 step 2){ // 0부터 99까지 2씩 증가하면서 출력
println(i)
}
while
과 do while
while
while
은 자바에서 살펴봤듯이 초기화 식이 있고 어떤 조건이 참일 때까지 처리식이 계속 반복되면서 증감연산이 이루어지는 구조로 되어 있습니다.
var w:Int = 0
while (w < 10){
println("w:$w")
w++
}
// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
do while
do while
은 while
과 다르게 조건식이 뒤에 나오기 때문에 조건이 참이든 거짓이든 우선 한번은 루프가 실행이 되고 그 이후부터 참거짓을 분별하여 루프를 도는 구조로 되어 있습니다.
var w:Int = 0
do{
w++
println("w:$w")
} while(w < 10)
// 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
break
와 continue
자바에서 살펴본 내용에 따르면 break
는 루프를 빠져나가는 제어자가 되고, continue
는 혼동하기 쉬우나 계속 하는 것이 아닌 스킵하는 것을 의미했습니다.
어떻게 사용하고 있는지 간단히 살펴봅시다.
for (i in 1..5){
if(i == 3) break
println(i)
} // 1부터 5까지 루프를 도는데 3이되면 반복문을 빠져나옴. (1, 2)
for(i in 1..5){
if(i == 4) continue
println(i)
} // 1부터 5까지 루프를 도는데 4일 때 스킵 (1, 2, 3, 5)