코드 실행 흐름 제어
- 자바 프로그램은 main() 메소드의 시작 중괄호({)에서 끝 중괄호(}) 까지 위에서부터 아래로 실행하는 흐름을 가짐
- 실행 흐름을 개발자가 원하는 방향으로 바꿀수 있도록 하는 것이 흐름 제어문
- 제어문은 조건식과 중괄호{} 블록으로 구성, 조건식의 연산 결과에 따라 블록 내부의 실행 여부 결정
- 제어문 블록이 실행 완료된 후
- 제어문 블록을 빠져 나와 정상 흐름으로 돌아오는 것은 조건문
- 제어문의 처음으로 다시 되돌아가 반복 실행하면 반복문 (Looping)
- 제어문의 종류
조건문 | 반복문 |
if문, switch 문 | for문, while문, do-while 문 |
if문
- if문은 조건식의 결과에 따라 실행 여부가 결정
if(조건식){
실행문;
실행문;
...
}
- 조건식에는 true 또는 false 값을 산출할 수 있는 연산식이나 boolean 변수가 올 수 있음
- 조건식이 true이면 블록을 실행, false이면 블록 실행 x.
- 중괄호{} 블록 내에 실행문이 하나 밖에 없다면 중괄호 생략가능
- 중괄호{} 블록 생략하지 않는 것을 추천
package ch04.sec02;
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입니다.");
}
}
================================================================
콘솔 출력문
================================================================
점수가 90보다 큽니다.
등급은 A입니다.
등급은 B입니다.
- 두번째 if 문 뒤에 중괄호 블록이 없기 때문에 의도와는 다르게 등급은 B입니다가 출력됨.
- if 문은 else블록과 함꼐 사용되어 조건식의 결과에 따라 실행 블록을 선택할 수 있음
- if문이 조건식이 true이면 if문 블록이 실행. false이면 else 블록이 실행
package ch04.sec02;
public class IfElseExample {
public static void main(String[] args) {
int score =85;
if(score>90) {
System.out.println("점수가 90보다 큽니다");
System.out.println("등급은 A입니다.");
}
else {
System.out.println("점수가 90보다 작습니다");
System.out.println("등급은 B입니다");
}
}
}
=================================================================
콘솔출력문
=================================================================
점수가 90보다 작습니다
등급은 B입니다
- 조건문이 여러개인 if 문도 있음.
- else if 는 상위 조건식이 false 일 경우 평가되고, else if가 true되면 해당 블록이 실행됨
- else if 의 수는 제한이 없으며, 여러 개의 조건식 중 true 가 되는 else if 블록만 싱행하고 전체 if 문을 벗어나게 됨
- 마지막에 else블록을 추가할 수 있음, 모든 조건식이 false 일 경우 else 블록이 실행
package ch04.sec02;
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 입니다.
- 주사위를 굴려서 나올 수 있는 1,2,3,4,5,6 중 하나의 수를 뽑아 출력하는 코드
- 임의의 정수를 뽑는 Math.random()메서드 활용
- 0.0. 이상 1.0 미만 의 double 타입 난수 리턴
- 임의의 정수를 뽑는 Math.random()메서드 활용
package ch04.sec02;
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 문 사용 가능, 중첩의 단계는 제한 없음
package ch04.sec02;
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);
}
}
switch문
- if문은 조건식의 결과가 true, false 두 가지 밖에 없기 때문에 경우의 수가 많아질수록 else if 를 반복적으로 추가해야함
- switch 문은 변수의 값에 따라서 실행문이 결정됨
- 변수값과 동일한 값을 갖는 case가 없으면 default 가서 실행문을 실행
- default가 필요없다면 생략 가
package ch04.sec03;
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값과는 상관없이 실행됨
package ch04.sec03;
public class SwitchNoBreakCaseExample {
public static void main(String[] args) {
int time = (int) (Math.random() * 4) + 8; // 8<..<=11 사이의 정수 뽑기
System.out.println("[현재 시간 : " + time + "시]");
switch (time) {
case 8:
System.out.println("출근합니다");
case 9:
System.out.println("회의를 합니다.");
case 10:
System.out.println("업무를 봅니다.");
default:
System.out.println("외근을 나갑니다.");
}
}
}
========================================================================================
콘솔출력문
========================================================================================
[현재 시간 : 8시]
출근합니다
회의를 합니다.
업무를 봅니다.
외근을 나갑니다.
- switch 문의 괄호에는 정수타입과 문자열 변수를 사용할 수 있음
- char 타입 변수를 이용해서 영어 대소문자에 관계없이 똑같이 처리하는 예제
package ch04.sec03;
public class SwitchCharExample {
public static void main(String[] args) {
char grade = 'B';
switch (grade) {
case 'A':
case 'a':
System.out.println("우수 회원입니다.");
break;
case 'B':
case 'b':
System.out.println("일반 회원입니다.");
break;
default:
System.out.println("손님입니다.");
}
}
}
- Java 12이후 부터 switch 문에서 Expressions(표현식)을 사용할 수 있음
- break문을 없애는 대신 화살표와 중괄호를 사용해 가독성이 좋아짐
package ch04.sec03;
public class SwitchExpressionsExample {
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("손님입니다.");
}
}
}
- Switch Expressions 를 사용하면 스위치된 값을 변수에 바로 대입 가능
- 단일 값일 경우에는 화살표 오른쪽에 값을 기술하면되고, 중괄호를 사용할 경우에는 yield(Java 13 부터 사용 가능) 키워드로 값을 지정하면 된다. 단, 이 경우에는 default가 반드시 존재해야한다.
타입 변수 = switch(grade){
case "값1"-> 변수값;
case "값2"-> {
...;
yield 변수값;
}
default->변수값
};
- grade에 따라 스위치된 점수를 score변수에 대입하는 예제
package ch04.sec03;
public class SwitchValueExample {
public static void main(String[] args) {
String grade = "B";
// Java 11 이전 문법
int score1 = 0;
switch (grade) {
case "A":
score1 = 100;
break;
case "B":
int result = 100 - 20;
score1 = result;
break;
default:
score1 = 60;
}
System.out.println("score1: "+ score1);
// Java 13부터 가능
int score2 = switch(grade) {
case"A"->100;
case"B"->{
int result =100-20;
yield result;
}
default->60;
};
System.out.println("score2: " + score2);
}
}
=====================================================
콘솔 출력문
=====================================================
score1: 80
score2: 80
- 자바 21에서 switch 문의 표현식을 작성하는 방법이 강화 됨. 21 에서 학습 예정
for문
- 똑같은 실행문을 반복적으로 실행해야 할 경우 사용
- for문의 실행 흐름 도식화
- ①초기화식 실행
- ②조건식 평가해서 true 이면 ③실행문 실행, false이면 for문 종료하고 블록을 건너 뜀
- ② 조건식이 true 여서 ③ 실행문을 모두 실행하면 ④증감식이 실행
- 다시 ② 조건식 평가
- 평가 결과가 다시 true 이면 ③ - ④ - ② 로 다시 진행, false이면 for문이 끝남
- for문의 형태로 1부터 10까지 출력하는 코드
package ch04.sec04;
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 문 이전에 선언 해야 함
- 초기화식이 둘 이상 있을 수도 있고, 증감식이 둘 이상 있을 수 도 있음
package ch04.sec04;
public class SumFrom1To100Example {
public static void main(String[] args) {
int sum=0;
int i;
for(i=1;i<=100;i++) {
sum+=i;
}
System.out.println("1~" + (i-1) + " 합: " + sum);
}
}
==========================================================
콘솔출력문
==========================================================
1~100 합: 5050
- for 문을 작성할 때 주의할 점은 초기화식에서 부동 소수점을 쓰는 float 타입을 사용하지 말아야 한다는 것.
package ch04.sec04;
public class FloatCounterExample {
public static void main(String[] args) {
for (float x = 0.1f; x <= 1.0f; x += 0.1f) {
System.out.println(x);
}
}
}
==========================================================
콘솔 출력문
==========================================================
0.1
0.2
0.3
0.4
0.5
0.6
0.70000005
0.8000001
0.9000001
- 부동 소수점 방식의 float 타입은 연산 과정에서 정확히 0.1을 표현하지 못하기 떄무에 증감식에서 x를 더해지는 실제 값은 0.1 보다 약간 클 수 있다. 따라서 최종 반복횟수는 9번이 되었음
중첩 for문
- for문은 또 다른 for문을 내포할 수 있고 이것을 중첩된 for 문이라고 함.
- 바깥 for문이 한번 실행될때마다 중첩된 for 문은 지정횟수만큼 반복한 후 다시 바깥 for 문으로 돌아감
package ch04.sec04;
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
...
...
...
...
***9단 ***
9x1=9
9x2=18
9x3=27
9x4=36
9x5=45
9x6=54
9x7=63
9x8=72
9x9=81
while문
- for 문을 정해진 횟수만큼 반복한다면, while 문은 조건식이 true일 경우에 계속해서 반복하고, false가 되면 반복을 멈추고 while문을 종료
- while문의 실행 흐름
- ①조건식 평가
- 평가 결과가 true이면 ②실행문 실행
- ② 실행문이 모두 실행 되면 조건식으로 돌아가서 ① 조건식을 다시 평가
- 조건식이 true라면 ② -> ① 로 진행하고, false라면 while문을 종료
- while문으로 1부터 10까지 출력 예제
package ch04.sec05;
public class PrintFrom1To10Example {
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문으로 1부터 100까지 합한 값 출력하는 예제
package ch04.sec05;
public class SumFrom1To100Example {
public static void main(String[] args) {
int sum=0;
int i=1;
while(i<=100) {
sum+=i;
i++;
}
System.out.println("1~" + (i-1)+ " 합 : " + sum);
}
}
==========================================================
콘솔 출력문
==========================================================
1~100 합 : 5050
- 키보드에서 1,2 입력했을 때 속도를 증속,감속시키고 3을 입력하면 프로그램을 종료시키는 예제
- while문 조건식에 true를 사용하면 무한 반복, 이를 빠져나가기 위한 코드 필요
package ch04.sec05;
import java.util.Scanner;
public class KeyControlExample {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
boolean run = true;
int speed = 0;
while(run) {
System.out.println("-------------------------");
System.out.println("1. 증속 | 2. 감속 | 3. 중지");
System.out.println("-------------------------");
System.out.println("선택: ");
String strNum=sc.nextLine();
if(strNum.equals("1")) {
speed++;
System.out.println("현재 속도: "+speed);
} else if(strNum.equals("2")) {
speed--;
System.out.println("현재 속도: "+ speed);
} else if(strNum.equals("3")) {
run = false;
}
}
System.out.println("프로그램 종료");
}
}
- while 조건식을 보면 run 변수의 값에 따라 while문의 반복여부가 결정
- 처음 run 변수의 값은 true 이므로 while 문은 무한 반복됨
- 키보드로 3을 입력하면 run 변수의 값이 false가 되어 while 문의 조건식이 false 가 된다.
- 이때, 무한 반복을 종료하고 while 문을 빠져나간다
- while문을 빠져나가는 다른방법으로는 break문을 이용할 수도 있다.
do-while문
- do-while 문은 조건식에 의해 반복 실행한다는 점에서는 while 문과 동일하지만 do-while문은 최초 실행을 한번 한 후에 반복을 실행
- while() 뒤에 반드시 세미클론(;) 을 붙여야 함.
- do-while문의 실행흐름
- 처음 실행될 때 ①실행문을 우선 실행
- ① 실행문이 모두 실행 되면 ②조건식을 평가, 그 결과가 true이면 ① -> ② 와 같이 반복 실행
- 조건식의 결과가 false 이면 do-while 문을 종료
- 키보드로 입력받은 내용을 조사하여 계속 반복할 것인지 판단하는 예시
package ch04.sec05;
import java.util.Scanner;
public class DowhileExample {
public static void main(String[] args) {
System.out.println("메세지를 입력하세요.");
System.out.println("프로그램을 종료하려면 q를 입력하세요.");
Scanner sc = new Scanner(System.in);
String inputString;
do {
System.out.println(">");
inputString = sc.nextLine();
System.out.println(inputString);
} while(!inputString.equals("q"));
System.out.println();
System.out.println("프로그램 종료!");
}
}
break 문
- 반복문인 for문, while문, do-while 문을 실행 중지하거나 조건문인 switch문을 종료할 때 사용
- break문은 대개 if 문과 같이 사용되어 조건식에 따라 for문과 while문을 종료시킴
- 반복문이 중첩되어 있을 경우 break 문은 가장 가까운 반복문만 종료하고 바깥쪽 반복문은 종료시키지 않음
- 중첩된 반복문에서 바깥쪽 반복문까지 한번에 종료시키려면 바깥쪽 반복문에 이름(레이블)을 붙이고,'break 이름;' 을 사용하면 됨
- while문을 이용해서 주사위 번호 중 하나를 반복적으로 뽑되, 6이 나오면 while 문을 종료시킴
package ch04.sec07;
public class BreakExample {
public static void main(String[] args) {
while(true) {
int num = (int)(Math.random()*6)+1;
System.out.println(num);
if(num==6) {
break;
}
}
System.out.println("프로그램 종료");
}
}
- 바깥쪽 for문은'A~Z'까지 반복하고, 중첨된 for 문은 'a~z까지 반복, lower변수가 'g'를 갖게되면 바깥쪽 for 문까지 빠져나오도록 바깥쪽 for 문에 Outter라는 라벨을 붙인 예시
package ch04.sec07;
public class BreakOutterExample {
public static void main(String[] args) {
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문
- 반복문인 for문, while문,do-while 문에서만 사용되는데, 블록 내부에서 continue 문이 실행되면 for 문의 증감식 또는 while문, do-while 문의 조건식으로 바로 이동함
- 반복문을 종료하지 않고 계속 반복을 수행한다는 점이 break 와 다름
- 대개 if문과 같이 사용되며 특정 조건을 만족하는 경우에 continue 문을 실행해서 그 이후의 문장을 실행하지 않고 다음 반복으로 넘어감
- 1에서 10 사이의 수 중에서 짝수만 출력하고 홀수인 경우에는 다음 반복으로 넘어가는 예시
package ch04.sec08;
public class ContineExample {
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
'Java > 이것이자바다_개념정리' 카테고리의 다른 글
Java 기초 정리 2차_5)참조 타입_이것이 자바다 (0) | 2024.06.05 |
---|---|
Java 기초 정리 2차_3)연산자_이것이 자바다 (0) | 2024.05.27 |
Java 기초 정리 2차_2)변수와 타입_이것이 자바다 (0) | 2024.05.22 |
Java 기초 정리 2차_1)자바 시작하기_이것이 자바다 (0) | 2024.05.21 |