코린이의 소소한 공부노트

제어문과 블록, 특별한 키워드 본문

Java

제어문과 블록, 특별한 키워드

무지맘 2022. 1. 3. 20:33

자바는 main의 위쪽부터 아래쪽으로 순서대로 코드를 실행해 나간다.

public static void main(String args[]) {
// 첫 번째 실행
// 두 번째 실행
// 세 번째 실행
// ...
}

그런데 이런 순서를 깨고 흐름을 바꿀 수 있는 문장이 있다. 이것을 제어문이라고 한다.

 

제어문에는 조건문과 반복문 2가지가 있다.

1. 조건문: 조건이 참인 경우에만 블록 안의 코드를 실행한다.

  - if문: 2022.01.04 - [Java] - 제어문 1. 조건문 - if, else if, else

  - switch문: 2022.01.05 - [Java] - 제어문 1. 조건문 - switch

2. 반복문: 조건이 참인 동안에만 블록 안의 코드를 실행한다.

  - for문: 2022.01.07 - [Java] - 제어문 2. 반복문 - for

  - while문: 2022.01.08 - [Java] - 제어문 2. 반복문 - while, do-while

 

제어문을 이용할 때는 꼭 필요한 친구가 있다. 블록이라는 것인데, 블록은 코드를 중괄호{ }로 묶은 부분을 뜻한다. if문이 참일 경우 실행되는 블록을 if블록이라 부르듯이 어떤 문장과 함께냐에 따라 이름을 붙여주면 된다. 해당 블록에 1개의 문장만 있다면 중괄호를 생략할 수 있다.

코드를 묶어서 나타내는 이유에는

1. 가독성을 위한 것도 있고

2. 어떤 블록에 속하는지 정해줘야 하기 때문이다.

예를 들어보겠다. num이 양수인지 아닌지 따져보고 글을 출력하는 코드를 작성해보았다.

int num = 1;
		
if ( num > 0 )
	System.out.printf("숫자 %d의 정체는 ", num);
	System.out.println("양수입니다.");
else
	System.out.println("양수가 아닙니다.");
    
// Syntax error on token "else", delete this token

원래 의도라면 "숫자 1의 정체는 양수입니다."가 나와야 하지만, 에러가 발생하면서 else를 지우라는 메시지가 나왔다.

우리가 의도한 if블록은 2줄이지만, { }를 쓰지 않았기 때문에 실제로는 printf()만 if블록이 된 것이고, 그다음 줄인 println()은 제어문인 if문을 빠져나와서 실행되는 main의 문장이 된 것이다. if문이 끝난 후 나오는 else는 짝지을 if가 없어서 에러를 발생시킨 것이다.

이 코드를 의도대로 실행시키고 싶다면 { }로 if블록을 지정해줘야 한다.

int num = 1;
		
if ( num > 0 ) {
	System.out.printf("숫자 %d의 정체는 ", num);
	System.out.println("양수입니다.");
}
else
	System.out.println("양수가 아닙니다.");

// "숫자 1의 정체는 양수입니다."

 

제어문에서 쓰이는 또 다른 친구인 breakcontinue가 있다. 제어문이 main의 흐름을 바꿔서 조건부/반복 수행을 하는 문장인데, 이 흐름을 사용자의 의도에 맞게 바꾸는 키워드이다.

1. break

  - 자신이 포함된 제어문 1개를 벗어난다.

  - 즉, break를 만나면 아래 코드를 수행하지 않은 채 제어문을 빠져나온다.

  - 무한 반복문에서 빠져나올 때 많이 쓰인다.

2. continue

  - 자신이 포함된 제어문의 맨 끝으로 이동한다.

  - 즉, continue를 만나면 아래 코드를 수행하지 않은 채 제어문의 처음으로 돌아간다.

  - 제어문을 벗어나는 것이 아니기 때문에, 반복문의 경우에는 다음 반복이 수행된다.

  - 건너뛰어야 할 조건이 있는 반복문에서 많이 쓰인다.

int i = 0;

// 1부터 9까지 한 줄에 출력

// 1) break
while(++i <= 9) {
	if (i == 7)
		break;
	System.out.print(i);
}					// 결과: 123456

i=0;

// 2) continue
while(++i <= 9) {
	if (i == 7)
		continue;
	System.out.print(i);
}					// 결과: 12345689

이것만 봐도 확실한 차이를 알 수 있다. i의 값이 7이 되었을 때

  - break를 만나면 while문을 빠져나온다. 그래서 6까지만 출력되었다.

  - continue를 만나면 print() 수행 없이 바로 while문의 끝으로 간다. 그래서 7을 뺀 나머지 숫자가 출력되었다.

 

사용자의 입력을 받아서 무언가를 수행하는 코드를 만들면 보통 break와 continue를 같이 쓰게 된다. 예를 하나 들어보려 한다. 아래 그림은 코드가 어떻게 동작하는지 나타낸다. 코드가 다소 길기 때문에 천천히 읽어보면서 이해해보면 좋을 듯하다.

[그림] 사용자에게 1에서 100까지의 정수 중 1개를 입력 받아 수행 결과를 반환하는 프로그램

int menu = 0; // 메뉴 번호
int input = 0; // 사용자 입력 정수. 1~100
Scanner scanner = new Scanner(System.in);
while(true) {
	// 1) 메뉴 선정
	System.out.println("1. 제곱 스테이크");
	System.out.println("2. 루트 샐러드");
	System.out.println("3. 7배 사이다");
	System.out.print("원하는 메뉴(1~3)를 선택하세요.(종료:0)>");
	menu = Integer.parseInt(scanner.nextLine()); // 메뉴 입력 받음

	if(menu==0) {
		System.out.println("프로그램을 종료합니다.");
		break; // while문을 벗어남
	} else if (!(1 <= menu && menu <= 3)) {
		System.out.println("메뉴를 잘못 선택하셨습니다.(종료는 0)");
		continue;	 // 메뉴 선정으로 돌아감	
	}
	// 메뉴 선정 완료
	System.out.println("선택하신 메뉴는 " + menu + "번입니다.");

// 2) 메뉴에 따른 수행
	System.out.print("원하는 숫자(1~100)를 선택하세요.(종료:0)>");
	input = Integer.parseInt(scanner.nextLine());
	if(input==0) {
		System.out.println("프로그램을 종료합니다.");
		break; // while문을 벗어남
	}
	// 1~100 사이의 정수만 입력한다고 가정
	switch(menu) {
		case 1:
			System.out.println(input + " - 제곱 스테이크 " + input*input);
			break; // switch문을 벗어남
		case 2:
			System.out.println(input + " - 루트 샐러드 " + Math.sqrt(input));
			break; // switch문을 벗어남
		case 3:
			String result = (input%7 == 0) ? "(종이 빨대)" : "(빨대 제공X)";
			System.out.println(input + "- 7배 사이다" + result);
			break; // switch문을 벗어남
	} // switch 끝
} // while 끝

'Java' 카테고리의 다른 글

제어문 (1) 조건문 - switch  (0) 2022.01.05
제어문 (1) 조건문 - if, else if, else  (0) 2022.01.04
조건 연산과 대입 연산  (0) 2022.01.01
비교 연산과 논리 연산  (0) 2021.12.31
산술 연산자와 산술 변환  (0) 2021.12.31