* 코드 실행 흐름 제어
자바 프로그램을 시작하면 main() 메소드의 시작 중괄호 { 에서 시작해서 끝 중괄호 } 까지 위에서부터 아래로 실행하는 흐름을 가지고 있다. 이러한 실행 흐름을 개발자가 원하는 방향으로 바꿀 수 있도록 해주는 것이 흐름 제어문이다. 흐름 제어문을 간단히 제어문이라고 한다. 제어문은 조건식과 중괄호 {} 블록으로 구성되는데, 조건식의 연산 결과에 따라 블록 내부의 실행 여부가 결정된다. 흐름 제어문을 사용할 경우 다양한 실행 흐름이 생성된다는 것을 다음 그림에서 보여주고 있다.
제어문의 종류는 조건문과 반복문이 있는데, 조건문에는 if문 switch 문이 있고 반복문에는 for문 while문, do-while 문이 있다. 제어문 블록이 실행 완료되었을 경우 다시 제어문 처음으로 돌아갈 지, 아니면 제어문 블록을 빠져나와 정상 흐름으로 다시 돌아올지는 어떤 제어문을 사용하느냐에 달려 있다. 조건문일 경우에는 정상 흐름으로 돌아오지만, 반복문일 경우는 제어문 처음으로 다시 되돌아가 반복 실행한다. 이것을 루핑(looping) 이라고 한다. 제어문 블록 내부에는 또 다른 제어문을 사용할 수 있다. if문 내부에 for문을 가질수 있고 while문도 가질 수 있다는 것이다. 그렇기 때문에 개발자가 원하는 매우 복잡한 흐름 제어도가 가능하다.
* 조건문
1. if문
if문 은 조건식의 결과에 따라 블록 실행 여부가 결정된다.
조건식에는 ture 또는 false 값을 산출할 수 있는 연산식이나, boolean 변수가 올 수 있다. 조건식이 ture 이면 블록을 실행하고, false 이면 블록을 실행하지 않는다.
중괄호 {} 블록은 여러개의 실행문을 하나로 묶기 위해 작성된다. 만약 조건식이 ture 가 될 때 실행해야 할 문장이 하나 밖에 없다면 생략할 수 있다. 하지만 중괄호 {} 블록을 생략하지 않고 작성하는 것을 추천한다. 중괄호 블록을 작성하지 않으면 코드의 가독성 (코드 해석) 이 좋지 않고, 버그 발생의 원인이 될 수 있다. 다음 예제 코드를 보자.
------------------------------------[ IfExample.java ] If 문 ---------------------------------------------
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 입니다.");
}
}
-------------------------------------------------------------------------------------------------------------------
Console
점수가 90 보다 큽니다."
등급은 A입니다.
등급은 B 입니다.
--------------------------------------------------------------------------------------------------------------------
2번째 if문 if(score<90) 에서 System.out.println("점수가 90 보다 작습니다."); 까지는 if문 적용이 되어 false 이기 때문에 출력이 되지 않았지만, {} 블록을 하지않았으므로 System.out.println("등급은 B 입니다."); 이 if문과는 관계가 없는것이 되버리므로 그대로 출력이 되어버렸다.
2. if - else 문
if문은 else 블록과 함께 사용되어 조건식의 결과에 따라 실행 블록을 선택한다. if문의 조건식이 ture이면 if문의 블록이 실행되고, 조건식이 false 이면 else 블록이 실행되게 되는것이다. 조건식의 결과에 따라 두개의 블록중 어느 한 블록의 내용만 실행한 후 전체 if-else문을 벗어나게 된다. 다음은 if-else문의 형식과 실행 흐름을 보여준다.
이전 예제는 두 개의 if 문을 이용했지만 이것보다는 다음과 같이 if-else 문으로 간단히 처리하는것이 더욱 간결한 코딩이다.
---------------------------------------------------[ IfElseExample.java ] if-else문-------------------------------------------------------------------
package sec02.exam01_if;
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점 이상이거나 미만일 경우에만 실행 흐름을 제어했는데, 이번 예제는 조건식 3개를 이용해서 실행 흐름을 제어한다.
------------------------------------------[ IfElseIfElseExample.java ] if-else if-else 문---------------------------------------------------------------
package sec02.exam01_if;
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 입니다.");
}
}
}
Console
점수가 70~79 입니다.
등급은 C 입니다.
한번 중첩되었을 뿐인데, 매우 복잡한 실행 흐름이 생긴다. 실제 프로그램에서는 여러 단계로 중첩되는 경우가 많기 때문에 코드의 실행 흐름을 이해하지 못한다면 프로그램 작성은 물론이고 이미 작성된 프로그램 분석도 어려워진다. 이번 예제는 81 <= ~~ <= 100 사이에 속하는 점수를 뽑아내어 바깥 if문은 90점과 80점 기준으로 조건문을 작성하고, 중첩if문은 좀 더 세부적으로 95점과 85점을 기준으로 조건문을 작성해서 A+, A, B+, B 를 출력한다.
-------------------------- [ IfNestedExample.java ] 중첩 if문 ------------------------------------------------------------------------------
package sec02.exam01_if;
public class IfNestedExample {
public static void main(String[] args) {
int score = (int)(Math.random()*20) + 81; //81~100 까지의 랜덤숫자 score
System.out.println("점수: " + score); //랜덤점수 score 출력
String grade;
if(score>=90) { //90이상
if(score>=95) { //95이상A+
grade = "A+";
} else {
grade = "A"; //아니면 A
}
} else {
if(score>=85) { //90미만 85이상
grade = "B+";
} else {
grade = "B"; //아니면 B
}
}
System.out.println("학점: " + grade);
}
}
switch문읜 괄호 안의 값과 동일한 값을 갖는 case로 가서 실행문을 실행시킨다. 만약 괄호 안의 값과 동일한 값을 갖는 case가 없으면 default로 가서 실행문을 실행시킨다. default는 생략 가능 하다. 이전 예제인 IfDiceExample.java를 switch문으로 변형하면 다음과 같다.
-----------------------------------------------[ SwitchExample.java ] switch문----------------------------------------------------------------
package sec02.exam02_switch;
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번이 나왔습니다.");
break;
}
}
}
-----------------------------------------------------------------------------------------------------------------
Console
5번이 나왔습니다.
-------------------------------------------------------------------------------------------------------------------
case 끝에 break 가 붙어있는이유는 다음 case를 실행하지 말고 switch 문을 빠져나가기 위해서이다. break가 없으면 다음 case 가 연달아서 실행되는데 그때는 case값과는 상관없이 실행되게 된다.
------------------------------------------------------[ SwitchNoBreakCaseExample.java ] break문이 없는 case-------------------------------------------
package sec02.exam02_switch;
public class SwitchNoBreakCaseExample {
public static void main(String[] args) {
//8<= … < 12(8+4) 사이의 정수 얻기
int time = (int)(Math.random()*4) + 8;
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("외근을 나갑니다.");
}
}
}
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
Console
[현재시간: 9 시]
회의를 합니다.
업무를 봅니다.
외근을 나갑니다.
------------------------------------------------------------------------------------------------------------------------------------------------------------------
char타입 변수도 switch문에 사용될 수 있다. 다음 예제는 영어 대소문자에 관계없이 똑같은 알파벳이라면 동일하게 처리하도록 만든 switch 문이다.
'legacy' 카테고리의 다른 글
이것이java다 3.5 삼항 연산자 (0) | 2023.04.16 |
---|---|
이것이java다 3장 확인문제 풀이 (0) | 2023.04.16 |
이것이java다 4.2 반복문 (0) | 2023.04.16 |
이것이java다 4. 확인문제 풀이 (0) | 2023.04.16 |
이것이java다 5장 확인문제 풀이 (0) | 2023.04.16 |