[Java Programming] 2.2 실행흐름 제어 - 조건문 (if~else if ~ else, Switch)
- 실행흐름 제어 종류 -
조건문 : if – else if – else : 경우의 수 중 하나 / switch : 실행 흐름의 분리
반복문 : while : ~ 동안 반복 / for : ~ 까지 반복
if – else if – else
- 목적 : 여러 경우의 수 중 단 하나의 경우에만 실행
- 변수의 값에 따라 실행의 흐름을 바꾸어야 할때 사용
- else 가 필수는 아님. else가 없더라도 동작 됨
- 변수의 범위 : 가장 가까운 중괄호 안에서만 동작함 + 같은 범위내에서는 동일한 명칭의 변수이름 사용할수 없다(= 중괄호의 범위가 서로 다르다면, 동일한명칭의 변수 사용할 수 있다)
- else if는 대략 1500개 정도 쓸 수 있음(무제한이라고 생각하기)
int number = 5;
if (number == 5) {
int number2 = 1;
System.out.println(number); //5
System.out.println(number2); //1
}
else {
int number2 = 2;
System.out.println(number);
System.out.println(number2);
}
System.out.println(number); //5
// System.out.println(number2); // number2는 같은범위내에 있지 않으므로 에러발생
int number = 7;
if (number == 5) {
//number가 5일경우
System.out.println("숫자가 5와 같습니다.");
}
else if(number ==7) {
//number가 7일경우
System.out.println("숫자가 7과 같습니다.");
}
else {
//number가 5, 7이 아닐경우 실행
System.out.println("숫자가 5, 7이 아닙니다.");
}
Math.randomm()
- 임의의 정수를 뽑는 방법dp tkdyd
- 0.0 이상 ~ 1.0미만 double타입의 난수 하나를 리턴함
* start부터 시작하는 n개의 정수중 임의의 정수하나 얻기위한 연산식
int num = (int) (Math.random() * n) + start;
* 주사위번호 하나를 뽑기위한 연산식
int num = (int) (Math.random() * 6) + 1
예제) 난수를 이용해 간단한 Up/Down게임 만들어보기
- 랜덤하게 나온 값(answer)과 사용자가 입력(value)한 값이 같은가?
- math.random(); -> 0.xxxx의 소수점이 나옴 -> 이걸 int형변환 해주면 소수점 탈락함
//double타입의 난수
double randomNumber = Math.random(); //0.9341804727320385
//double 타입의 난수를 정수로 변환 : 0~99
int answer = (int)(randomNumber * 100);
int value = 60;
if(answer == value) {
System.out.println("정답입니다!");
}
else if(answer > value) {
System.out.println("UP!"); // UP!
}
else if (answer < value) {
System.out.println("DOWN!");
}
System.out.println("정답은" + answer +"입니다."); //정답은91입니다.
** if 문장을 쓸 때 해서는 안될 일**
if문에 한줄만 쓸 경우 중괄호를 생략해도 됨 단,
아래의 3가지경우 다 사용가능하긴 하지만, 코드품질검사시 case 2, 3의 경우 걸림(중괄호 생략했기 때문!)
//case 1
if(answer == value) {
System.out.println("정답입니다!");
}
//case2
if(answer == value)
System.out.println("정답입니다!");
// case3
if(answer == value) System.out.println("정답입니다!");
예시문제) 3인가족여행
3인 가족이 100만원으로 비행기를 타고 편도 여행을 가려합니다.
부모님의 나이는 각각 40, 36세, 딸의 나이는 11세입니다.
성인의 비행요금은 30만원, 아동의 비행요금은 12만원입니다.
3인 가족은 여행을 떠날 수 있을까요?
여행을 떠날 수 있다면 "여행가자!", 여행을 떠날 수 없다면 "다음에가자 ㅠㅠ" 를 출력하시오
변수선언
// 아동과 성인 구분하는 연령 : 19세
// 성인과 아동 구분 -> 비용(변수 만들어서)더하기
int money = 1_000_000;
int cost = 0;
int father = 40;
int mother = 36;
int daughter = 11;
int adultOnewayFlightFare = 300_000;
int kidOnewayFlightFare = 120_000;
int[] arr = {father, mother, daughter};
방법1. if-else
if (father >= 19) {
cost += adultOnewayFlightFare;
}
else {
cost += kidOnewayFlightFare;
}
if (mother >= 19) {
cost += adultOnewayFlightFare;
}
else {
cost += kidOnewayFlightFare;
}
if (daughter >= 19) {
cost += adultOnewayFlightFare;
}
else {
cost += kidOnewayFlightFare;
}
if (cost <= money) {
System.out.println("여행가자!");
}
else {
System.out.println("다음에 가자 ㅠㅠ");
}
방법2. if-else
int adult = 0;
int kid = 0;
if(father >= 19) {
adult++;
}
else {
kid++;
}
if(mother >= 19) {
adult++;
}
else {
kid++;
}
if(daughter >= 19) {
adult++;
}
else {
kid++;
}
cost += adult * adultOnewayFlightFare
cost += kid * kidOnewayFlightFare
if (cost <= money) {
System.out.println("여행가자!");
}
else {
System.out.println("다음에 가자 ㅠㅠ");
}
방법3. 삼항연산자
// father의 값이 19보다 크거나 같다면 adultOnewayFlightFare를 할당하고,
// 그렇지 않다면 kidOnewayFlightFare를 할당한다.
// 삼항연산자 문법 - 조건? 조건이 true일때 값 : 조건이 false일때 값
int flightFare = 0;
flightFare += father >= 19 ? adultOnewayFlightFare : kidOnewayFlightFare;
flightFare += mother >= 19 ? adultOnewayFlightFare : kidOnewayFlightFare;
flightFare += daughter >= 19 ? adultOnewayFlightFare : kidOnewayFlightFare;
if(flightFare <= money) {
System.out.println("여행가자!");
}
else {
System.out.println("다음에 가자ㅠㅠ");
}
방법4. 배열로
for (int i = 0; i<arr.length; i++) {
if ( arr[i] >= 19) {
cost += adultOnewayFlightFare;
}
else {
cost += kidOnewayFlightFare;
}
}
if (cost <= money) {
System.out.println("여행가자!");
}
else {
System.out.println("다음에 가자 ㅠㅠ");
}
예제)
만약 나이가 19세 이상이면 "범죄도시" 영화를 관람할수있고,
나이가 15세이상 19세미만이면 엔드게임 영화를 관람할수있고
나이가 12세이상이고 15세미만이면 '해리포터'영화를 관람할수있고
그렇지않다면 "뽀로로 극장판 공룡섬 대모험"을 관람할수있다.
힌트 : 큰숫자부터 작은숫자로 논리연산이 진행되면 생략할수있다 ex) line5
int age2 = 14;
if (age2 >= 19) {
System.out.println("범죄도시 영화를 관람할 수 있다.");
}
// else if (age2 >= 15 && age2 < 19) { //위에서 19세 걸러줬으니, 굳이 age2<19표현은 쓸필요 없다
else if (age2 >= 15) {
System.out.println("엔드게임 영화를 관람할 수 있다.");
}
else if (age2 >= 12) {
System.out.println("엔드게임 영화를 관람할 수 있다.");
}
else {
System.out.println("\"뽀로로 극장판 공룡섬 대모험\"을 관람할 수 있다.");
}
Switch
- 잘 안씀 (잘못사용하는 경우가 많음)
- 변수 값에 따라 제어가 가능
- 코드의 시작위치, 종료위치등을 제어할수있고, 보통상태를 제어할 때 사용
- Switch를 사용하는 경우 : 프로세스가 있다고 가정을 하고, 어디부터 시작할것인가를 보는것
- 괄호 안의 값과 동일한 값을 갖는 case로 가서 실행문을 실행시킴
- 상태를 제어하는 것 (상태 = 내가 어디까지 했는가) 즉, 시작지점을 정해줘야됨 -> '현재 상태'부터 실행
- break : switch문 안에서 더이상 흘러가지 않고, 바로 끝냄
if vs switch
switch문법 예제
public static void main(String[] args) {
// switch (상태값) {}
// 상태값 = 숫자 or 문자열만 들어갈 수 있음
int value = 0;
switch(value) {
// 현재상태값(value)의 값이 0이라면 여기부터 시작해라
case 0:
System.out.println("현재 상태값은 0입니다.");
// 현재상태값(value)의 값이 1이라면 여기부터 시작해라
case 1:
System.out.println("현재 상태값은 1입니다.");
break; // 흐름종료 -> 중괄호 끝으로 바로 감
// 현재상태값(value)의 값이 2이라면 여기부터 시작해라
case 2:
System.out.println("현재 상태값은 2입니다.");
// 현재상태값(value)의 값이 3 or 4라면 여기부터 시작해라
case 3:
case 4:
System.out.println("현재 상태값은 3 or 4입니다.");
// 현재상태값의 값이 0,1,2,3,4 모두 아니거나
// 모든 흐름이 종료되었을때 가장 마지막에 실행되는 영역
default:
System.out.println("흐름이 종료되었습니다.");
}
ex) 펌웨어 업데이트 과정
만약, 현재상태가 READY라면, case READY문 실행 -> updateState를 UPDATE_REQUEST로 바꿔주고 -> "업데이트 준비가 완료됐습니다." 출력
final int READY = 0;
final int UPDATE_REQUEST = 1;
final int UPDATE_PROCESSING = 2;
final int UPDATE_SUCCESS = 3;
final int UPDATE_FAILURE = 4;
final int UPDATE_COMPLETE = 5;
int nowVersion = 1;
int nextVersion = 2;
int updateState = READY;
switch (updateState) {
case READY:
updateState = UPDATE_REQUEST;
System.out.println("업데이트 준비가 완료됐습니다.");
case UPDATE_REQUEST:
updateState = UPDATE_PROCESSING;
System.out.println("업데이트 요청을 했습니다.");
case UPDATE_PROCESSING:
if (nowVersion < nextVersion) {
updateState = UPDATE_SUCCESS;
System.out.println("업데이트 진행중입니다.");
}
else {
updateState = UPDATE_FAILURE;
System.out.println("업데이트 할 수 없습니다.");
break;
}
case UPDATE_SUCCESS:
updateState = UPDATE_COMPLETE;
System.out.println("업데이트를 성공했습니다.");
case UPDATE_COMPLETE:
System.out.println("업데이트를 완료했습니다.");
break;
case UPDATE_FAILURE:
System.out.println("업데이트를 실패했습니다."); // 앞선 UPDATE_FAILURE과는 상관없는, 사이클상 발생하는 실패
default:
System.out.println("업데이트를 완료했습니다.");
}
System.out.print("마지막 업데이트 상태: ");
System.out.println(updateState);
}
switch문 밥짓기 예제
String status = "뚜껑을 연다.";
switch (status) {
case "뚜껑을 연다." :
System.out.println("밥솥을 꺼내세요.");
case "밥솥을 꺼낸다." :
System.out.println("쌀을 꺼내세요.");
case "쌀을꺼낸다." :
System.out.println("밥솥에 쌀을 부으세요.");
case "밥솥에 쌀을 붓는다." :
System.out.println("물을 부으세요");
}