본문 바로가기
개발일지

Kotlin의 반복문 활용

by 앱또웹 2024. 11. 27.
728x90
반응형

코틀린(Kotlin)에서 '반복문'을 사용하는 방법 고고씽!

2024.11.26 - [개발일지] - 코틀린(Kotlin)의 if, else, switch

 

코틀린(Kotlin)의 if, else, switch

2024.11.25 - [개발일지] - 코드 오타도 없는데 왜 오류가 발생하지? 자바(Java)의 if, else, switch 코드 오타도 없는데 왜 오류가 발생하지? 자바(Java)의 if, else, switchControlJavaActivity.javapackage com.example.kotlin

app-of-web.tistory.com

위 링크에서 '분기 제어문' 학습했으니

이젠 '반복문' 익힐 차례 입니닷!

 

코틀린(Kotlin)의 반복문 역시 자바(Java) 언어와 큰 차이가 없어요

그러니 Java와의 차이점 위주로 알아보시죠!

먼저 코틀린의 반복문을 보기 전에 Java의 반복문을 복습해 보겠습니다

for(int i = 0; i < 100; i++) {
	System.out.println(i);
}

다음 Java언어에서 'for문'의 기본적인 행태입니다

'for' 키워드 괄호 안에 '초기값, 조건식, 증감식'을 설정하고

각각 세미콜론(;)으로 분리합니다

 

하지만 위와 같은 방식은 'Collection'에서 원소를 가져올 때 상당히 불편합니다

대개의 경우 집합으로 이루어진 데이터 처리가 많기에

Java에서 향상된 for문이라고 불리는 형태로 지원합니다

String[] array = {"apple", "banana"};
for(String item : array) {
	System.out.println(item);
}

한편 코틀린의 for문은 Java의 향상된 for문장과 많이 비슷합니다

코틀린에서 가장 일반적인 사용하는 for문은

for(item in collection) {
	println(item)
}

이때 Java에서 같이 특정 숫자값을 반복하기 위한 방법은

for(i in 0..100) {
	println(i)
}

앞서 when문에서 익혔던 대로,

코틀린은 범위(..)를 표현할 수 있습니다

또한 간혹 'list'를 다루면서 '인덱스'가 필요한 경우가 있습니다

val collection = mutableListOf<String>("apple", "banana")
for ((index, value) in collection.withIndex()) {
	printIn("the element at $index is $value")
}

 

다음으로 살펴볼 것은 또 다른 반복문 중 하나인 'while문'의 사용입니다

코틀린 역시 자바와 마찬가지로 'while문'과 'do ~ while문'을 같이 지원합니다

while문의 경우 거의 차이가 없고

코틀린에서의 사용법만 알아봅시다

var x = 0
while(x < 4) {
	x++
}

'do ~ while문'의 경우 자바와 비슷하지만 한 가지 다른 점은

마지막 조건식의 'do 블럭' 내부 변수에 접근하는 것입니다!

do {
	val y = retrieveData()
} while (y != null) // 여기서 do 블럭 내부의 변수 y에 접근 가능

// 여기서부터는 y에 접근 불가

자바의 경우 while조건식에서 do블럭 내부의 변수에는 접근할 수 없습니다

따라서 앞의 코드가 자바라면 다음과 같이 작성되죠!

Object y = null;

do {
	y = retrieveData();
} while (y != null);

// 블럭 밖에 y가 선언되어 있으므로 밖에서도 접근 가능

변수 'y'는 블럭내부에서만 사용 후 밖에서 선언하는 것은 비효율적입니다

밖에 변수를 선언 이후 추가되는 변수를 이름 짓는 것도 까다롭습니다

그래서 코틀린은 'do ~ while문'의 while 조건식에서 do 블럭 내의 변수도 접근 가능토록 허용

마지막으로 살펴볼 부분은 '조건문이나 루프를 빠져나올 수 있는 방법'

Java언어에서는 'break' 키워드를 이용해 빠져나올 수 있었죠

다음 자바에서 'break문'을 통해 루프를 빠져나오는 방법입니다

while(true) {
	Object x = retrieveData();
    if(x == null) break;
}

// break 이후 while 문을 빠져나오게 됨

break는 이렇게 반복문을 중단 후 빠져나오는 키워드로 중첩된 루프에 break를 사용하는 경우

break 키워드가 포함된 반복문만 빠져나옵니다

다음 코드는 중첩된 루프에 break가 사용된 경웁니다

while(true) {
	Object x = retrieveData();
    // 여기 사용된 break 문은 전체루프를 중단하고 빠져나가게 됨
    if(x == null_ break;
    else {
    	while(true) {
        	Object y = getData();
            // 여기 사용된 break 문은 실행되도 전체루프에서 빠져나가지는 않음
            if(y == null) break;
        }
    }
}

break키워드는 '자신이 포함된' 반복 루프만 빠져나가게 합니다

문제는 반복문의 중첩이 복잡해지고 break키워드가 자주 쓰이며 정확히 어느 루프를 빠져나가 어느 코드가 실행되는 것인지 짐작이 어려워진다는 점이죠

코틀린은 이런 문제를 해결하기 위해 '레이블'을 지원합니다

레이블은 'break' 또는 'return' 이후 어디로 점프하는지 마킹을 해 두는 것과 비슷합니다

레이블을 선언할 때는 이름 뒤에 '@' 기호를 붙이고,

선언한 레이블을 사용할 때는 @ 기호 뒤에 레이블 이름을 지정하여 사용합니다

loopl@ while(true) {
	var x = retrieveData()
    if(x == null) break@loopl
    else {
    	loop2@ while(true) {
        	var y = getData()
            if(y == null) break@loop2
        }
    }
}

코틀린에 '레이블'을 사용한 코드입니다

이렇게 레이블을 사용함으로써 루프가 복잡하더라도 블럭 빠져나올 때 '어느 블럭을 빠져나가는지' 보다 명료하게 알 수 있다

이는 또한 중첩된 반복문에서 바로 모든 반복문을 빠져나갈 때에도 유용합니다

loop@ for (i in 1..100) {
	for (j in 1..100) {
    	if (...) break@loop
    }
}

이처럼 중첩된 for문 중 '내부의 for문에서' 모든 반복문을 바로 빠져나가게 되어 매우 편합니다

마지막으로 자바의 반복문인 for, while문에는 스텝을 한 번 건너뛰는 'continue' 키워드가 존재하는데

코틀린 또한 마찬가지로 'continue' 키워드를 사용하여 스텝을 건너뛸 수 있습니다

@Test
fun loopContinueTest() {
	for(i in 1..10) {
    	// 짝수인 경우 스텝을 건너뛴다
        if(i % 2 == 0) continue
        print(i)
    }
}

위 함수 실행 시 '13579'가 출력되는데

짝수인 경우 스텝을 건너뛰게 되기 때문이죠

  • 코틀린의 조건문은 Java와 같은 방법으로 if ~ else문 사용 가능
  • when문은 swich문과 다중 if ~ else문을 대체할 수 있으며 훨씬 더 간결
  • 코틀린은 반복문으로 'for, whilde, do ~ while'문 사용
  • 코틀린의 for문은 Java의 향상된 for문과 사용법이 유사
  • 코틀린의 do ~ while문은 Java와 유사하지만, do 블럭에서 while블럭의 변수에 접근 가능
  • 코틀린의 'continue'키워드는 자바의 'continue' 키워드처럼 loop를 건너뛰는 역할
  • 코틀린은 반복문에 레이블 지정 가능, break문 사용 시 해당 레이블로 빠져나갈 수 있다

728x90
반응형