Java

[Java Programming] 2.2 실행흐름 제어 - 조건문 (if~else if ~ else, Switch)

코딩펭귄 2024. 1. 18. 15:58

- 실행흐름 제어 종류 -

조건문 : 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("물을 부으세요");
		}