본문 바로가기
Programming/JAVA

Ch4. 제어 흐름 이해하기

by 안녕주 2021. 7. 18.

04-1 조건문

-1. 조건문이란?

-2. if문과 else문

if(조건식) {
	수행문; //조건식이 참일 경우에 이문장을 수행
}
if(조건식) {
	수행문; //조건식이 참일 경우에 이문장을 수행
}
else {
	수행문2;  //조건식이 거짓일 경우에 이 문장을 수행
}
package ifexample;

public class IfExample1{
    public static void main(String[] args){
        int age = 7;
        if(age >= 8){
            System.out.println("학교에 다닙니다.");
        }
        else{
            System.out.println("학교에 안 다닙니다.");
    }
}

 

-3. if-else if-else문

if(조건식1){
	수행문1; //조건문1이 참일 경우 수행함
}
else if(조건식2){
	수행문2;  //조건문2가 참일 경우 수행함
}
else if(조건식3){
	수행문3;  //조건문3이 참일 경우 수행함
}
else(조건식4){
	수행문4;  //위의 조건이 모두 해당하지 않는 경우에 수행함
}
수행문5;  //if-else if-else무니 끝난 후 수행함

1. if-else문 예제

아래의 예제는 하나의 조건을 만족하면 나머지 조건을 비교하지 않고 다음 수행문으로 넘어간다.

package ifexample;

public class IfExample2{
    public static void main(String[] args){
        int age = 9;
        int charge;

        if (age < 8){
            charge = 1000;
            System.out.println("취학 전 아동입니다.");
        }
        else if (age < 14){
            charge = 2000;
            System.out.println("초등학생입니다.");
        }
        else if (age < 20){
            charge = 2500;
            System.out.println("중, 고등학생입니다.");
        }
        else {
            charge = 3000;
            System.out.println("일반인입니다.");
        }
        System.out.println("입장료는 "+ charge + "원 입니다.");
        //초등학생입니다. 
        //입장료는 2000원입니다.
    }
}

2. if-if문 예제

아래의 예제 같은 경우에는 조건마다 각각 비교합니다.

따라서 if문을 2개 방문하고 출력결과가 예상과는 다르게 나오는 것을 알 수 있다.

package ifexample;

public class IfExample2{
    public static void main(String[] args){
        int age = 9;
        int charge;

        if (age < 8){
            charge = 1000;
            System.out.println("취학 전 아동입니다.");
        }
        if (age < 14){
            charge = 2000;
            System.out.println("초등학생입니다.");
        }
        if (age < 20){
            charge = 2500;
            System.out.println("중, 고등학생입니다.");
        }
        else {
            charge = 3000;
            System.out.println("일반인입니다.");
        }
        System.out.println("입장료는 "+ charge + "원 입니다.");
        //초등학생입니다.
        //중, 고등학생입니다.
        //입장료는 2500원입니다.
    }
}

 

-4. 조건문과 조건 연산자

1. if-else문

if (a > b)
    max = a;
else
    max = b;

2. 조건 연산자 : 간단한 조건문이고 선택이 두가지만 있는 경우에 주로 사용

max = (a > b) ? a:b;

 

-5. switch-case문

조건식의 결과가 정수 또는 문자열 값이고 그 값에 따라 수행되는 경우가 각각 다른 경우에는 switch-case문으로 구성하는 것이 코드도 깔끔하고 가독성도 좋다.

  • switch-casea문에서는 default문이 if-else의 else역할이다.
  • break문은 switch-case문의 수행을 멈추고 빠져나가도록 만든다.
  • switch-case문은 주로 조건이 하나의 변수 값이나 상수 값으로 구분되는 경우 사용한다.
switch(조건){
    case 값1 : 수행문1;
                break;
    case 값1 : 수행문2;
                break;
    case 값1 : 수행문3;
                break;
    default : 수행문4;
}
package ifexample;

public class SwitchCase {
    public static void main(String[] args){
        int ranking = 1;
        char medalColor;

        switch(ranking){
            case 1: 
                medalColor = 'G';
                break;
            case 2:
                medalColor = 'S';
                break;
            case 3:
                medalColor = 'B';
                break;
            default:
                medalColor = 'A';
        }
        System.out.println(ranking + "등 메달의 색깔은 " + medalColor + " 입니다.");
    }
}

1. case문 동시에 사용하기

각 달의 날짜를 출력하는 예제를 생각해보자. 1,3,5 기자,7,8,10,12 월은 31일까지 4,6,9,11월은 30일까지이고 2월은 편의상 28일까지라고 하겠다.

case 1: case 3 : case 5 : case 7 : case 8 : case 10 : case 12 : 
	day = 31;
    break;
case 4 : case 6 : case 9 : case 11 : 
	day = 30;
    break;
case 2 :
	day = 28;
    break;

2. switch-case문에서 break문의 역할

break문을 사용하지 않으면 첫번째 case 조건을 만족했다고 하더라도 잇따라 나오는 문장까지 모두 수행되어서 맨 마지막 default문까지 다 수행한 후에 switch-case문을 나온다.

따라서  조건에 맞는 수행문을 수행한 후 switch-case문을 빠져나올 수 있도록 break문을 꼭 사용해야 한다.

 

-6. case문에 문자열 사용하기

자바7부터는 switch-case문의 case 값에 정수 값뿐 아니라 문자열도 사용할 수 있다.

이전에는  if (medal.equals("Gold")){ .. } 형태로 문자열을 비교하는 equals() 메소드를 사용해야했지만 자바 7부터는 문자열을 직접 case문에 사용할 수 있으므로 프로그램을 더 간결하게 구현할 수 있다.

package ifexample;

public class SwitchCase2 {
    public static void main(String[] args){
        String medal = "Gold";

        switch(medal){
            case "GOld": 
                System.out.println("금메달입니다.");
                break;
            case "Silver":
                System.out.println("은메달입니다.");
                break;
            case "Bronze":
                System.out.println("동메달입니다.");
                break;
            default:
                System.out.println("메달이 없습니다.");
                break;
        }
    }
}

 


04-2 반복문

-0. 반복문이란?

지금까지 우리가 배운 것만으로 1 부터 10까지 더하여 그 합을 계산해보자

package loopexample;

public class SwitchCase2 {
    public static void main(String[] args){
        int num = 1;
        num += 2;
        num += 3;
        num += 4;
        num += 5;
        num += 6;
        num += 7;
        num += 8;
        num += 9;
        num += 10;

        System.out.println("1부터 10까지의 합은 " + num + "입니다.");
    }
}

그냥 보기에도 비효율적이다. 이렇게 반복되는 일을 처리하기 위해 사용하는 것이 '반복문'이다.

자바프로그램에서 사용하는 반복문의 종류에는 while문, do-while문, for문 이렇게 세가지가 있다.

 

-1. While문

while(조건식){
    수행문1;  //조건식이 참인 동안 반복 수행
    ....
}
    수행문2;
    ....

1. 반복 횟수가 정해진 경우의 조건식

package loopexample;

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

        while (num <= 10){
            sum += num;
            num++;
        }
        System.out.println("1부터 10까지의 합은 " + sum + "입니다.");
    }
}

2. 무한히 반복되는 경우

while(true){
    ...
}

 

-2. do-while문

while문은 조건을 먼저 검사하기 때문에 조건식에 맞지 않으면 반복 수행이 한번도 일어나지 않는다.

do-while문은 { } 안의 문장을 무조건 한 번 수행한 후에 조건식을 검사한다. 즉 조건이 만족하는지 여부를 마지막에 검사하는 것이다.

따라서 중괄호 안의 문장을 반드시 한번 이상 수행해야할 때 do-while문을 사용한다.

do{
    수행문1;
    ...
} while (조건식);
    수행문2;
    ...
package loopexample;

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

        do{
            sum += num;  //조건식이 참이 아니더라도 무조건 한번 수행함
            num++;
        } while(num <= 10);

        System.out.println("1부터 10까지의 합은 " + sum + "입니다."); //55
    }
}

 

-3. for문

for(초기화식;조건식;증감식){
    수행식;
}
package loopexample;

public class ForExample1 {
    public static void main(String[] args){
        int i;
        int sum;

        for(i = 1, sum = 0; i <= 10; i++){
            sum += i;
        }

        System.out.println("1부터 10까지의 합은 " + sum + "입니다."); //55
    }
}
  • 초기화부분과 증감식 부분도 콤마(,)로 구분하여 여러문장을 사용할 수 있다.

for문을 구성하는 요소는 코드가 중복되거나 논리 흐름상 필요없으면 생략할 수 있다.

(1) 초기화식 생략 : 다른곳에서 변수가 초기화 되었을 때

(2) 조건식 생략 : 어떤 연산 결과 값이 나왔을 때 for문의 수행을 멈추려는 경우

(3) 증감식 생략 : 연산이 복잡하거나 다른 변수의 연산결과값애 좌우되는 경우

(4) 요소 모두 생략 : 무한 반복

 

-4. 중첩된 반복문

package loopexample;

public class NestedLoop {
    public static void main(String[] args){
        int dan;
        int times;

        for(dan = 2; dan <= 9; dan++){
            for(times = 1; times <= 9; times++){
                System.out.println(dan + "X" + times + "=" + dan * times);
            }
            System.out.println();
        }   
    }
}

<while, do-while, for문은 각각 어떤 경우에 사용하는 것이 가장 좋을까요?>

1. while문 : 참-거짓에 따라 반복문이 수행하는 경우

2. do-while문 : 수행문을 반드시 한 번 이상 수행해야 하는 경우 

3. for문 : 반복횟수가 정해진 경우

 

-5. continue문

continue문은 반복문과 함께 쓰인다. continue문을 만나면 이후의 문장은 수행하지 않고 for문의 처음으로 돌아가 증감식을 수행한다.

  • continue문은 특정조건에서는 수행하지 않고 건너뛰어야 할 때 사용한다.
package loopexample;

public class ContinueExample {
    public static void main(String[] args){
        int total = 0;
        int num;

        for(num = 1; num <= 100; num++){ //100까지 반복
            if (num % 2 == 0)            //num 값이 짝수인경우
                continue;                //이후 수행을 생략하고 num++ 수행
            total += num;                //num값이 홀수인 경우에만 수행
        }
        System.out.println("1부터 100까지의 홀수의 합은: "+ total + "입니다.");
    }
}

 

-6. break문

반복문에서 break문을 사용하면 그 지점에서 더 이상 수행문을 반복하지 않고 반복문을 빠져나온다.

1. 0부터 시작해 숫자를 1씩 늘리면서 합을 계산할 때 숫자를 몇까지 더하면 100이 넘는지 알고싶다.

- 아래의 에제는 합이 105, num은 15가 출력 되었다.

- 그러면 1부터 15까지 더햇을 때 100이 넘는가 --> 아니다.

- 합이 105가 되었을 때의 num값은 14다.

- num 14값을 얻으려면 증감이 이루어지기 전에 반복문을 끝내야한다.

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

        for(num = 0; sum < 100; num++){
            sum += num;
        }
        System.out.println("num: " + num ); //15
        System.out.println("sum: " + sum ); //105
    }
}

2. 해결

package loopexample;

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

        for(num = 0; sum < 100; num++){
            sum += num;
            if(sum >= 100)
                break;
        }
        System.out.println("num: " + num ); //14
        System.out.println("sum: " + sum ); //105
    }
}

3. break문의 위치

반복문이 중첩된 경우, break문을 사용하면, 모든 반복문을 빠져나오는 것이 아니고 break문이 감싸고 있는 반복문만 빠져나온다.

댓글