04_제어문(분기문 -break문, continue문)
조건문 또는 반복문과 함께 쓰이며 "보조" 해 주는 역할
=> 선택 또는 반복 그 이외의 흐름을 제어하는 역할
*분기문
1. break문: 반복문 안에서 반복문을 빠져나가는 역할
2. continue문: 반복문 안에서 그 뒤의 코드는 무시하고 바로 다음 증감식으로 넘어가는 역할
*break문
반복문 안에서 break문을 만나는 순간 "가장 가까운 내가 포함된 반복문" 한 겹만 빠져나가는 구문
즉, 해당 break문이 속해 있는 반복문만을 빠져나가는 구문
*주의할 점 : switch문 안의 break와는 다른 개념
switch문 안의 break는 해당 switch 중괄호 영역을 빠져나가는 역할
반복문 안의 break는 해당 반복문 중괄호 영역을 빠져나가는 역할
public void method1() {
// 매번 새로이 반복적으로 발생되는 랜덤값(1 ~ 100 사이의 정수) 출력
// 단, 그 랜덤값이 홀수일 경우는 반복문을 빠져나가게끔
while(true) { // 무한 반복
int random = (int)(Math.random() * 100) + 1; // 랜덤값 뽑기
if(random % 2 == 1) { // random 값이 홀수일 경우 => 반복문을 빠져나감
break;
}
else { // random 값이 짝수일 경우 => 출력
System.out.println("random: " + random);
}
}
System.out.println("반복문을 빠져나왔음");
}
public void method2() {
// 매번 사용자에게 문자열을 입력받고 해당 문자열의 길이를 출력
// 단, 사용자가 "exit"라는 문자열을 입력하는 순간 반복문을 빠져나가게끔
Scanner sc = new Scanner(System.in);
while(true) {
System.out.print("문자열 입력: ");
String str = sc.nextLine();
// 만약 str에 들어 있는 문자열의 내용물이 "exit"라면 반복문을 빠져나감
if(str.equals("exit")) {
break;
// break; 대신 return; 을 쓴다면?
// 해당 메소드를 호출한 BranchRun 클래스로 가 버리므로 이 밑으로는 실행되지 않음
}
// else를 써도 되지만 if문에서 조건을 충족하지 않으면 if문을 빠져나오므로 자동으로 얘 실행됨
System.out.println(str + " 의 글자 수 길이: " + str.length());
}
// 위에서 break; 대신 return;을 썼다면 해당 줄 밑으로는 "Unreachable code: 도달할 수 없는 코드"
// exit이 입력되었을 때 break를 만나 해당 반복문을 빠져나옴
System.out.println("프로그램이 종료됩니다.");
}
public void method3() {
// 매번 반복적으로 사용자로부터 양수를 입력받아 1 ~ 해당 그 수까지 출력
// 단, 정상적으로 양수를 입력했을 경우에만 출력
// 만약에, 잘못 입력했을 경우 "다시 입력해 주세요"
Scanner sc = new Scanner(System.in);
/*
System.out.print("양수 입력: ");
int num = sc.nextInt();
sc.nextLine(); // 이렇게 쓰면 한 번 입력받고 끝!
*/
while(true) { // 이 구문에 넣어 줌으로써 무한 반복
System.out.print("양수 입력: ");
int num = sc.nextInt();
sc.nextLine();
// num을 잘 입력받은 시점에서 유효한 양수인지 확인부터!
if(num > 0) { // 양수일 경우
// 1에서부터 num까지 순차적으로 한줄에 연이어서 출력
for(int i = 1; i <= num; i++) {
System.out.print(i + " ");
} // 1 2 3 4 ... num 한 줄 완성
break; // 현재 내가 포함된 while(true)를 빠져나가는 역할
}
else { // 양수가 아닐 경우
System.out.println("다시 입력해 주세요");
}
}
}
}
*continue문
반복문 안의 조건문에서 사용하는 구문
continue문을 만나게 되면 그 뒤에 어떤 구문이 오든 간에 실행하지 않고
가장 가까운 반복문의 증감식으로 올라가라는 뜻이 됨
break: 반복문을 빠져나가라
continue: 반복문의 증감식으로 올라가라
public void method1() {
// 1부터 10까지 홀수만을 출력
// 1 3 5 7 9
// 방법 1. i 값을 매번 2씩 증가하는 방법
/*
for(int i = 1; i < 10; i += 2) {
System.out.print(i + " ");
}
*/
// 방법 2. 반복문을 돌 때마다 바로 출력하는 게 아니라 홀수인지 판별 후 홀수일 때만 출력 (10번을 돌고, 10번 검사하되 조건에 맞는 것만 출력)
/*
for(int i = 1; i <= 10; i++) {
if(i % 2 == 1) {
System.out.print(i + " ");
}
}
*/
// 방법 3. continue문을 이용하는 방법
for(int i = 1; i <= 10; i++) {
if(i % 2 == 0) {
continue; // i가 짝수라면 이 뒤에 무슨 코드가 있든 무시하고 다음 증감식으로 올라가 주세요
}
System.out.print(i + " ");
}
}
*continue문 흐름
continue => 해당 조건일 때는 아무것도 하지 말고 증감식으로 넘어가!라는 뜻으로 보통 continue를 안 쓸 때와 비교하면 조건이 뒤집힘
public void method2() {
// 1부터 100까지의 총 합계
// 단, 6의 배수 값은 건너뛰고 더하기
// continue문 없는 버전
/*
int sum = 0;
for(int i = 1; i <= 100; i++) {
if(i % 6 != 0) { // 6의 배수가 아닐 경우
sum += i;
}
}
System.out.println("sum: " + sum);
*/
// continue문이 있는 버전
int sum = 0;
for (int i = 1; i <= 100; i++) {
if ( i % 6 == 0) { // 6의 배수일 경우
continue;
}
sum += i;
}
}
public void method3() {
/* 2단 ~ 9단까지 모두 출력하되
* 단, 4의 배수 단인 4단, 8단 제외하고 출력하세요
*
* 중첩 for문 + continue
*/
// continue 있는 버전
for(int i = 2; i <= 9; i++) {
// i가 4의 배수일 경우는 뒤의 코드를 무시하고 바로 다음 증감식으로 넘어가겠다
if(i % 4 == 0) {
continue;
}
System.out.printf("----- %d단 ----- \n", i);
for(int j = 1; j <= 9 ; j++) {
System.out.printf("%d * %d = %d \n", i, j, (i*j));
}
}
// continue 없는 버전
/*
for(int i = 2; i <= 9; i++) {
// 출력을 하긴 하되, 4의 배수가 아닌 단수에서만 출력하기
if(i % 4 != 0) {
System.out.printf("----- %d단 ----- \n", i);
for(int j =1; j <= 9; j++) {
System.out.printf("%d * %d = %d \n", i, j, (i*j));
}
}
}
*/
}
}