Kotlin Programming Intermediate - 3

htwenty-1·2022년 1월 24일
0

Kotlin for Android

목록 보기
3/11
post-thumbnail

코틀린 프로그래밍 세번째.

제어문입니다. 자바에서 제어문은 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의 쓰임

"AB이다"를 영어 문장으로 표현하면 "A is B"가 됩니다. 마찬가지로 어떤 변수가 특정 자료형인지 아닌지를 boolean 값으로 반환해주는 것이 있는데 이것이 바로 is입니다.

예를 들어서

var num:Int = 50

if (num is Int) {
	println("num은 숫자임")
} else {
	println("num은 숫자가 아님")
}

라고 한다면 numInt 형태인지 조건을 따져서 해당하는 메시지를 출력하게 해줍니다.

논리연산자 &&   ||   and   or

자바에서 사용하는 논리연산자 &&, ||를 그대로 사용할 수 있습니다. 뿐만 아니라 파이썬에서 사용하는 andor 연산자도 대응합니다.

이 때, && == 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 구문


Java에서의 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"
}

Kotlin의 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)
}

whiledo 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 whilewhile과 다르게 조건식이 뒤에 나오기 때문에 조건이 참이든 거짓이든 우선 한번은 루프가 실행이 되고 그 이후부터 참거짓을 분별하여 루프를 도는 구조로 되어 있습니다.

var w:Int = 0
do{
	w++
	println("w:$w")
} while(w < 10)

// 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

breakcontinue

기본 개념

자바에서 살펴본 내용에 따르면 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)
profile
tried ? drinkCoffee : keepGoing;

0개의 댓글