본문 바로가기
Java/Java

제어 키워드) break, continue 제어 키워드

by 박채니 2022. 3. 8.

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


제어키워드에는 break, continue 가 있습니다.

두 제어 키워드의 차이점에 대해서 알아보겠습니다.


☞ break 제어키워드

- if문을 제외한 가장 가까운 중괄호 ({ }) 1개를 탈출

- break를 만나는 즉시 반복문 탈출

public void test1() {
	int i = 1;
	while(i <= 50) {
		System.out.print(i + " ");
		if(i == 15) {
			//i가 15면 즉시 반복문 탈출
			break;
		}
		i++;
	}
}

@콘솔출력값
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

1~50까지 i의 값을 출력하는 while문을 만들고, 만약 i의 값이 15이라면 break로 반복문을 탈출하라는 코드를 만들었습니다.

만약 break가 없었다면 1~50까지 출력되었겠지만, break를 만나고 즉시 반복문을 탈출하여 1~15까지 출력되었습니다.

(for문으로도 만들 수 있음)

 

 

1부터 사용자 입력한 수까지 출력하기

public void test2() {
	Scanner sc = new Scanner(System.in);
	System.out.print("> 숫자를 입력하세요 : ");
	int input = sc.nextInt();
	
	//for문으로 구현
//	for(int i = 1; ;i++) {
//		System.out.print(i + " ");
//		if(i == input)
//			break;
//	}
		
	//while문으로 구현
	int i = 1;
	while(true) {
		System.out.print(i + " ");
		if(i == input)
			break;
		i++;
	}
}

@콘솔출력값
> 숫자를 입력하세요 : 20
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

무한루프를 구현하고 만일 사용자 입력 값이 i와 같다면 break! (즉시 반복문 탈출)

20을 출력하고 if문을 검사하여 조건이 true이므로 바로 무한루프를 탈출하여 1~20(사용자 입력 값)까지 출력되었습니다.

 

 

☞ continue 제어 키워드

- 반복 제어문의 닫힌 중괄호(}) 역할 (if문 제외)

- 닫힌 중괄호를 만난 것처럼 다음 반복을 위해 증감식 수행(for문) 혹은 조건식을 검색(while문)

- 이하 코드를 실행하지 않고 처음부터 다시 (Pass~)

 

for문에서의 continue (증감식으로 이동)

for(int i = 1; i <= 20; i++) {
	if(i % 2 != 0)
		continue;
	System.out.print(i + " ");
}

@콘솔출력값
2 4 6 8 10 12 14 16 18 20

1~20까지의 값을 출력하는 for문 내부에 만약 i를 2로 나눈 나머지가 0이 아니라면

즉! 홀수라면 continue, 아래 코드를 실행하지말고 pass~ 증감식으로 넘어가! 

따라서 i가 홀수라면 continue를 만나 i의 값을 출력하지 않고 증감식으로 pass하기 때문에 i++ 증감처리 되어 짝수만 출력됩니다.

 

while문에서의 continue (조건식으로 이동)

int i = 1; 

while(i <= 20) {
	//증감식 위치 매우 중요
	i++;
			
	if(i % 2 != 0)
		continue;
        
	System.out.print(i + " ");
}

@콘솔출력값
2 4 6 8 10 12 14 16 18 20

동일한 의미를 가진 while문을 만들어보았습니다.

while문은 continue를 만나면 증감식으로 가는 것이 아닌 조건식으로 이동하여 조건을 검사하게 됩니다.

따라서 해당 코드는 while조건이 true면 i++ 먼저 증감처리를 한 후 if절을 검사하여 i가 짝수면 false이므로 i값을 출력하게 됩니다.

만약 i가 홀수라면 if절이 true이므로 continue를 만나게 되어 조건식 (i <= 20)으로 이동한 후 while조건이 true면 다시 내부의 증감식과 실행 코드들을 실행하게 됩니다.

 

※ while문의 continue 사용 시 주의해야 하는 것!!!

while문의 증감식의 위치는 for문에 비하여 자유분방합니다. 따라서 증감식의 위치에 따라 무한루프에 빠질 수도 있습니다.

//잘못된 코드!!
int i = 1; 
		
while(i <= 20) {
	if(i % 2 != 0)
		continue;
			
	System.out.print(i + " ");
			
	i++;
}

@콘솔출력값
출력없음 - 무한루프에 빠짐

상황에 따라 다르겠지만, while문의 증감식은 대부분 위와 같이 실행구문의 마지막에 써왔습니다.

다만, continue가 있는 while문의 경우 위와 같은 코드를 구현하면 무한루프에 빠지게 됩니다. 

 

그 이유는?

현재 i의 값이 1이고 i가 20보다 작기 때문에 while문 내부의 실행 구문들을 실행하게 되고, if절을 만납니다.

1(i) % 2 != 0, 1을 2로 나눈 나머지가 0이 아니므로 if절의 조건은 true! 즉 continue를 실행 해야 합니다.

그렇다면 아래의 print구문과 i++ 증감식을 만나지 못하고 조건식으로 pass하게 됩니다.

그렇다면 i는 증감처리 되지 않은 그대로 1인 상태일 것이고 위의 절차를 똑같이 반복하게 되어 무한루프에 빠지게 됩니다.

 

따라서 while문의 continue를 사용할 때는 반드시 증감식의 위치 등을 잘 고려하여 코드를 구현해야 합니다.

 

 

1부터 사용자 입력 값까지 홀수의 합 구하기

public void test4() {
	Scanner sc = new Scanner(System.in);
	System.out.print("> 숫자를 입력하세요 : ");
	int input = sc.nextInt();
		
	//누적변수
	int sum = 0; 
		
	//for문으로 구현
//	for(int i = 1; i <= input; i++) {
//		if(i % 2 == 0)
//			continue;
//		sum+=i;
//	}
		
	//while문으로 구현
	int i = 0;
	while(i < input) {
		i++;
		if(i % 2 == 0)
			continue;
		sum+=i;
	}	
	System.out.printf("1부터 %d까지의 홀수의 합은 %d입니다.\n", input, sum);
}

@콘솔출력값
> 숫자를 입력하세요 : 6
1부터 6까지의 홀수의 합은 9입니다.

while문으로 구현할 때 처음에 이상한 결과가 나와서 이유 파악을 못했었습니다.

for문과 비교하여 증감식이 제일 처음 실행되므로 i의 값을 0으로 지정하여 while문 내부에선 1부터 검사하게끔 해야 된다는 것을 생각하고 코드를 구현해보았지만 그래도 이상한 결과가 나왔습니다.

 

그 이유는?

//처음에 짜본 코드 - 잘못된 코드!!
int i = 0;

while(i <= input) {
	i++;
	if(i % 2 == 0)
		continue;
	sum+=i;
}

@콘솔출력값
> 숫자를 입력하세요 : 6
1부터 6까지의 홀수의 합은 16입니다. //이상한 값이 나옴

처음에 이렇게 코드를 짰는데 원인은 while문 조건식의 부등호 때문이였습니다.

만약 input(사용자 입력 값)이 6이고, 코드가 몇 번 실행 된 후 i 값이 5라고 가정해보았을 때,

5 <= 6, true이므로 i++ → i는 6이 될 것이고, if절 검사 6은 짝수이므로 continue → 조건식으로 이동하게 되고 6 <= 6 true이므로

다시 i++ → i는 7이 될 것이고, if절 검사 7은 홀수 이므로 sum에 7을 더하게 될 것입니다.

 

하지만 제가 원한 것은 1~사용자 입력 값(input).. 즉, 1~6 사이의 홀수의 합을 원한 것인데 범위를 벗어난 7을 또 sum에 더하게 된 것이죠.

따라서 같은 수를 입력해도 다른 결과가 출력되었던 것입니다.

 

while문의 continue 사용에는 코드의 순서를 잘 파악하여 그에 맞는 초기식, 조건식을 작성해야 합니다.