728x90
반응형

이전 글에서 흐름제어에 대해 알아보았습니다.


이번에는 흐름제어에서 반복문을 좀 더 유연하게 사용할 수 있게 하는 break와 continue에 대해 알아보겠습니다.


먼저 간단하게 개념에 대해 이야기하겠습니다.

break는 멈춘다는 의미로 가장 가까이에 있는 반복문을 멈추고 밖으로 나가는 명령어입니다.

continue는 계속한다는 의미로 반복문의 한 사이클을 중간에 멈추고 다음 사이클을 실행하라는 명령어입니다.


간단한 예로 시작 하겠습니다.

for (i in 1..3) {
for (j in 1..3) {
println("${i} * ${j} = ${i * j}")
}
}


i가 1부터 3까지 반복하면서

j가 1부터 3까지 반복하면서

${i} * ${j} = ${i * j}를 출력하는 코드입니다.


그러면 중간에 변화를 주겠습니다.


for (i in 1..3) {
for (j in 1..3) {
if (i * j == 6) {
break
}
println("${i} * ${j} = ${i * j}")
}
}


2 * 3 = 6

3 * 2 = 6

3 * 3 = 9

이렇게 3개의 결과가 출력되지 않는 것을 확인 할 수 있습니다.


그 이유는 i * j가 6이 되는 시점에 j가 속해있는 for문을 break로 인해 멈추기 밖으로 나가기 때문입니다.


for (i in 1..3) {
for (j in 1..3) {
if (i * j == 6) {
continue
}
println("${i} * ${j} = ${i * j}")
}
}


이번에는 break와는 다르게

3 * 3 = 9

가 출력이 되었습니다.


그 이유는 continue는 반복문 자체를 멈추는 것이 아니라 현재 반복문의 한 사이클을 멈추고 다음 사이클을 실행하기 때문입니다.

그래서 i * j의 값이 6이 되는 부분만 출력하지 않고 나머지 반복문을 계속 진행하는 것입니다.




다음은 java에는 없고 c를 배울 때 사용 했던 goto문과 비슷한 것에 대해 알아보겠습니다.

바로 break와 continue에 label를 붙이는 것입니다.


loop1@ for (i in 1..3) {
loop2@ for (j in 1..3) {
if (i * j == 6) {
continue@loop1
}
println("${i} * ${j} = ${i * j}")
}
}


for앞에 loop1@라는 라벨이 생겼습니다.

continue뒤에 @loop1라는 라벨이 생겼습니다.


결과값은 break문과 동일합니다.

그 이유는 i가 속해있는 for문에 loop1라는 라벨을 넣어주고 continue에서 loop1 라벨을 붙여주었고 그로 인해 loop1으로 점프한 효과를 볼 수 있기 때문입니다.


loop1@ for (i in 1..3) {
loop2@ for (j in 1..3) {
if (i * j == 6) {
break@loop1
}
println("${i} * ${j} = ${i * j}")
}
}


이제는 continue대신 break에 라벨을 붙여봤습니다.


이제는 i * j가 6일 때 loop1라벨이 붙은 반복문을 break해버립니다.

그래서 결과가 2 * 3 = 6일 때 i가 속해있는 반복문이 멈추게 됩니다.


이렇게 라벨을 사용하게 되면 이중포문 혹은 삼중포문에서 탈출을 한번에 할 수 있는 효과를 볼 수 있습니다.

728x90
반응형

+ Recent posts