조건문
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 문의 규칙
- switch(key) 문 인자의 Type은 int, char, String 만 가능
- break : 무조건 탈출 (없으면 아래로 계속 default 까지 진행)
- case 블럭에 구문이 없어도 됨 (아래 구문으로 진행됨)
- case 블럭에는 복합구문에도 {....} 사용하지 않음
- 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를 만나 떨어짐..
(다이렉트 분기한다라고 말함.)
'Developer > JAVA' 카테고리의 다른 글
JAVA, Random 클래스와 Math.random() 메서드 (0) | 2024.07.31 |
---|---|
JAVA , 제어문 (반복문) 기초와 예제 (0) | 2024.07.31 |
Java , 자바의 연산 (3) | 2024.07.22 |
JAVA , Date , Scanner (4) | 2024.07.21 |
JAVA, 진수와 Interger 메서드 , String 메서드 (2) | 2024.07.21 |