Kindbeeeear_ 2021. 12. 29. 19:41

제어문의 종류는 조건문과 반복문이 있는데 반복문은 다음에 알아보도록 하고, 이번엔 조건문에 대해 알아보도록 하겠다. 조건문에는 if문과 switch문이 있다.

 

조건문

if문

if문은 조건식의 결과에 따라 블록 실행 여부가 결정된다. 다음은 if문의 형식과 실행 흐름을 보여준다.

if문 실행 순서

조건식에는 true 또는 false 값을 산출할 수 있는 연산식이나, boolean 변수가 올 수 있다. 조건식에 true 이면 불록은 실행하고 false 이면 블록을 실행하지 않는다.

 

중괄호 { } 블록은 여러 개의 실행문을 하나로 묶기 위해 작성된다. 만약 조건식이 true가 될 때 실행해야 할 문장이 하나 밖에 없다면 생략할 수 있다. 하지만 중괄호 { } 블록을 생략하지 않고 작성하는 것을 추천한다. 가독성을 높이기 위해, 버그 발생의 원인을 줄이기 위해서라도 중괄호 블록을 사용하는 것을 추천한다. (필자는 생략하는 편) 다음 예제를 보자.

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 입니다.");
    }
}

score 변수의 값이 93이므로 5라인의 if 조건식은 93 > 90 이 되어 true가 된다. 따라서 중괄호 블록의 실행문인 6~7라인이 모두 실행된다. 그러나 10라인의 if 조건식은 93 < 90 이 되어 false가 된다. 그러므로 그 "점수가 90보다 작습니다."는 출력되지 않는다. 문제는 12라인이다. 의도한 바로는 점수가 90보다 작을 때 "등급은 B 입니다." 를 출력하고 싶었던 것인데, 실행 결과를 보면 점수와는 상관없이 12라인은 무조건 실행된다. 그 이유는 10라인의 if문은 중괄호 블록이 없어 11라인 까지만 영향을 미치기 때문에 12라인은 들여쓰기만 되었을 뿐 if문과 아무런 관련이 없다.

 

if-else문

if문은 else 블록과 함께 사용되어 조건식의 결과에 따라 실행 블록은 선택한다. if문의 조건식이 true이면 if문의 블록이 실행되고, 조건식이 false이면 else 블록이 실행된다. 조건식의 결과에 따라 이 두 개의 블록 중 어느 한 블록의 내용만 실행하고 전체 if문을 벗어나게 된다. 다음은 if-else문의 형식과 실행 흐름을 보여준다.

if-else문 실행 순서

이전 예제는 두 개의 if문을 이용하였는데, 이것보다는 다음과 같이 if-else문으로 간단히 처리하는 것이 더욱 간결한 코딩이 된다.

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 입니다.");
		}
	}
}

 

if-else if-else문

조건문이 여러개인 if문도 있다. 처음 if문의 조건식이 false인 경우 다른 조건식의 결과에 따라 실행 블록을 선택할 수 있는데, if 블록의 끝에 else if문을 붙이면 된다. else if문의 수는 제한이 없으며 여러 개의 조건식 중 true가 되는 블록만 실행하고 전체 if문을 벗어나게 된다. else if 블록의 마지막에는 else 블록을 추가할 수 있는데, 모든 조건식이 false일 경우 else 블록을 실행하고 if문을 벗어나게 된다. 다음은 if-else if-else문의 형식과 실행 흐름을 보여준다.

if-else if-else문 실행 순서

이전 예제는 점수가 90점 이상이거나 미만일 경우에만 실행 흐름을 제어했는데, 이번 예제는 조건식 3개를 이용해서 실행 흐름을 제어한다.

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 입니다.");
		}
	}
}

 

위의 코드에서는 score의 값을 정해주었다. 임의의 정수를 선택하게 할 수 있다면 어떨까? 예를 들어, 주사위를 굴려서 한개의 면이 나올 확률은 1/6 이다. 즉, 완전하게 랜덤이라는 말이다. 이럴 때 사용할 수 있는 메소드가 있다. 바로 Math.random() 메소드이다. 이 메소드는 0.0과 1.0 사이에 속하는 double 타입의 난수 하나를 리턴해준다. 따라서 주사위 번호 하나를 뽑기 위해 다음 연산식을 사용할 수 있다.

int num = (int) (Math.random() * ) + 1;

 

중첩 if문

if문의 블록 내부에는 또 다른 if문을 사용할 수 있다. 이것을 중첩 if문이라고 부르는데, 중첩의 단계는 제한이 없기 때문에 실행 흐름을 잘 판단해서 작성하면 된다. 사실 if문만 중첩이 되는 것은 아니며, 나중에 배울 switch문, for문, while문 등을 서로 중첩시킬수 있다. 다음 그림은 중첩 if문의 실행 흐름을 보여준다.

중첩 if문은 좀 더 세부적으로 조건문을 작성할 수 있다.

public class IfNestedExample {
	public static void main(String[] args) {
    	int score = (int)(Math.random() * 20) + 81;
        System.out.println("점수: " + score);
        
        String grade;
        
        if(score > 90) {
        	if(score >= 95){
            	grade = "A+";
            }
            else{
            	grade = "A";
            }
        }
    }
}

 

switch문

switch문은 if문과 마찬가지로 조건 제어문이다. 하지만 switch문은 if문처럼 조건식이 true일 경우에 블록 내부의 실행문을 실행하는 것이 아니라, 변수가 어떤 값을 갖느냐에 따라 실행문이 선택된다. switch문은 변수의 값에 따라서 실행문이 결정되기 때문에 같은 기능의 if문보다 코드가 간결하다. 다음은 swtich문의 형식과 실행 흐름을 도식화한 것이다.

switch문 실행 순서

switch문은 괄호 안의 값과 동일한 값을 갖는 case로 가서 실행문을 실행시킨다. 만약 괄호 안의 값과 동일한 값을 갖는 case가 없으면 default로 가서 실행문을 실행시킨다. default는 생략 가능하다. case 끝에 break가 붙어 있는 이유는 다음 case를 실행하지 말고 switch문을 빠져나가기 위해서이다. break가 없다면 다음 case가 연달아 실행되는데, 이때에는 case값과 상관없이 실행된다.

public class SwitchStringExample {
	public static void main(String[] args) {
		String position = "과장";
		
		switch(position) {
		case "부장":
			System.out.println("700만원");
			break;
		case "과장":
			System.out.println("500만원");
			break;
		default:
			System.out.println("300만원");
		}
	}
}