본문 바로가기
카테고리 없음

조건문2 (중첩 if문, switch)

by 낭만 코딩 2024. 8. 10.

1. 중첩 if문

2. switch

 

1. 중첩 if 문

if 문의 중괄호 블록 안에 또 다른 if 문이 포함되는 것을 중첩 if문이라고 한다. 이름 그대로 if 문이 중첩된 것입니다. 프로그래밍을 처음 배울 때 어려워지기 시작하는 부분이 소스가 중첩되기 시작하면서인데요, 왜냐하면 소스가 중첩될수록 프로그램의 실행 순서나 절차를 이해하기 어려워지기 때문입니다. 그래서 더더욱 구조를 정확히 이해 해둘 필요가 있습니다. if 문 외에도 앞으로 배울 다양한 제어문과 반복문 모두 중첩이 가능합니다. 중첩이라는 개념에 대해서 꼭 이해하고 넘어가세요.

 

중첩 if 문의 구조

if (조건식1) {
    if (조건식2) {
        실행문1; // 조건식1과 조건식2가 모두 true인 경우 실행
    } else {
        실행문2; // 조건식1은 true, 조건식2는 false인 경우 실행
    }
    실행문3; // 조건식1은 true, 조건식2 여부 상관없이 실행
} else {
    실행문4; // 조건식1은 false, 조건식2 여부 상관없이 실행
}

 

위 구조는 조건식1을 갖는 if ~ else 문에서 조건식2의 if 문이 추가되어 중첩된 구조입니다. 처음 배울땐 이렇게 한번 중첩된 구조도 복잡해 보이고, 어려워 보이지만, 천천히 하나씩 분리해서 보면 어렵지 않게 이해할 수 있습니다. 실제 어플리케이션 개발에서는 2,3 단계 이상 중첩된 구주도 많이 사용되기 때문에 중첩된 코드를 일일히 다 외우지 말고, 개념을 이해하는 것이 중요합니다. 안쪽의 if 문은 바깥쪽의 if 문의 조건식1이 true인 경우에만 실행되는데, 그 안쪽 if 문 역시 true, false 결과값에 따라 다르게 실행되며 이 안쪽 if 문의 모든 실행이 끝나면 바깥 if 문의 true 일때의 중괄호 실행 블록이 종료되고 전체 if 문이 종료됩니다. 결국, 실행문1은 조건식1과 조건식2가 모두 true 인 경우 실행되고, 실행문2는 조건식1은 true이지만 조건식2가 false인 경우 실행되는 영역입니다. 주의할 부분은 실행문3은 조건식1이 true 이기 때문에 해당 중괄호 블록영역이 실행되는데 안쪽 if 문의 결과와는 상관없이 실행되는 영역입니다. 즉, 조건식1은 true이고, 조건식2는 true이던, false이던 상관없이 실행됩니다. 마지막으로 실행문4는 바깥쪽 if 문의 else 영역에 있으므로 조건식1이 false 인 경우에 실행되고, 조건식2여부는 상관이 없습니다. 왜냐하면 안쪽 if 문은 아예 실행이 되지 않기 때문이죠.

 

public class IfSample3 {

	public static void main(String[] args) {
		
		int math = 90;
		int eng = 95;
		
		if (math >= 60) {
			if (eng >= 60) {
				System.out.println("합격");
			}
		} else {
			System.out.println("불합격");
		}

	}
}

 

실행 결과

통과

 

 

위 예제는 수학점수 값을 담을 math라는 변수에 90, 영어점수 값을 담기 위해 eng라는 변수에 95를 대입했습니다. 그리고 if 문을 통해 조건식을 비교하는데, math90이기 때문에 math >= 60 조건은 참이 되어 해당 블록이 실행됩니다. 이 블록 안에 또 다른 if문이 있으므로 다시 조건식을 확인하는데, 이 조건식 eng >= 60은 true가 되어 “합격”이라고 출력된 것입니다. 이제 math 변수를 50으로 수정하고 실행해볼까요. 안쪽 if 문의 조건식 eng >= 60 은 true 이지만 바깥 if 문이 false 이므로 “불합격이라고 출력이 됩니다. “합격”이라고 출력이 되려면 math60이상이어야 하고, eng60이상일 때만 출력이 되는 것입니다.

 

그럼 논리연산 적용해서 하나의 if문으로 작성해볼까요.

 

public class IfSample4 {

	public static void main(String[] args) {
		
		int math = 90;
		int eng = 95;
		
		if (math >= 60 && eng >= 60) {
			System.out.println("합격");
		} else {
			System.out.println("불합격");
		}

	}
}

 

if 문 조건식을 살펴보면 math >= 60 && eng >= 60 and 연산이므로 math >= 60 조건도 true이고, eng >= 60true이면 최종 결과값이 true가 되므로 출력결과는 합격이라고 출력이 됩니다.

 

 

 

2. switch 문

switch 문도 if 문과 같이 조건문 중 하나지만, 조건식의 결과 (true / false) 여부에 따라 중괄호 블록 내부의 실행문이 실행되는 것이 아니라, 변수의 값에 따라 실행문을 선택하게 되는 구문입니다.

 

switch 문의 구조

switch (변수) {
    case 값1:
        실행문1; // 변수의 값 == 값1
        break;
    case 값2;
        실행문2; // 변수의 값 == 값2
        break;
    default :
        실행문3; // 변수의 값이 값1도 아니고, 값2도 아닌 경우
}

 

switch 문의 실행 순서는 switch 괄호안에 변수를 넣어 각 case의 값과 비교해서 같은 값을 갖는 case 구문의 실행문을 실행하고, break를 만나 전체 switch문을 종료하고 빠져나오게 됩니다. 같은 값을 갖는 case가 없다면 default 구문의 실행문이 실행되는데요, 주의할 점은 break를 쓰지 않으면, break를 만날 때까지 실행되거나, 아니면 모든 case가 계속 실행되므로 특별한 경우를 제외하고는 반드시 각 case마다 실행문 아래에 break를 넣어줘야 합니다.

 

예제를 통해 switch 문을 살펴보겠습니다.

public class SwitchSample {

	public static void main(String[] args) {
		
		int number = 3;
		
		switch(number) {
			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번");
		}

	}
}

 

실행 결과

3번

 

number 변수에 정수 3을 대입하고 이 변수를 switch 괄호 안에 넣어 각 case로 비교합니다. case 3: 에 해당되므로 “3이 출력되고 바로 아래 break를 만나 swtich문이 종료됩니다. 그럼 각 case 마다 break를 전부 빼고 다시 실행해볼까요?

public class SwitchSample {

	public static void main(String[] args) {
		
		int number = 3;
		
		switch(number) {
			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번");
		}

	}
}

 

실행 결과

3번
4번
5번
6번

 

3번, 4번, 5번, 6번이 출력되는데 그 이유는 case 3에 해당되어 "3번"이 출력되고 break문이 없어 그 이후부터는 모두  출력되는 것입니다. 

아마 출력된 실행 결과를 보면 뭔가 오류가 있다는것을 금방 눈치채셨을 텐데요. 아래 예제는 콘솔에서 점수를 입력받아 학점을 출력하는 프로그램입니다. break를 넣지 않은 경우 어떻게 출력되는 확인해볼까요.

 

public class SwitchSample2 {

	public static void main(String[] args) {
		
		int score = 90;
		String grade = "";
		switch(score / 10) {
			case 9:
				grade = "A";
			case 8:
				grade = "B";
			case 7:
				grade = "C";
			case 6:
				grade = "D";
			default:
				grade = "F";
		}
		System.out.println("학점 : "+grade);

	}
}

 

 

실행 결과

학점 : F

 

분명 score 변수에 90이 저장되어 90 / 10 은 9가 되어 grade라는 변수에 "A" 문자열이 대입되었을텐데, 마지막 학점에는 F라는 값이 출력됩니다. 아까 예제와 마찬가지로 break; 가 빠져있기 때문에 case 8, case 7 ,case 6, default 까지 모두 실행되어 결국 "F"까지 대입이 된것이죠. 아까 예제는 여러값이 출력되어 오류가 있다는 것을 금방 눈치챌 수 있지만, 지금 이 예제는 자세히 보지 않으면 오류를 놓칠 수 있는 예제입니다. 별거 아니라고 생각될 수 있지만, 차라리 에러라도 나면 금방 눈치챌 수 있는 문제들도 이렇게 에러가 나지 않는 오류들은 나중에 엄청나게 큰 문제가 되기도 하니까, 더욱 주의해야 합니다.

참고로 switch 문의 괄호안에는 byte, short, int, char, String이 모두 가능한데, String (문자열)은 JDK 1.7 이상에서만 가능하니 참고하세요.