Developer/JAVA

JAVA , 제어문 (조건문) if / switch

단님 2024. 7. 30. 22:26
728x90

 

 

 

조건문
if / switch

 

단일 구문과 삼항식

 

  •  단일구문
if(rain) result="study java";
else result="그럼에도 불구하고 study";

else 구문은 생략 가능하고 , 필요시에 사용

-else의 구문은 가장가까운 if 절과 매치되고 ,

if(score > 80 )
	if(score > 90 ) System.out.println("90점 초과");
	else  System.out.println("80점 초과 90점 이하");

만약 다른 if 절과 else 절을 매치 시키려면 중괄호를 사용하여 블럭으로 묶는다.

if(score > 80 ){
	if(score > 90 ) System.out.println("90점 초과");
}else  System.out.println("80점 미만");

 

  • 삼항식
boolean rain = true; // 지역변수
String result =(rain ==true) ? "study java" : "그럼에도 불구하고 study";

맨위의 예제코드를 함축하여 삼항식으로 표현 가능.

조건문 ? 참일때 실행문 : 거짓일때 실행문;

 

 

if 의 복합구문과 복합 조건식

 

  • 복합구문

- 중괄호를 사용하여 문장을 그룹핑 한 형태의 구문.

- 블록(block)이라고도 함.

-단일문 대신 들어갈 수 있다.

		rain = true; // main의 지역변수
		if (rain) {
			int i = 100; // if 구문에 종속된 지역변수.(정의된 블럭 내에서만 유효함)
			System.out.println("비가 오면 ?");
			System.out.println(result);
			System.out.println("if의 지역변수 i  :"+ i);
		}else {
			System.out.println("if의 지역변수 i  :"+ i); // i는 사용 불가 지역.컴파일 에러.
		}

int i 같은 경우 if 절 안의 지역변수 임으로 else의 구문에 들어갈 수 없다.

 

  • 복합 조건식
String day = "Red";
if(!rain&&(day=="Red")) {
	System.out.println("공원에 산책을 간다");
}else {
	System.out.println("집에서 요리를 한다");
}

if 절의 조건식에 복합적인 구문이 들어갈 수 있다.

rain 이 false 면서 day가 Red 면 실행할 구문 , 아니면 실행될 구문.

 

→구문을 나누어서 세분화 하여 사용하는 것도 가능하다

if (!rain) {
	if (day=="Red") {
		System.out.println("비가 안오는 공휴일");
	}else {
		System.out.println("비가 안오는 평일");
	}
}else {
	System.out.println("비가 오는 모든날");
}

 

 

 

if 의 등급 처리 예제

 

문제 : score 90 이상 : A / 80 이상 : B / 70 이상 : C / 60 이상 : D / 아니면 F
	int score = 75;
	char grade ;
	
	if(score>=90) {
		grade = 'A';
		if(score ==100) System.out.println("100점 ,장학금지급");
	}else if (score>=80) {
		grade = 'B';
	}else if (score>=70) {
		grade = 'C';
	}else if (score>=60) {
		grade ='D';
	}else {
		grade = 'F';
		
	}
	System.out.printf("score 는 %d , gade는 %c %n",score,grade);
    //결과 : score 는 75 , gade는 c

 

 

  •  else if 를 사용하지 않고 if 와 else를 사용한다면 어떨까 ? 구문 비교 !
	// 구문 비교
	if(score>=90) grade='A';
	if(score>=80) grade='B';
	if(score>=70) grade='C';
	if(score>=60) grade='D';
	else grade='F';
	System.out.printf("score 는 %d , gade는 %c %n",score,grade);
	//결과 : score 는 75 , gade는 D

gade가 최초 70이상일때의 구문에서 C가 되었다가 , 60 이상일때 D가 되어버린다.

else의 구문은 위의 코드와 동일하게 60미만을 뜻하는 구문이 된다.

즉 , 원치 않은 결과값을 얻을 수 있는 오류가 발생한다.

 

  • 중첩 if 의 형태는 어떤 형태가 될까 ?
if(score>=90) {//90이상
	grade = 'A';
	if(score ==100) System.out.println("100점 ,장학금지급");
}else {//90미만
	if (score>=80) {//80이상
		grade = 'B';
	} else {//80미만
		if (score>=70) { //70이상
			grade ='C';
		} else {//70미만
			if (score>=60) { //60이상
				grade = 'D';
			} else {//60미만
				grade = 'F';
			}
		}
	}
}

마치 콜백 지옥을 보는 듯하다. 가독성이 떨어질 수 있고 , 보기가 불편함으로 중괄호를 잃어버릴것 같다.

 


 

switch 문

 

여러가지 경우에서 하나를 선택하는데 사용된다.

  • switch-case-break 문의 규칙
  1. switch(key) 문 인자의 Type은 int, char, String 만 가능
  2. break : 무조건 탈출 (없으면 아래로 계속 default 까지 진행)
  3. case 블럭에 구문이 없어도 됨 (아래 구문으로 진행됨)
  4. case 블럭에는 복합구문에도 {....} 사용하지 않음
  5. case 값으로 변수 사용은 불가 그러나 변수를 사용하지 않은 수식은 허용

 

switch의 등급 처리 예제
문제 : score 90 이상 : A / 80 이상 : B / 70 이상 : C / 60 이상 : D / 아니면 F
switch (score/10) {
case 10 : //100점이 들어오면 break 가 없어서 9로 진행.
case 9:
	grade='A';
	break;
case 8:
	grade='B';
	break;
case 7:
	grade='C';
	break;
case 6:
	grade='D';
	break;
default:
	grade='F';
	break;//default 의 break 는 생략가능
}
System.out.printf("score 는 %d , gade는 %c %n",score,grade);
		//결과 : score 는 75 , gade는 C

 

 

if 와 switch 의 등급 처리 예제의 차이점

 

if/else 는 조건이 맞을때 까지 구문을 거쳐가지만

switch 는 맞는 조건을 찾아서 구문을 찾아가기 때문에

cpu의 입장에서의 효율성은 switch가 더 효율적이라고 볼 수 있다.

 

if는 비교구문을 순차적으로 내려가면서 비교하여 모든 구문을 거쳐간다.

switch는 해당하는 케이스를 찾아서 내려간다. 그 후 break를 만나 떨어짐..

(다이렉트 분기한다라고 말함.)