C4

0

이것이 자바다

목록 보기
2/18
post-thumbnail

4.1 코드 실행 흐름 제어

실행 흐름을 개발자가 원하는 방향으로 바꿀 수 있도록 해주는 것이 흐름 제어문(이하 제어문)이다.

제어문의 종류는 다음과 같다.

조건문반복문
if 문, switch 문for 문, while 문, do-while 문
조건문일 경우는 정상 흐름으로 돌아오지만 반복문일 경우는 제어문 처음으로 다시 되돌아가 반복 실행한다. 이것을 루핑(looping) 이라고 한다.
제어문 블록 내부에는 또 다른 제어문을 사용가능 할 수 있어 개발자가 원하는 매우 복잡한 흐름 제어도 가능하다.

4.2 if문

아래 사진은 if 문의 실행 흐름을 보여준다.

if (조건문) { 
	실행문;
    ...
} // 중괄호 블록 내에 실행문이 하나밖에 없다면 생략가능하나 가독성의 문제로 사용한다.

if

		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문과 관계없이 실행된다.
        }

if else

		int score = 85;

        if (score >= 90) {
            System.out.println("점수가 90보다 큽니다.");
            System.out.println("´등급은 A입니다.");
        } else {
            System.out.println("점수가 90보다 작습니다.");
            System.out.println("등급은 B입니다.");
        }

if else-if

        int score = 75;

        if(score>=90) {
            System.out.println("점수가 100~90입니다.");
            System.out.println("등급은 A입니다.");
        } else if (score>=80) {
            System.out.println("점수가 80~90입니다.");
            System.out.println("등급은 B입니다.");
        } else if (score>=70) {
            System.out.println("점수가 70~80입니다.");
            System.out.println("등급은 C입니다.");
        } else if (score>=60) {
            System.out.println("점수가 60~70입니다.");
            System.out.println("등급은 D입니다.");
        }
if 문의 블록 내부에는 또 다른 if 문을 사용할 수 있다. 이것을 중첩 if 문이라 부르는데, 중첩의 단계는 제한이 없다. 다음 그림은 중첩 if 문의 실행 흐름을 보여준다.

여러 단계로 중첩되는 경우가 많기에 실행 흐름을 이해하지 못한다면 프로그램 작성, 분석이 어려워진다.

if 중첩문

		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);

4.3 switch 문

if 문은 조건식의 결과가 true, false 두 가지 밖에 없기 때문에 경우의 수가 많아지면 else if를 반복적으로 추가해야 하므로 코드가 복잡해지나 switch문은 변수의 값에 따라서 실행문이 결정되기 떄문에 보다 간결해진다.

switch 문은 괄호 안의 변수값에 따라 해당 case로 가서 실행문을 실행시키며 변수값과 동일한 값을 갖는 case가 없다면 default로 가서 실행문을 실행시킨다. (default 불필요시 생략이 가능하다.)

switch

        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가 있다면 다음 case 실행하지 않고 switch 문을 빠져나오고, break가 없다면 다음 case가 연달아 실행되는데, 이 때는 case 값과는 상관없이 실행된다.
        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("외근을 나갑니다.");
        }
switch 문의 괄호에는 정수 타입과 문자열 타입 변수를 사용할 수 있다.
        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("손님입니다.");
        }
Java12 이후부터는 switch문에서 표현식을 사용할 수 있다. break 대신 화살표와 중괄호를 사용해 가독성이 좋아졌다.
        char grade = 'B';
        switch (grade) {
            case 'A', 'a' -> {
                System.out.println("우수 회원입니다.");
            }
            case 'B', 'b' -> {
                System.out.println("일반 회원입니다.");
            }
            default -> {
                System.out.println("손님입니다.");
            } // 중괄호 안에 실행문이 하나만 있을 경우에는 중괄호 생략이 가능하다.
        }
Switch Expressions을 사용하면 스위치된 값을 변수에 바로 대입이 가능하며 단일 값일 경우에는 화살표 오른쪽에 기술, 중괄호를 사용할 경우에는 yield 키워드로 값을 지정하면된다. (이 경우 default가 반드시 존재해야 한다.)
타입 변수 = switch(grade) {
	case "값1" -> 변수값;
	case "값2" -> {
		...;
		yield 변수값;
	}
	default -> 변수값
};

4.4 for 문

1부터 5까지의 합을 구하는 데에만 5개의 실행문이 반복 사용되었다. 이렇게 1~100 또는 그 이상의 합을 구하는 코드를 같은 방법으로 작성한다면 코드 양이 엄청 늘어날 것이고, 이런 경우 for 문을 사용하여 코드를 획기적으로 줄일 수 있다.

	int sum = 0;
    for (int i=1; i<=100; i++) {
    	sum = sum + i; //100번 반복
    }
    System.out.println("1~100까지의 합 :" + sum);
100개의 실행문을 3개의 행으로 압축했다. 아래 그림은 for 문의 실행 흐름을 도식화 한 것이다.

초기화식 ,증감식이 둘 이상 있을 수 있는데 이런 경우에는 ','로 구분해서 작성한다. 그리고 for문 블록안에서 사용되는 로컬 변수를 for 문 밖에서도 사용하고 싶다면 초기화식에서 변수를 선언하지 말고 for 문 이전에 선언해야 한다.

	int i; // for 문 이전에 변수를 선언
    for (i=1; i<=100; i++) { ... }
    System.out.println("최종 i값: " + i); //for 문을 벗어나서 i를 사용

for 문 작성시 주의할 점은 초기화식에서 부동 소수점을 쓰는 float 타입을 사용하지 말아야 한다는 것이다.

        for(float x=0.1f; x<=1.0f; x+=0.1f) {
            System.out.println(x);
        }
위 코드는 for 문이 10번 반복해야 하지만 부동 소수점 방식의 float타입은 연산 과정에서 정확히 0.1을 표현하지 못하기 때문에 증감식에서 x에 더해지는 실제 값은 0.1보다 약간 클 수 있다. 따라서 반복 횟수는 9번이 된다.

중첩된 for 문은 지정 횟수만큼 반복하고 다시 바깥 for 문으로 돌아간다. 중첩 for 문이 필요한 가장 간단한 예로는 구구단이 있다.

	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));
        }
    }

4.5 while 문

while 문은 true일 경우에 계속 반복하고, false일 때 반복을 멈추고 종료한다.

아래는 while 문 도식화 한 사진.

        Scanner scanner = 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 = scanner.nextLine();

            if (strNum.equals("1")) {
                System.out.println("증속을 선택했습니다, 현재 속도 " + speed);
                speed++;
            } else if (strNum.equals("2")) {
                System.out.println("감속을 선택했습니다, 현재 속도 " + speed);
                speed--;
            } else if (strNum.equals("3")) {
                System.out.println("프로그램 종료, 현재 속도 " + speed);
                run = false;
            }
        }
        System.out.println("");

4.6 do-while 문

do-while은 while과 반복 실행한다는 점에서 동일하나 while은 시작할 때 부터 조건식을 평가 후 실행할지를 결정하지만 do-while문은 블록 내부를 먼저 실행시키고, 실행 결과에 따라서 반복 실행을 계속할지를 결정할 수 있다.

        System.out.println("메세지를 입력하세요");
        System.out.println("프로그램을 종료하려면 'q'를 입력하세요.");

        Scanner scanner = new Scanner(System.in);
        String inputString;

        do {
            System.out.print(">");
            inputString = scanner.nextLine();
            System.out.println(inputString);
        } while (! inputString.equals("q")); // 입력된 내용이 q가 아니라면 계속 반복

        System.out.println();
        System.out.println("프로그램 종료");
위에 예제는 실행문을 먼저 시킨 후 inputString의 값이 q가 아니면 계속 반복 실행한다.

4.7 break 문

break 문은 반복문을 중지하거나 switch 문을 종료할 때 사용된다.

        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; // break 이름; 
                }
            }
        }
        System.out.println("프로그램 실행종료");
반복문이 중첩되어 있다면 가장 가까운 반복문만 종료하게 된다. 중첩 반복문에서 바깥 반복문까지 종료하려면 해당 반복문에 이름(Lable)을 붙이고 break 이름(Lable); 을 사용 하면된다.

4.8 continue 문

for , while , do-while문에서만 사용되며 continue 문이 실행되면 for에 증감식, while do-while에 조건식으로 바로 이동한다. if 문과 같이 사용되며 특정 조건 만족 후 그 이후 문장 실행하지 않고 다음 반복을 실행한다.

        for(int i=1; i<=10; i++){
            if(i%2!=0){
                continue; // 홀수면 다음 반복으로 넘어간다.
            }
            System.out.print(i + " ");
        }

챕터 4 확인문제

1. 2번

2.

        String grade ="B";

        int score1 = switch (grade) {
            case "A" -> 100;
            case "B" -> {
                int result1 = 100 - 20;
                yield result1;
            }
            default -> 60;
        };

3.

    public static void main(String[] args) {
        int sum = 0;

        for(int i = 1; i <= 100; i++) {
            if (i%3==0) {
                sum += i;
            }
            }
        System.out.println("1부터 100까지의 정수 중에서 3의 배수의 총합은 :  " + sum);
    }
}

4.

    public static void main(String[] args) {
        while (true) {
            int i = (int) (Math.random() * 6) +1;
            int j = (int) (Math.random() * 6) +1;
            System.out.println(i + " , " + j);
            if ((i+j)==5) {
                break;
            }
        }
    }

5.

    public static void main(String[] args) {
        int x, y;
        for (x = 1; x <= 10; x++) {
            for (y = 1; y <= 10; y++) {
                if((4*x + 5*y) == 60) {
                    System.out.println(x + " , " + y);
                }
            }
        }
    }

6.

    public static void main(String[] args) {
        int i, j;
        for (i=1; i<=5; i++) {
                for (j=1; j<=i; j++) {
                    System.out.print("*");
                    if (j==i) {
                        System.out.println();
                    }
                }
        }
    }

7.

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int Num = 0;
        boolean bank = true;

        while(bank) {

            System.out.println("---------------------------------");
            System.out.println("1.예금 | 2.출금 | 3.잔고 | 4.종료");
            System.out.println("---------------------------------");
            System.out.println("선택 > " );

            int InputNum = scanner.nextInt();

            switch (InputNum) {
            case 1:
                System.out.println("예금액 > ");
                Num = Num + scanner.nextInt();
                break;
                case 2:
                    System.out.println("출금액 > ");
                    Num = Num - scanner.nextInt();
                    break;
                case 3:
                    System.out.println("잔고 > " + Num);
                    break;
                case 4:
                    bank = false;
                    break;
            }
            System.out.println();
        }
        System.out.println("프로그램 종료");
    }

연습문제 푸는데 뭔 한시간이나 걸리지?

0개의 댓글

관련 채용 정보