[자바의 정석] 조건문

Jiwon An·2023년 10월 8일
0

Java

목록 보기
7/9

조건문 - if, switch

조건문은 조건식과 문장을 포함하는 블럭{}으로 구성되어 있으며, 조건식의 연산결과에 따라 실행할 문장이 달라져서 프로그램의 실행흐름을 변경할 수 있습니다. 조건문은 if문과 switch문, 두 가지가 있으며 주로 if문이 많이 사용됩니다.

if문

if문은 가장 기본적인 조건문이며, '조건식'과 '괄호{}'로 이루어져 있습니다.

if (조건식) {
   // 조건식이 참(true)일 때 수행될 문장들을 적는다.
}

블럭{}

괄호{}를 이용해서 여러 문장을 하나의 단위로 묶을 수 있는데, 이것을 '블럭(block)'이라고 합니다. 블럭 내의 문장들은 탭(tab)으로 들여쓰기(indentation)를 해서 블럭 안에 속한 문장이라는 것을 알기 쉽게 해주는 것이 좋습니다.

블럭의 시작을 의미하는 '{'의 위치는 두 가지 스타일이 있는데, 각 스타일마다 장단점이 있으므로 본인의 취향에 맞는 것으로 선택해서 사용하면 됩니다. 왼쪽의 스타일은 라인의 수가 짧아진다는 장점이, 오른쪽의 스타일은 블럭의 시작과 끝을 찾기 쉽다는 장점이 있습니다.

if(조건식) {                         if(조건식)
	...                            {
}                                 		...
								   }

블럭 내의 문장이 하나뿐인 경우 괄호{}를 생략할 수 있지만 가능하면 생략하지 않고 사용하는 것이 바람직합니다. 나중에 새로운 문장들이 추가되면 괄호{}로 문장들을 감싸 주어야 하는데, 이 때 괄호{}를 추가하는 것을 잊기 쉽기 때문입니다.

if(score > 60)
	System.out.println("합격입니다."); // 문장1 if문에 속한 문장
    System.out.println("축하드립니다."); // 문장2 if문에 속한 문장이 아님

if-else문

if문의 변형인 if-else문은 구조는 다음과 같습니다.

if(조건식) {
	// 조건식이 참(true)일 때 수행될 문장들
} else {
	// 조건식이 거짓(false)일 때 수행될 문장들
}

조건식의 결과에 따라 이 두 개의 블럭{} 중 어느 한 블럭{}의 내용이 수행되고 전체 if문을 벗어나게 됩니다. 두 블럭{}의 내용이 모두 수행되거나, 모두 수행되지 않는 경우는 있을 수 없습니다.

if-else if문

처리해야할 경우의 수가 셋 이상인 경우에는 한 문장에 여러 개의 조건식을 쓸 수 있는 'if-else if'문을 사용하면 됩니다.

if(조건식1) {
	// 조건식1의 연산결과가 참일 때 수행될 문장들
} else if(조건식2) {
	// 조건식2의 연산결과가 참일 때 수행될 문장들
} else if(조건식3) { // 여러 개의 else if 사용할 수 있음
	// 조건식3의 연산결과가 참일 때 수행될 문장들
} else { // 마지막에는 보통 else블럭으로 끝나며, else블럭은 생략가능
	// 위의 어느 조건식도 만족하지 않을 때 수행될 문장들
}

중첩 if문

if문의 블럭 내에 또 다른 if문을 포함시키는 것이 가능한데 이것을 중첩 if문이라고 부르며 중첩의 횟수에는 거의 제한이 없습니다.

if(조건식1) {
	// 조건식1의 연산결과가 true일 때 수행될 문장들
   	if (조건식2) {
    	// 조건식1과 조건식2가 모두 true일 때 수행될 문장들
    } else {
    	// 조건식1이 true이고, 조건식2가 false일 때 수행될 문장	 
    }
} else { 
	// 조건식1이 false일 때 수행되는 문장들
}

중첩if문에서는 괄호{}의 생략에 더욱 조심해야 합니다. 바깥쪽의 if문과 안쪽의 if문이 서로 엉켜서 if문과 else블럭의 관계가 의도한 바와 다르게 형성될 수도 있기 때문입니다.

if(num >= 0)                 if(num >= 0) {
	if (num != 0)				if (num != 0) {
    	sign = '+';					sign = '+';
else							} else {
	sign = '-';						sign = '-';
								}
                             }

왼쪽의 코드는 언뜻 보기에 else블럭이 바깥쪽의 if문에 속한 것처럼 보이지만, 괄호가 생략되었을 때 else블럭은 가까운 if문에 속한 것으로 간주되기 때문에 실제로는 오른쪽과 같이 안쪽 if문의 else블럭이 되어버립니다. 이제 else블럭은 어떤 경우에도 수행될 수 없습니다. 그래서 괄호{}를 넣어서 if블럭과 else블럭의 관계를 확실히 해주는 것이 좋습니다.

switch문

switch문은 if문과 달리 단 하나의 조건식으로 많은 경우의 수를 처리할 수 있고, 표현도 간결하므로 알아보기 쉽습니다. 그래서 처리할 경우의 수가 많은 경우에는 if문 보다 switch문으로 작성하는 것이 좋습니다.

switch (조건식1) {
	case 값1:
    	// 조건식의 결과가 값1과 같은 경우 수행될 문장들
        // ..
        break;
    case 값2:
    	// 조건식의 결과가 값2과 같은 경우 수행될 문장들
        // ...
        break;
    // ...
    default:
    	// 조건식의 결과와 일치하는 case문이 없을 때 수행될 문장들
        // ...
}

switch문은 조건식을 먼저 계산한 다음, 그 결과와 일치하는 case문으로 이동합니다. 이동한 case문 아래에 있는 문장들을 수행하며, break문을 만나면 전체 switch문을 빠져나가게 됩니다. 만일 조건식의 결과와 일치하는 case문이 하나도 없는 경우에는 default문으로 이동합니다. default문의 위치는 어디라도 상관없으나 보통 마지막에 놓기 때문에 break문을 쓰지 않아도 됩니다.

주의할 점

switch문에서 break문은 각 case문의 영역을 구분하는 역할을 하는데, 만일 break문을 생략하면 case문 사이의 구분이 없어지므로 다른 break문을 만나거나 switch문 블럭{}의 끝을 만날 때까지 나오는 모든 문장들을 수행합니다. 이러한 이유로 각 case문의 마지막에 break문을 빼먹는 실수를 하지 않도록 주의해야합니다.

그러나 경우에 따라서는 다음과 같이 고의적으로 break문을 생략하는 경우도 있습니다.

switch (level) {
	case 3:
    	grantDelete() // 삭제 권한을 줌
    case 2:
    	grantWrite() // 쓰기 권한을 줌
    case 1:
	    grantRead() // 읽기 권한을 줌
}

switch문의 제약조건

  1. switch문의 조건식은 결과는 정수 또는 문자열이어야 한다.
  2. case문의 값은 정수 상수, 문자열만 가능하며, 중복되지 않아야 한다.

switch문의 조건식은 결과값이 반드시 정수이어야 하며, 이 값과 일치하는 case문으로 이동하기 때문에 case문의 값 역시 정수 또는 문자열이어야 합니다.** 그리고 중복되지 않아야 합니다. 같은 값의 case문이 여러 개이면, 어디로 이동해야할 지 알 수 없기 때문입니다. 게다가 case문의 값은 반드시 상수이어야 합니다.

switch문의 중첩

if문처럼 switch문도 중첩이 가능합니다. 한 가지 주의할 점은 중첩 switch문에서 break문을 빼먹기 쉽다는 것입니다.

profile
🚀 백엔드 2년차 개발자입니다 🚀 성장의 즐거움으로 아자자자!🤣

0개의 댓글