개념
자바 코드는 특별한 제어문이 없으면 위에서 아래로 순서대로 실행된다.
즉, 적어 놓은 문장을 차례대로 모두 수행한다.
조건문은 이 기본 흐름 중에서, 필요한 코드만 골라서 실행하게 만드는 문법이다.
어떤 값이 들어왔을 때는 실행하고, 어떤 값이 들어왔을 때는 실행하지 않도록 흐름을 나누는 역할을 한다.
핵심 특징
조건문을 이해하려면 먼저 기본은 순차 실행이라는 점을 알아야 한다.
조건문은 원래 있던 실행 흐름을 끊어 버리는 문법이 아니라, 조건에 따라 실행 여부를 조절하는 문법이다.
즉, 자바 프로그램은 원래 다 실행되는데, 조건문을 만나면 그때부터 참이면 실행, 거짓이면 건너뜀이라는 분기가 생긴다.
코드 예제
예제:
IfTest1System.out.println(1); System.out.println(2); System.out.println(3); System.out.println(4); System.out.println(5); // 출력결과 // 1 // 2 // 3 // 4 // 5이 코드는 조건 없이
1부터5까지 전부 출력한다.
조건문이 없기 때문에 작성된 순서대로 그대로 실행된다.
헷갈리기 쉬운 부분
조건문은 “새로운 실행 방식”이라기보다,
원래 순서대로 실행되던 코드에 분기점을 만드는 문법이라고 보는 것이 맞다.
if문개념
if문은 조건이 참일 때만 코드를 실행하는 가장 기본적인 조건문이다.
문법은 이렇게 생겼다.if (조건식) { 실행문; }이 문법은 이렇게 읽으면 된다.
if
→ 만약에(조건식)
→ 참 또는 거짓이 나오는 식{ 실행문; }
→ 조건이 참일 때 실행할 코드즉,
if문은 “조건이 맞으면 실행해라”라는 뜻이다.
핵심 특징
1.
if괄호 안에는 조건식이 와야 한다괄호 안에는 아무 값이나 넣는 것이 아니라, 참(
true) / 거짓(false)이 나오는 식이 와야 한다.
예를 들어
num % 2 == 1score >= 90month == 12같은 식은 조건식이 될 수 있다.
2. 거짓이면 그냥 지나간다
if문은 참일 때만 실행한다.
거짓이면 에러가 나는 것이 아니라, 그 부분을 건너뛰고 다음 코드로 넘어간다.
3. 실행문이 한 줄이면 중괄호를 생략할 수 있다
if (조건식) 실행문;이렇게도 쓸 수 있다.
하지만 실행문이 두 줄 이상이면 반드시 중괄호로 묶어야 한다.if (조건식) { 실행문1; 실행문2; }.
4. 중괄호는 코드 묶음이다
중괄호
{ }는 여러 문장을 하나의 덩어리로 묶는다.
조건문에서는 “조건이 참일 때 이 묶음 전체를 실행한다”는 뜻이 된다.
코드 예제
예제:
IfTest2int num = (int)(Math.random()*10)+1; // 1~10 System.out.println("추출된 num 값 : "+num); System.out.println(1); if (num % 2 == 1) System.out.println(2); System.out.println(3); if (num % 2 == 0) System.out.println(4); System.out.println(5); // 출력결과(예시) // 추출된 num 값 : 3 // 1 // 2 // 3 // 5이 코드는 난수
num을 하나 뽑은 뒤, 홀수면2, 짝수면4를 출력한다.
여기서 핵심은 두 조건식이다.
num % 2 == 1
→ 홀수인지 검사num % 2 == 0
→ 짝수인지 검사즉,
2와4는 항상 출력되는 것이 아니라 조건이 맞을 때만 출력된다.
예제:
IfTest3int num = (int)(Math.random()*10)+1; System.out.printf("추출된 num 값 : [%d]\n", num); System.out.println(1); if (num % 2 == 1) System.out.println(2); System.out.println(3); if (num % 2 == 0) { System.out.println(4); System.out.println(5); } System.out.println(6); System.out.println(7); // 출력결과(예시) // 추출된 num 값 : [8] // 1 // 3 // 4 // 5 // 6 // 7이 코드는 짝수일 때
4와5를 함께 출력한다.
조건이 참일 때 실행할 문장이 두 줄이므로 중괄호를 사용했다.
즉, 이 예제는if문 자체보다도 중괄호가 왜 필요한지를 같이 보여준다.
헷갈리기 쉬운 부분
한 줄일 때 중괄호를 생략할 수 있어도, 처음에는 붙이는 습관이 더 안전하다.
나중에 코드를 한 줄 더 추가할 때 실수하기 쉽기 때문이다.
또if문은 거짓일 때 아무것도 안 한다는 점을 분명히 알아야 한다.
거짓이면 그냥 지나간다.
if-else문개념
if문은 참일 때만 실행한다.
반면if-else문은 참일 때 할 일과 거짓일 때 할 일을 둘 다 정하는 문법이다.
문법은 이렇게 생겼다.if (조건식) { 참일 때 실행문; } else { 거짓일 때 실행문; }즉,
- 조건이 참이면
if블록 실행- 조건이 거짓이면
else블록 실행이라는 뜻이다.
핵심 특징
1.
else는 “그렇지 않으면”이다
else는 혼자 쓸 수 없다.
항상 앞의if와 연결되어 “앞의 조건이 거짓이면 이쪽을 실행해라”라는 뜻으로 쓰인다.
2. 두 갈래로 나뉘는 문제에 잘 맞는다
예를 들어
- 홀수 / 짝수
- 고학년 / 저학년
- 합격 / 불합격
처럼 결과가 둘로 나뉘는 문제에 잘 맞는다.
3. 둘 중 하나는 반드시 실행된다
if만 있으면 아무 것도 실행되지 않을 수 있다.
하지만if-else는 참과 거짓 중 하나는 반드시 나오므로, 둘 중 하나는 무조건 실행된다.
코드 예제
예제:
IfTest4int num = (int)(Math.random() * 10) + 1; // 1~10 char result; if(num % 2 == 1) result = '홀'; else result = '짝'; System.out.println(num+"은 "+result+"수입니다."); // 출력결과(예시) // 7은 홀수입니다.이 코드는 숫자가 홀수인지 짝수인지 판별해서
result에 값을 저장한 뒤 출력한다.
- 홀수면
'홀'- 아니면
'짝'이 저장되므로,
result에는 반드시 값이 들어간다.
예제:
IfTest5int grade = (int)(Math.random() * 6) + 1; // 1~6 if(grade > 3) System.out.println(grade+"학년은 고학년입니다."); else System.out.println(grade+"학년은 저학년입니다."); // 출력결과(예시) // 5학년은 고학년입니다.이 코드는 학년을 두 그룹으로 나눈다.
4, 5, 6이면 고학년1, 2, 3이면 저학년즉, 기준 하나로 둘로 나누는 문제에
if-else가 잘 맞는다.
헷갈리기 쉬운 부분
if와if-else는 다르다.
if
→ 참일 때만 실행if-else
→ 참일 때와 거짓일 때를 둘 다 처리또
else는 혼자 못 쓰고, 반드시 앞의if에 붙어야 한다.
if-else if문개념
조건이 두 개가 아니라 여러 개일 때는
if-else if-else형태를 사용한다.
문법은 이렇게 생겼다.if (조건식1) { 실행문1; } else if (조건식2) { 실행문2; } else if (조건식3) { 실행문3; } else { 나머지 실행문; }이 구조는 위에서부터 차례대로 검사하고, 처음 참이 나온 한 곳만 실행한 뒤 끝난다.
핵심 특징
1. 여러 경우 중 하나를 고를 때 사용한다
예를 들어
- 계절 구분
- 점수 등급 구분
- 메뉴 번호 처리
처럼 경우가 여러 개일 때 사용한다.
2. 순서가 중요하다
if-else if는 위에서부터 검사하므로, 앞에서 참이 나오면 아래는 더 이상 보지 않는다.
3. 서로 배타적인 조건에 잘 맞는다
예를 들어 점수가
95점이면A만 나오면 된다.
이런 경우는 별개의if여러 개보다if-else if가 더 적절하다.
코드 예제
예제:
IfTest6int month = (int)(Math.random() * 12) + 1; // 1~12 if(month == 12 || month == 1 || month == 2) System.out.println(month + " : 겨울"); else if(month == 3 || month == 4 || month == 5) System.out.println(month + " : 봄"); else if(month == 6 || month == 7 || month == 8) System.out.println(month + " : 여름"); else System.out.println(month + " : 가을"); // 출력결과(예시) // 4 : 봄이 코드는 월을 계절로 바꾸는 예제다.
||는 “또는”이라는 뜻이므로, 셋 중 하나만 참이어도 해당 계절이 출력된다.
즉,
12,1,2→ 겨울3,4,5→ 봄6,7,8→ 여름- 나머지 → 가을
처럼 여러 조건을 묶어서 하나의 결과를 만든다.
예제:
IfTest7int score = (int)(Math.random() * 101); // 0~100 if(score >= 90 && score<=100) System.out.println(score+"점은 A등급"); if(score >= 80 && score<=89) System.out.println(score+"점은 B등급"); if(score >= 70 && score<=79) System.out.println(score+"점은 C등급"); if(score >= 60 && score<=69) System.out.println(score+"점은 D등급"); if(score<=59) System.out.println(score+"점은 F등급"); // 출력결과(예시) // 95점은 A등급이 코드는 결과는 맞지만 비효율적이다.
예를 들어95점이면 첫 번째if에서 이미A등급이 정해졌는데도, 아래if들을 계속 검사한다.
예제:
IfTest7_1int score = (int)(Math.random() * 101); // 0~100 if(score >= 90 && score<=100) System.out.println(score+"점은 A등급"); else if(score >= 80 && score<=89) System.out.println(score+"점은 B등급"); else if(score >= 70 && score<=79) System.out.println(score+"점은 C등급"); else if(score >= 60 && score<=69) System.out.println(score+"점은 D등급"); else System.out.println(score+"점은 F등급"); // 출력결과(예시) // 95점은 A등급이 코드는
IfTest7을 개선한 버전이다.
한 번 참이 되면 바로 끝나므로 아래 조건을 더 이상 보지 않는다.
예제:
IfTest7_2int score = (int)(Math.random() * 101); // 0~100 char grade; if(score >= 90) grade = 'A'; else if(score >= 80) grade = 'B'; else if(score >= 70) grade = 'C'; else if(score >= 60) grade = 'D'; else grade = 'F'; System.out.println(score+"점은 "+grade+"등급"); // 출력결과(예시) // 87점은 B등급이 코드는
IfTest7_1보다 더 간단하게 만든 버전이다.
예를 들어else if(score >= 80)를 검사한다는 것은 이미score >= 90이 거짓이라는 뜻이다.
그러므로 굳이score <= 89를 다시 쓸 필요가 없다.
즉, 앞에서 걸러진 사실을 이용해서 조건식을 더 간단하게 만든 예제다.
헷갈리기 쉬운 부분
별개의
if여러 개와if-else if는 다르게 동작한다.
- 별개의
if
→ 각각 독립적으로 전부 검사if-else if
→ 위에서부터 검사하다가 참이 나오면 끝또
if-else if는 순서가 중요하다.
앞 조건에서 이미 제외된 사실을 이용하면IfTest7_2처럼 더 간단하게 쓸 수 있다.
if문개념
중첩
if문은if문 안에 또 다른if문이 들어가는 형태다.
문법은 이렇게 생긴다.if (조건식1) { if (조건식2) { 실행문; } else { 실행문; } } else { 실행문; }즉, 먼저 큰 조건을 검사하고, 그 안에서 다시 세부 조건을 검사하는 구조다.
핵심 특징
1. 바깥
if가 큰 기준이다먼저 큰 범위를 나눈다.
2. 안쪽
if가 세부 기준이다바깥 기준 안에서 더 세부적으로 나눈다.
3. 단계적으로 판단할 때 유용하다
한 번에 다 나누기보다, 크게 한 번 나누고 그 안에서 다시 나누는 문제에 자연스럽다.
코드 예제
예제:
IfTest8int score = (int)(Math.random()*20) + 81; System.out.println("점수: " + score); String grade; if(score>=90) { if(score>=95) { grade = "A+"; } else { grade = "A"; } } else { if(score>=85) { grade = "B+"; } else { grade = "B"; } } System.out.println("학점: " + grade); < // 출력결과(예시) // 점수: 93 // 학점: A이 코드는 먼저 점수를 두 그룹으로 나눈다.
90점 이상→A계열90점 미만→B계열
그다음 각 그룹 안에서 다시+여부를 나눈다.90점 이상중95점 이상→A+90점 이상중95점 미만→A90점 미만중85점 이상→B+- 그 외 →
B즉, 바깥
if는 큰 분류, 안쪽if는 세부 분류를 맡는다.
헷갈리기 쉬운 부분
중첩
if는 복잡한 문법이라기보다 단계적으로 나눠 보는 구조라고 이해하면 쉽다.
이 예제에서는
- 바깥
if→A계열 / B계열- 안쪽
if→+를 붙일지 말지로 역할을 나눠서 보면 이해가 잘 된다.
switch문개념
switch문은 하나의 값을 기준으로 여러 경우 중 하나를 골라 실행하는 조건문이다.
특히
1인지2인지3인지'A'인지"회원1"인지처럼 값이 같은지 비교하는 경우에 잘 맞는다.
이번 범위에서 보는 전통적인switch문 문법은 이렇게 생긴다.switch (식) { case 값1: 실행문; break; case 값2: 실행문; break; default: 실행문; }이 문법은 이렇게 읽으면 된다.
switch (식)
→ 먼저 괄호 안의 식을 계산한다case 값1:
→ 그 값이값1과 같으면 여기서부터 실행한다break;
→ 현재switch문을 끝내고 빠져나간다default:
→ 어떤case에도 해당하지 않을 때 실행한다즉,
switch문은 값에 따라 실행 위치를 나누는 문법이다.
핵심 특징
1.
switch는 주로 등가 비교에 사용한다
if는 범위 비교, 대소 비교, 복합 조건까지 자유롭게 처리할 수 있다.
반면switch는 주로 같은가 아닌가를 나눌 때 사용한다.
즉,
90점 이상3보다 큼짝수이면서 10보다 큼같은 조건은
if가 자연스럽고,
12인가'A'인가"회원1"인가같은 조건은
switch가 자연스럽다.
2.
case는 실행 시작 위치다해당 값이면 그
case부터 실행한다.
3.
break가 중요하다
break가 있으면 그case만 실행하고 끝난다.
break가 없으면 아래case까지 계속 내려가며 실행된다.
4.
default는 나머지 경우를 처리한다
if문의else와 비슷한 역할이다.
5. 여러
case를 묶을 수 있다같은 결과를 내야 하는 값들은
case를 이어서 묶을 수 있다.
6. 이번 범위에서 기억할 수 있는 타입
이번 범위에서는
switch괄호 안에 주로int와String을 생각하면 된다.
그리고byte,short,char도int로 자동 형변환될 수 있어서 사용할 수 있다.
반면long은 사용할 수 없다.
코드 예제
예제:
SwitchTest1int num = (int)(Math.random()*10)+1; switch (num % 2) { // int(byte, short, char), String case 0 : System.out.println(num + " : 짝수"); break; case 1 : System.out.println(num + " : 홀수"); } // 출력결과(예시) // 8 : 짝수이 코드는 숫자 자체를 비교한 것이 아니라
num % 2의 결과를 비교해서 홀수와 짝수를 나눈다.
0이면 짝수1이면 홀수즉,
switch는 값 자체뿐 아니라 계산해서 나온 결과값도 기준으로 삼을 수 있다.
예제:
SwitchTest2int month = (int)(Math.random()*12)+1; switch(month) { case 12: case 1: case 2 : System.out.println(month + "월은 겨울"); break; case 3: case 4: case 5 : System.out.println(month + "월은 봄"); break; case 6: case 7: case 8 : System.out.println(month + "월은 여름"); break; default: System.out.println(month + "월은 가을"); } // 출력결과(예시) // 10월은 가을이 코드는 월을 계절로 바꾸는 예제다.
여기서는 여러case를 이어서 하나의 결과로 묶고 있다.
12,1,2→ 겨울3,4,5→ 봄6,7,8→ 여름- 나머지 → 가을
즉, 같은 결과를 내야 하는 값들이 많을 때
switch가 한눈에 들어온다.
예제:
SwitchTest3int score = (int)(Math.random()*101); // 0~100 char credit; switch(score/10) { // 이 식으로 인해 더 간단해짐 case 10 : case 9 : credit = 'A'; break; case 8 : credit = 'B'; break; case 7 : credit = 'C'; break; case 6 : credit = 'D'; break; default : credit = 'F'; } System.out.println(score + " : " + credit); // 출력결과(예시) // 87 : B
switch는 범위 비교에 약하므로, 여기서는score / 10의 몫을 사용해서 값을 단순하게 만들었다.
예를 들어
95 / 10→987 / 10→861 / 10→6이렇게 되므로
90점대,80점대,70점대를 쉽게 나눌 수 있다.
이 예제에서default도 중요하다.
0~59점은 위의case에 없기 때문에default에서F로 처리한다.
여기서default를 빼면 문제가 생긴다.char credit; switch(score/10) { case 10 : case 9 : credit = 'A'; break; case 8 : credit = 'B'; break; case 7 : credit = 'C'; break; case 6 : credit = 'D'; break; } System.out.println(score + " : " + credit); // 에러이렇게 되면
score가50점 이하일 때credit에 아무 값도 들어가지 않을 수 있다.
그런데 마지막 줄에서credit을 사용하려고 하므로 컴파일러가 에러를 낸다.
이 문제는 두 가지 방식으로 해결할 수 있다.
첫째는 원래 코드처럼default를 두는 것이다.default: credit = 'F';둘째는 변수를 미리 초기화하는 것이다.
char credit = 'F';즉,
SwitchTest3은 단순히 등급을 나누는 예제가 아니라, 모든 경우를 처리해야 하는 이유와 초기화가 왜 중요한지까지 같이 보여주는 예제다.
예제:
SwitchTest4int time = (int)(Math.random()*4) + 8; System.out.println("[현재시간: " + time + " 시]"); switch(time) { case 8: System.out.println("출근합니다."); case 9: System.out.println("회의를 합니다."); case 10: System.out.println("업무를 봅니다."); default: System.out.println("외근을 나갑니다."); } // 출력결과(예시, time이 8일 때) // [현재시간: 8 시] // 출근합니다. // 회의를 합니다. // 업무를 봅니다. // 외근을 나갑니다.이 코드는
break가 없을 때 어떤 일이 생기는지 보여준다.
예를 들어time이8이면"출근합니다."만 나올 것 같지만, 실제로는 그 아래 문장들까지 계속 실행된다.
왜냐하면case 8에서 실행이 시작된 뒤, 멈추라는break가 없기 때문이다.
즉,switch에서break가 없으면 아래case로 계속 흘러내리듯 실행된다.
예제:
SwitchTest5char grade = 'B'; switch(grade) { case 'A': case 'a': System.out.println("우수 회원입니다."); break; case 'B': case 'b': System.out.println("일반 회원입니다."); break; default: System.out.println("손님입니다."); } // 출력결과 // 일반 회원입니다.이 코드는
char도switch에 사용할 수 있다는 것을 보여준다.
또 대문자와 소문자를 각각 다른case로 두고 같은 결과로 묶어서 처리하고 있다.
예제:
SwitchTest6String level = "회원" + ((int)(Math.random()*3) + 1); System.out.printf("[ %s님 ]\n", level); switch(level) { case "회원1": System.out.println("*삭제 가능*"); case "회원2": System.out.println("*수정 가능*"); case "회원3": System.out.println("*읽기 가능*"); } // 출력결과(예시, level이 "회원1"일 때) // [ 회원1님 ] // *삭제 가능* // *수정 가능* // *읽기 가능*이 코드는
String도switch에 사용할 수 있다는 정도만 가볍게 보면 된다.
여기서도break가 없기 때문에,"회원1"이면 아래 권한까지 계속 출력된다.
헷갈리기 쉬운 부분
switch는 아무 조건이나 넣는 문법이 아니다.
기본적으로는 하나의 값을 기준으로 경우를 나누는 문법이다.
또break가 없으면 아래까지 계속 실행된다는 점을 꼭 기억해야 한다.
원하는case만 실행하려면 보통break가 필요하다.
그리고default는 없어도 되는 장식이 아니라, 경우에 따라 꼭 필요하다.
특히SwitchTest3처럼 변수에 값을 넣는 구조에서는 나머지 경우까지 처리하지 않으면 값이 비어 있을 수 있다.
문제에서 무엇을 하려는지
1월부터12월사이의 월이 주어졌을 때,
그 월이 어느 계절에 속하는지 판단해서 출력하는 예제다.
즉, 숫자를 그대로 보여주는 것이 아니라 조건에 따라 의미 있는 결과로 바꾸는 것이 목적이다.
이 예제에서 사용된 개념
if-else ifswitch- 논리 연산자
||- 여러 경우를 하나로 묶는 조건 처리
코드 흐름
먼저
1~12사이의 난수를 뽑아month에 저장한다.
그다음month가 어떤 값인지 검사해서 계절을 결정한다.
if-else if로 구현하면 위에서부터 차례대로 계절 조건을 확인한다.
switch로 구현하면month값에 맞는case로 이동해서 바로 처리한다.
코드 예제
예제:
IfTest6int month = (int)(Math.random() * 12) + 1; // 1~12 if(month == 12 || month == 1 || month == 2) System.out.println(month + " : 겨울"); else if(month == 3 || month == 4 || month == 5) System.out.println(month + " : 봄"); else if(month == 6 || month == 7 || month == 8) System.out.println(month + " : 여름"); else System.out.println(month + " : 가을"); // 출력결과 // 4 : 봄이 코드는 여러 값을
||로 묶어서 하나의 계절로 처리한다.
즉,12,1,2는 모두 겨울이라는 뜻이다.
예제:
SwitchTest2int month = (int)(Math.random()*12)+1; switch(month) { case 12: case 1: case 2 : System.out.println(month + "월은 겨울"); break; case 3: case 4: case 5 : System.out.println(month + "월은 봄"); break; case 6: case 7: case 8 : System.out.println(month + "월은 여름"); break; default: System.out.println(month + "월은 가을"); } // 출력결과 // 10월은 가을이 코드는 같은 문제를
switch로 푼 것이다.
값이 여러 개로 딱딱 나뉘는 문제라서switch로 보면 계절 묶음이 더 눈에 잘 들어온다.
헷갈리기 쉬운 부분
if-else if에서는 위에서부터 조건을 하나씩 본다.
반면switch는 값에 맞는case로 바로 이동한다.
또switch에서는break가 없으면 아래case까지 실행되므로 같이 주의해서 봐야 한다.
문제에서 무엇을 하려는지
0점부터100점사이의 점수가 주어졌을 때,
점수를 그대로 출력하는 것이 아니라A,B,C,D,F등급으로 바꾸는 예제다.
즉, 조건문으로 범위를 나누어 결과를 분류하는 문제다.
이 예제에서 사용된 개념
if-else if- 범위 조건
- 변수에 값 저장
switch에서 식 사용하기default와 변수 초기화
코드 흐름
먼저
0~100사이 난수를score에 저장한다.
그다음 점수 범위에 따라 등급을 정한다.
if-else if에서는 위에서부터90점 이상,80점 이상,70점 이상순으로 내려가며 검사한다.
switch에서는 점수 자체를 바로 비교하지 않고score / 10의 몫을 이용해 등급을 나눈다.
풀이 원리
점수 문제는 원래 범위 비교라서
if가 자연스럽다.
하지만switch는 값 비교에 더 잘 맞으므로,score / 10처럼 값을 바꿔서 사용한다.
예를 들어
95 / 10 = 987 / 10 = 873 / 10 = 7이렇게 되므로
90점대,80점대,70점대를 쉽게 구분할 수 있다.
코드 예제
예제:
IfTest7_2int score = (int)(Math.random() * 101); // 0~100 char grade; if(score >= 90) grade = 'A'; else if(score >= 80) grade = 'B'; else if(score >= 70) grade = 'C'; else if(score >= 60) grade = 'D'; else grade = 'F'; System.out.println(score+"점은 "+grade+"등급"); // 출력결과 // 87점은 B등급이 코드는 점수에 따라 등급을 하나만 정한다.
앞 조건이 거짓일 때만 아래로 내려오므로, 상한값을 굳이 다시 쓰지 않아도 된다.
예제:
SwitchTest3int score = (int)(Math.random()*101); // 0~100 char credit; switch(score/10) { case 10 : case 9 : credit = 'A'; break; case 8 : credit = 'B'; break; case 7 : credit = 'C'; break; case 6 : credit = 'D'; break; default : credit = 'F'; } System.out.println(score + " : " + credit); // 출력결과 // 87 : B이 코드는
score / 10을 이용해서switch로 등급을 나눈다.
default가 있기 때문에0점부터59점까지도F로 처리된다.
헷갈리기 쉬운 부분
이 예제에서는
default가 왜 필요한지도 같이 봐야 한다.
만약default를 없애면0~59점일 때credit에 아무 값도 안 들어갈 수 있다.char credit; switch(score/10) { case 10 : case 9 : credit = 'A'; break; case 8 : credit = 'B'; break; case 7 : credit = 'C'; break; case 6 : credit = 'D'; break; } System.out.println(score + " : " + credit); // 에러이 문제는
default를 두거나char credit = 'F';처럼 미리 초기화하는 방식으로 해결할 수 있다.
즉, 이 예제는 등급 분류뿐 아니라 모든 경우를 처리해야 하는 이유도 같이 보여준다.
문제에서 무엇을 하려는지
점수를 단순히
A,B로만 나누는 것이 아니라,
A+,A,B+,B처럼 조금 더 세부적으로 나누는 예제다.
즉, 한 번 분류하고 끝나는 것이 아니라 큰 범위를 먼저 나눈 뒤, 그 안에서 다시 세부 분류를 한다.
이 예제에서 사용된 개념
- 중첩
if- 큰 조건과 세부 조건 구분
- 문자열 변수에 결과 저장
코드 흐름
먼저 점수를 보고
90점 이상인지 아닌지를 나눈다.
이게 첫 번째 큰 분류다.
그다음90점 이상인 경우에는95점 이상인지 다시 검사해서A+와A를 나눈다.
90점 미만인 경우에는85점 이상인지 검사해서B+와B를 나눈다.
코드 예제
예제:
IfTest8int score = (int)(Math.random()*20) + 81; System.out.println("점수: " + score); String grade; if(score>=90) { if(score>=95) { grade = "A+"; } else { grade = "A"; } } else { if(score>=85) { grade = "B+"; } else { grade = "B"; } } System.out.println("학점: " + grade); // 출력결과 // 점수: 93 // 학점: A이 코드는 바깥
if가 큰 분류를 맡고, 안쪽if가 세부 분류를 맡는다.
- 바깥
if
→A계열 / B계열- 안쪽
if
→+를 붙일지 말지즉, 중첩
if는 이런 식으로 단계적으로 판단할 때 자연스럽게 쓰인다.
헷갈리기 쉬운 부분
중첩
if는 복잡한 문법이라기보다 한 번 나누고, 그 안에서 다시 한 번 나누는 구조라고 보면 된다.
이 예제에서는 바깥 조건과 안쪽 조건의 역할을 나눠서 보는 것이 중요하다.
그래야 왜 중첩 구조를 썼는지 자연스럽게 이해할 수 있다.