F.R.I.D.A.Y.

Kotlin: 10 반복문-for 본문

DEV/Kotlin

Kotlin: 10 반복문-for

F.R.I.D.A.Y. 2020. 4. 3. 23:02
반응형

 만일 100개의 정보를 일일이 확인하는 과정을 직접 손으로 작성해야 한다면, 어떻게 하실 건가요? 오늘은 분기 제어 구문과 함께 프로그램에서 양대 산맥으로 생각할 수 있는 반복문에 대해 알아봅니다.


for 구문

 많은 경우에서 사용하는 for 구문입니다. while, do-while 반복문에 비해 높은 사용 비중을 가지고 있습니다.[# 초기화, 종결, 증감 식이 한 줄에 표현되어있기 때문이라는 것이 우세합니다.]

 코틀린에서는 아래처럼 for 구문을 구성할 수 있습니다.

구조

for(bar in (min)..(max)){
    //commands
}

 bar는 for 구문이 반복되며 증감하는 값을 가지는 변수입니다. 기존의 변수 선언 방식에서 사용하는 var를 for 반복문에서는 사용할 수 없습니다.

사용

 실제 코드 구성을 볼까요? 다음에 보이는 코드는 1부터 10까지의 숫자를 차례로 출력하는 반복문입니다.

fun main(args:Array<String>){
    for(i in 1..10){
        println(i)
    }
}

 if 구문에서도 설명했지만, for 반복 구문에서도 만일 반복하는 명령문이 하나라면 중괄호를 제거할 수 있습니다.

for(i in 1..10) println(i)

 Quiz. 10에서 1까지 역순으로 출력해보기

 1부터 10까지의 숫자 출력은 배워 봤습니다. 그렇다면 10에서 1까지 역으로 출력해볼까요?

fun main(args:Array<String>){
	for(i in 10..1){
		println(i)
	}
}

 이렇게 작성해봤나요? 프로그램을 실행해보면 아무것도 출력되지 않을 것입니다. 아무것도 출력되지 않았다면 정상입니다.[# 만일 이렇게 코드를 구성했는데 오류/경고 등의 문구가 아닌 정상 실행이 된다면...? 코틀린 문법이 언제 바뀌었나요?]


범위 연산자의 확장

 이전 문단의 퀴즈의 해답을 여기에서 알 수 있습니다. 우리는 여태 범위 연산자로 <in (min)..(max)>만 배웠습니다. 그러나 이는 가장 기초적인 범위 연산자입니다. in 키워드 뒤에 자리하는 (min)..(max) 부분을 대체하는 다른 여러 키워드도 존재합니다.

downTo(하행)

 기존에 배웠던 점 두 개[# ..]를 사용하는 범위 연산자가 상행 범위 연산자라면 downTo를 이용하는 범위 연산자는 하행 범위 연산자라고 생각할 수 있습니다. 말 그대로 밑으로 내려간다는 말인데요, 다음 코드를 보겠습니다.

fun main(args:Array<String>){
	for(i in 10..1){
		println(i)
	}
}

 우리는 10부터 1까지 출력하기 위해 점 두 개를 이용하는 범위 연산자를 사용했습니다. 이는 출력되지 않았죠. 그렇다면, 점 두 개를 downTo로 변경해보겠습니다.

fun main(args:Array<String>){
	for(i in 10 downTo 1){
		println(i)
	}
}

10부터 1까지 출력되는 모습

 원하는 대로 출력되었네요! 다른 언어[# C/C++, java 등]에서는 하행 범위를 원할 때 증감식 부분에 감소식을 넣어주면 되었지만 코틀린에서는 downTo라는 키워드를 이용해 범위를 구성해야 합니다.

step

 또 한 가지, step 키워드도 존재합니다. 이번엔 1부터 10까지의 수 중에서 홀수만 출력해보도록 하죠.

fun main(args:Array<String>){
	for(i in 1..10){
		if(i % 2 == 1) println(i)
	}
}

 if 구문과 나머지 연산자[#% modulo operator]를 이용해 2로 나눈 나머지가 1인 경우[# 홀수] 값을 출력하도록 했습니다.

홀수만 출력된 모습

 그러나 이 방식은 어떻게 보면 무식한 방법이라고 할 수 있습니다. 잠시 아래 코드를 보겠습니다.

fun main(args:Array<String>){
	for(i in 1..10){
		println("$i: ${i % 2 == 1}")
	}
}

 검사하는 숫자가 홀수인지를 판단하는 코드입니다. 만일 홀수라면 True가, 그렇지 않다면 False가 나오도록 구성되어있죠.

 출력 결과를 보면, 1부터 10까지 모두 검사하는 것을 알 수 있습니다. 1부터 10까지 모두 검사하는 것은 좋지 않습니다. 우리는 이미 홀수는 2로 나누었을 때 나머지가 존재하는 수라는 것을 알고 있습니다. 자연수의 가장 작은 수는 1이죠. 1부터 10까지 2씩 더해가면 1, 3, 5, 7, 9 다섯 개의 수가 존재합니다. 이들만 출력하면 되죠.

 

 그래서 필요한 것이 step 키워드입니다. step 키워드는 범위 연산자와 함께 사용되어 증감하는 범위를 결정합니다.

fun main(args:Array<String>){
	for(i in 1..10 step 2){
		println("$i: ${i % 2 == 1}")
	}
}

 그래서 이 코드를 실행하면, 다섯 번의 반복과 출력하는 모든 수가 true. 즉, 홀수라는 것을 알 수 있습니다.

 달리 이야기하면, step 키워드를 입력하지 않았을 때 아래처럼 구성되었다고 볼 수 있겠네요.

fun main(args:Array<String>){
	for(i in 1..10 step 1){
		println("$i: ${i % 2 == 1}")
	}
}
더보기

# step 키워드를 사용할 때 주의할 점

 step 키워드로 증감하는 값을 입력할 때는 무조건 양수를 입력해야 합니다.

step 증감식에 음수(-1)를 입력했을 때 발생하는 오류

 이미 범위 연산에서 상행할지, 하행할지를 결정했기 때문에 제공을 안 하는 것이라 생각합니다.

until

 여태는 1..10이라 하면 10을 포함하도록 반복을 했습니다. 그러나 until 키워드를 이용하면 마지막 반복을 하지 않습니다. 정확히는 입력한 수보다 하나 낮은 만큼 반복이 이루어지도록 구성됩니다.

until 키워드를 이용해 반복문을 구성한 모습. 입력한 10보다 하나 낮은 9까지만 반복이 이뤄진다.


함수와의 연계

 일전에 함수의 가변 배열 사용하기에서 반복문 파트에서 다루겠다고 한 것이 있습니다.

<07 함수> 포스트에서 발췌

 우리가 vararg 키워드를 이용하면 가변 인자를 받을 수 있는 매개 변수를 선언할 수 있다고 했습니다.

vararg로 선언한 매개 변수는 iterable. 즉, 순회 가능한 객체[# 연필이란, 흑연 심을 나무로 감싸 글 등을 쓸 때 사용하는 물건을 의미합니다. 이때, 연필이란 단어가 아닌 물건을 객체로 볼 수 있습니다.\n나중에 배우겠지만 클래스라는 도면을 바탕으로 실체화된 대상이라 생각하면 됩니다.]가 됩니다.

Keyword: in

 in 키워드를 이용하면 순회 가능한 객체에 접근할 수 있습니다.

fun vArgTest(vararg args:Int){
    for(v in args){
        println(v)
    }
}

 

1부터 10까지 출력이 되는 모습

 

 여태 다른 언어를 사용해본 사람으로서, in 키워드는 추후에 배우게 될 배열 등과 같은 자료구조에서 유용하게 사용될 겁니다.

 여기에서 이 in 키워드를 다루기에는 시기상조인 것 같습니다. 이후에 또다시, 그리고 더 깊게. in 키워드를 포함한 여러 내용을 배우겠습니다.


Reference.

 

Loops - Kotlin Programming Language

 

kotlinlang.org


다음 시간에는 또 다른 반복 구문, while과 do-while에 대해 알아봅니다.

Next.

 

Kotlin: 11 반복문-while, do-while

이전 시간에 for 구문에 대해 알아봤습니다. 이번엔 while, do-while 반복문에 대해 알아보겠습니다. while 구문 사람마다 성향 차이가 있듯이 코드를 작성하는 사람마다 선호하는 반복문이 있습니다. 그래서 여..

pang2h.tistory.com

# index

728x90
반응형

'DEV > Kotlin' 카테고리의 다른 글

Kotlin: 12 흐름 제어하기  (0) 2020.04.04
Kotlin: 11 반복문-while, do-while  (0) 2020.04.03
Kotlin: 09 분기 제어-when  (0) 2020.04.02
Kotlin: 08 분기 제어-if  (0) 2020.04.01
Kotlin: 07 함수  (0) 2020.03.31
Comments