자바 프로그램은 main() 메소드의 시작 중괄호({)에서 끝 중괄호(})까지 위에서부터 아래로 실행하는 흐름을 가지고 있다.
흐름 제어문(제어문) : 실행 흐름을 개발자가 원하는 방향으로 바꿀 수 있도록 해주는 것
제어문의 종류
| 조건문 | 반복문 |
|---|---|
| if 문, switch문 | for문, while문, do-while문 |
루핑(looping) : 제어문 처음으로 다시 되돌아가 반복 실행하는 것
if 문은 조건식의 결과에 따라 블록 실행 여부가 결정된다.

//예제
package Ch04;
public class IfExample {
public static void main(String[] args) {
int score = 93;
if(score >= 90){
System.out.println("점수가 90보다 큽니다");
System.out.println("등급은 A입니다.");
}
if(score < 90)
System.out.println("점수가 90보다 작습니다.");
System.out.println("등급은 B입니다."); //if 문과는 상관없는 실행문
}
}
실행 결과
점수가 90보다 큽니다
등급은 A입니다.
등급은 B입니다.
조건문이 여러 개인 if문도 있다.
else if는 상위 조건식이 false일 경우 평가됨.
else if의 수는 제한이 없음
마지막에 else를 추가할 수 있는데 모든 조건식이 flase일 경우 else를 실행.

//예제
package Ch04;
public class IfElseIfElseExample {
public static void main(String[] args) {
int score = 75;
if(score >= 90){
System.out.println("점수가 100-90입니다.");
System.out.println("등급은 A입니다.");
}
else if(score >= 80){
System.out.println("점수가 80-89입니다.");
System.out.println("등급은 B입니다.");
}
else if(score >= 70){
System.out.println("점수가 70-79입니다.");
System.out.println("등급은 C입니다.");
}
else{
System.out.println("점수가 70 미만입니다.");
System.out.println("등급은 D입니다.");
}
}
}
실행 결과
점수가 70-79입니다.
등급은 C입니다.
int num = (int) (Math.random() * n ) + start;
//주사위 예제
package Ch04;
public class IfDiceExample {
public static void main(String[] args) {
int num = (int)(Math.random()*6) + 1;
if(num == 1){
System.out.println("1번이 나왔습니다.");
}
else if(num == 2){
System.out.println("2번이 나왔습니다.");
}
else if(num == 3){
System.out.println("3번이 나왔습니다.");
}
else if(num == 4){
System.out.println("4번이 나왔습니다.");
}
else if(num == 5){
System.out.println("5번이 나왔습니다.");
}
else{
System.out.println("6번이 나왔습니다");
}
}
}
중첩 if문 : if문 블록 내부에 또 다른 if문을 사용하는 것
중첩 if문에서 중첩의 단계는 제한이 없다.
//중첩 if문 예제
package Ch04;
public class IfNestedExample {
public static void main(String[] args) {
int score = (int)(Math.random()*20) + 81;
System.out.println("점수: " + score);
String grade;
if(score >= 90){
if(score >= 95){
grade = "A+";
}
else{
grade = "A";
}
}
else{
if(score>=85){
grade = "B+";
}
else{
grade = "B";
}
}
System.out.println("학점: " + grade);
}
}
실행 결과
점수: 100
학점: A+
switch문은 변수의 값에 따라서 실행문이 결정되기 때문에 같은 기능의 if문보다 코드가 간결해진다.

switch문은 괄호 안의 변수값에 따라 해당 case로 가서 실행문을 실행시킨다.
변수값과 동일한 값을 갖는 case가 없으면 default로 가서 실행문을 실행시킨다.
default가 필요 없다면 생략 가능하다.
package Ch04;
public class SwitchExample {
public static void main(String[] args) {
int num = (int) (Math.random() * 6) + 1;
switch(num){
case 1:
System.out.println("1번이 나왔습니다.");
break;
case 2:
System.out.println("2번이 나왔습니다.");
break;
case 3:
System.out.println("3번이 나왔습니다.");
break;
case 4:
System.out.println("4번이 나왔습니다.");
break;
case 5:
System.out.println("5번이 나왔습니다.");
break;
default:
System.out.println("6번이 나왔습니다.");
}
}
}
case 끝에 있는 break는 다음 case를 실행하지 않고 switch문을 빠져나가기 위해 필요하다.
만약 break가 없다면 case가 연달아 실행되는데 이땐 case 값과는 상관없이 실행된다.
switch문의 괄호에는 정수 타입과 문자열 타입 변수를 사용할 수 있다.
Java 12 이후부터는 switch문에서 Expressions(표현식)을 사용할 수 있다.
break문을 없애는 대신에 화살표와 중괄호를 사용해 가독성이 좋아졌다.
//예제
package Ch04;
public class SwitchExpressonsExample {
public static void main(String[] args) {
char grade = 'B';
switch(grade){
case 'A', 'a' -> {
System.out.println("우수 회원입니다.");
}
case 'B', 'b' -> {
System.out.println("일반 회원입니다.");
}
default -> {
System.out.println("손님입니다.");
}
}
switch(grade){
case 'A', 'a' -> System.out.println("우수 회원입니다.");
case 'B', 'b' -> System.out.println("일반 회원입니다.");
default -> System.out.println("손님입니다.");
}
}
}
실행 결과
일반 회원입니다.
일반 회원입니다.
표현식을 사용하면 스위치된 값을 변수에 바로 대입할 수도 있다.
단일 값일 경우엔 화살표 오른쪽에 값을 기술하면 되고, 중괄호를 사용할 경우에는
yield(Java 13부터 사용 가능) 키워드로 값을 지정하면 된다.(이 경우 default 반드시 존재)
//예제
package Ch04;
public class switchValueExample {
public static void main(String[] args) {
String grade = "B";
int score = switch(grade){
case "A" -> 100;
case "B" -> {
int result = 100 - 20;
yield result;
}
default -> 60;
};
System.out.println("score: " + score);
}
}
실행 결과
score: 80
for문은 실행문을 여러 번 반복 실행해줘서 코드를 간결하게 만들어준다.
//예제
package Ch04;
public class PrintFrom1To10Example {
public static void main(String[] args) {
for(int i = 1; i <= 10; i++){
System.out.print(i + " ");
}
}
}
실행 결과
1 2 3 4 5 6 7 8 9 10
초기화식에서 선언된 변수는 for문 블록 안에서만 사용되는 로컬 변수다.
for문 밖에서도 사용하고 싶다면 for문 이전에 변수 선언을 하면 된다.
int i; //for문 이전에 변수 i 선언
for(i = 1; i <= 100; i++){---}
System.out.println("최종 i값: " + i) //for문을 벗어나서 i를 사용
초기화식에서 부동 소수점을 쓰는 float 타입을 쓰는 경우 반복 횟수가 달라질 수 있으니 사용하지 않는다.
중첩된 for문 : for문을 내포하고 있는 for문
중첩된 for문은 지정 횟수만큼 반복하고 다시 바깥 for문으로 돌아간다.
//예제
package Ch04;
public class MultiplicationTableExample {
public static void main(String[] args) {
for(int m = 2; m <= 9; m++){
System.out.println("*** " + m + "단 ***");
for(int n = 1; n <= 9; n++){
System.out.println(m + "x" + n + " = " + (m*n));
}
}
}
}
실행 결과
*** 2단 ***
2x1 = 2
2x2 = 4
2x3 = 6
2x4 = 8
2x5 = 10
2x6 = 12
2x7 = 14
2x8 = 16
2x9 = 18
*** 3단 ***
3x1 = 3
3x2 = 6
3x3 = 9
3x4 = 12
3x5 = 15
3x6 = 18
3x7 = 21
3x8 = 24
3x9 = 27 --- 이하생략
while문은 조건식이 true일 경우에 계속해서 반복하고 false가 되면 while문을 종료한다.
package Ch04;
public class WhileExample {
public static void main(String[] args) {
int i = 1;
while(i<=10){
System.out.print(i + " ");
i++;
}
}
}
실행 결과
1 2 3 4 5 6 7 8 9 10
while 반복문은 무한 반복문을 만들 수 있다
while(true)를 이용하면 만들 수 있는데 이 경우 while문을 빠져나가는 코드를 만들어두지 않으면 실행이 프로그램이 종료되지 않는다. 따라서 반드시 종료 코드도 만들어두어야 한다.
//무한반복문 예제
package Ch04;
import java.util.Scanner;
public class KeyControlExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
boolean run = true;
int speed = 0;
while(run){
System.out.println("1. 증속 | 2. 감속 | 3. 중지");
String strnum = scanner.nextLine();
if(strnum.equals("1")){
speed++;
System.out.println("현재 속도 = " + speed);
}
else if(strnum.equals("2")){
speed--;
System.out.println("현재 속도 = " + speed);
}
else{
run = false;
}
}
System.out.println("프로그램 종료");
}
}
실행 결과
1. 증속 | 2. 감속 | 3. 중지
1
현재 속도 = 1
1. 증속 | 2. 감속 | 3. 중지
2
현재 속도 = 0
1. 증속 | 2. 감속 | 3. 중지
3
프로그램 종료
do-while문은 조건식에 의해 반복 실행한다는 점에서는 while문과 동일하지만,
do-while문은 블록 내무를 먼저 실행시키고 그 다음 조건식이 true이면 반복 실행을 계속할지 결정한다.
//예제
package Ch04;
import java.util.Scanner;
public class DoWhileExample {
public static void main(String[] args) {
System.out.println("메시지를 입력하세요.");
System.out.println("프로그램을 종료하려면 q를 입력하세요.");
Scanner scanner = new Scanner(System.in);
String inputString;
do{
System.out.println(">");
inputString = scanner.nextLine();
System.out.println(inputString);
} while(!inputString.equals("q"));
System.out.println("프로그램 종료");
}
}
실행 결과
메시지를 입력하세요.
프로그램을 종료하려면 q를 입력하세요.
>
안녕하세요
안녕하세요
>
반갑습니다
반갑습니다
>
q
q
프로그램 종료
break문은 반복문이나 switch문을 종료할 때 사용된다.
반복문이 중첩되어 있을 경우 break문은 가장 가까운 반복문만 종료한다.
중첩 반복문에서 바깥쪽 반복문까지 종료시키려면 바깥쪽 반복문에 이름을 붙이고 break 이름;을 사용하면 된다.
Label : for(---){
for(---){
break Label;
}
}
//예제
package Ch04;
public class BreakOutterExample {
public static void main(String[] args) throws Exception{
Outter: for(char upper='A'; upper <='Z'; upper++){
for(char lower = 'a'; lower <='z'; lower++){
System.out.println(upper + "-" + lower);
if(lower == 'g'){
break Outter;
}
}
}
System.out.println("프로그램 실행 종료");
}
}
실행 결과
A-a
A-b
A-c
A-d
A-e
A-f
A-g
프로그램 실행 종료
continue문은 반복문에서만 사용되는데, 블록 내부에서 continue문이 실행되면,
for문의 증감식 또는 while 문, do-while문의 조건식으로 바로 이동한다.
//예제
package Ch04;
public class ContinueExample {
public static void main(String[] args) {
for(int i =1; i <= 10; i++){
if(i%2 != 0){
continue;
}
System.out.print(i+ " ");
}
}
}
실행 결과
2 4 6 8 10
- 조건문과 반복문에 대해 잘못 설명한 것은 무엇입니까?
2번 switch문에서 사용할 수 있는 변수의 타입은 int, double이 될 수 있다. -> 없다
- 왼쪽 switch문을 Expression으로 변경해서 오른쪽에 작성해보세요.
String grade = "B"; int score = switch(grade){ case "A" -> 100; case "B" -> { int result = 100 - 20; yield result; } default -> 60; };
- for 문을 이용해서 1부터 100까지의 정수 중에서 3의 배수의 총합을 출력하는 코드를 작성해보세요.
int sum = 0; for(int i = 1; i <=100; i++){ if(i%3 == 0){ sum += i; } } System.out.println("3의 배수의 총합: " + sum);
- while문과 Math.random() 메소드를 이용해서 두 개의 주사위를 던졌을 때 나오는 눈을 (눈1, 눈2) 형태로 출력하고, 눈의 합이 5가 아니면 주사위를 계속 던지고, 눈의 합이 5이면 실행을 멈추는 코드를 작성해보세요. 눈의 합이 5가 되는 경우는 (1,4), (4,1), (2,3), (3,2)입니다.
while(true){ int diceX = (int) (Math.random() * 6) + 1 int diceY = (int) (Math.random() * 6) + 1 System.out.println("(" + diceX + ", " + diceY + ")"); if(diceX + diceY == 5){ break; } }
- 중첩 for문을 이용하여 방정식 4x + 5y = 60의 모든 해를 구해서 (x,y) 형태로 출력하는 코드를 작성해보세요. 단 x와 y는 10 이하의 자연수입니다.
for(int x=1; x<=10; x++){ for(int y=1; y<=10; y++){ if(4*x + 5*y == 60){ System.out.println("(" + x + ", " + y + ")") } }
- for문을 이용해서 다음과 같은 실행 결과가 나오는 코드를 작성해보세요.
for(int i=1; i<=5;i++){ for(int j=1; j<=i; j++){ System.out.print("*"); if(i == j){ System.out.println(); } } }
- while문과 Scanner의 nextLine() 메소드를 이용해서 다음 실행 결과와 같이 키보드로부터 입력된 데이터로 예금, 출금, 조회, 종료 기능을 제공하는 코드를 작성해보세요.
package Ch04;
import java.util.Scanner;
public class checkTest7 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(true){
System.out.println("----------------------------------");
System.out.println("1.예금 | 2.출금 | 3.잔고 | 4.종료");
System.out.println("----------------------------------");
System.out.println("선택> ");
String choice = scanner.nextLine();
if(choice.equals("1")){
System.out.println("예금액>10000");
}
else if(choice.equals("2")){
System.out.println("출금액>2000");
}
else if(choice.equals("3")){
System.out.println("잔고>8000");
}
else{
System.out.println("프로그램 종료");
break;
}
}
}
}