조건문과 반복문
제어문
- 조건을 판별하여 선택적으로 실행하거나 비슷한 작업을 반복함으로써 프로그램의 흐름을 통제하는 명령
블록 구조
- 조건에 대해 실행할 명령이 하나 뿐이면 if문 다음에 명령을 바로 기술한다.
- 진위 여부에 따라 여러개의 명령을 실행한다면 조건에 걸리는 모든 명령을 { } 블록으로 묶는다.
- 같은 블록에 속한 명령의 집합을 복문이라고 한다.
*Java는 FreeFormat이라 들여쓰기를 어떻게 하더라도 블록 구조에는 영향을 끼치지 않으며, 두 명령을 나란히 들여써도 하나의 단위로 취급하지 않는다.
**명령을 한 단위로 만들려면 { } 괄호로 명령을 묶어야 한다.
else
- 조건이 참이면 명령 1을 실행하고, 거짓이면 명령 2를 실행한다.
if (조건) {
명령1
} else {
명령2
}
*if문은 조건이 거짓일 때 다음 명령으로 이동하지만, if else 문은 거짓일 때 실행할 명령이 따로 있다.
*if문은 전체를 다 무시할 수 있지만, if else 문은 둘 중에 하나는 꼭 실행한다.
if else문도 블록으로 감싸서 여러 개의 명령을 실행할 수 있다.
if else if
- if else 문을 조금 더 확장하면 if else if 문이 된다.
class JavaTest {
public static void main(String[] args) {
int age = 16;
if (age >= 19) {
System.out.println("성인입니다.");
} else if (age > 12) {
System.out.println("청소년입니다.");
} else {
System.out.println("어린이입니다.");
}
}
}
여기서 두 번째 if문을 블록으로 묶으면 다음과 같다.
if (age >= 19) {
System.out.println("성인입니다."0
} else {
if (age>12) {
System.out.println("청소년입니다.")
} else {
System.out.println("어린이입니다.")
}
}
- 앞쪽의 if와 else가 짝이며, 블록 안의 if와 else가 짝이다.
- 블록 안쪽의 else 절은 앞쪽의 두 if문이 모두 거짓일 때 선택된다.
**앞쪽 else에 걸리는 명령이 if 하나뿐일 때는 블록을 생략하여 간락하게 쓴다. 이런 식으로 else if를 계속 연결하면 다수의 조건 중 하나를 선택한다.
중첩
- 같은 문장이 반복되는 것. 중첩의 횟수에는 제약이 없다.
- if문을 세 번 연거푸 사용하여 세 개의 조건이 동시에 만족하는지 살펴볼 수 있고, else 절에 또 다른 if문을 넣어 더 세분화된 처리를 해줄 수 있다.
선택문
switch문
- if else문으로 다중 선택을 구현할 수 있지만, 구문이 복잡해보이고 형식성이 매우 떨어진다.
따라서 특정 변수의 값에 따라 분기할 때 if else if를 쓰는 것보다 정형화 된 switch 구문을 사용하는 것이 좋다.
<Switch문의 구조>
switch(변수) {
case 값1:
명령1:
break;
case 값2:
명령2:
break;
default:
명령:
break;
[구조 설명]
- switch문의 괄호 안에 선택 대상이 되는 제어 변수를 쓰고,
- case문에 변수의 값에 따라 실행할 명령을 작성한다.
(case문은 변수가 가질 수 있는 값의 개수만큼 얼마든지 나열할 수 있다.)
- 앞쪽의 모든 case가 일치하지 않을 때는 default의 명령을 실행하는데, 그 외의 경우가 없다면 default는 생략할 수 있다.
- 일치하는 case가 없고, default도 지정되어 있지 않으면 switch문 전체를 무시한다.
- switch문은 변수의 값 하나에 대한 명령을 선택 처리하기 때문에
case를 처리한 후에 즉시 break하여 빠져 나오는 것이 보편적이다.
하나가 결정되었으면 아래쪽 case는 더 볼 필요 없다.
if else if문과 switch문의 차이를 보여주는 직관적 예제
class JavaTest {
public static void main(String[] args) {
int ranking = 2;
if (ranking == 1) {
System.out.println("축하합니다. 금메달이에요.");
} else if (ranking == 2) {
System.out.println("은메달을 수여합니다.");
} else if (ranking == 3) {
System.out.println("동메달입니다.");
} else {
System.out.println("참가상을 드립니다.");
}
}
}
class JavaTest {
public static void main(String[] args) {
int ranking = 2;
switch (ranking) {
case 1:
System.out.println("축하합니다. 금메달이에요.");
break;
case 2:
System.out.println("은메달을 수여합니다.");
break;
case 3:
System.out.println("동메달입니다.");
break;
default:
System.out.println("참가상을 드립니다.");
break;
}
}
}
병합 처리
- case 끝에 break가 없으면 다음 case의 명령까지 계속 실행하는데, 이런 특성을 활용하여 두 값에 대한 처리를 병행한다!
class JavaTest {
public static void main(String[] args) {
int ranking = 3;
switch (ranking) {
case 1:
System.out.println("대상입니다.");
break;
case 2:
case 3:
System.out.println("우수상입니다.");
break;
case 4:
case 5:
System.out.println("장려상입니다.");
break;
}
}
}
ex. 점수 범위 비교
*case 문의 값은 컴파일 시점에 결정할 수 있는 상수여야 하며, 변수는 사용할 수 없다. 각 class의 값은 고유해야 하며 같은 값이 중복되면 에러 처리된다.
*딱 하나의 값만 올 수 있으며 범위를 지정하는 것도 안 된다.
점수 범위 | 등급 |
~ 59점 | F |
60~69점 | D |
70~79점 | C |
80~89점 | B |
90~100점 | A |
- 이 때 논리연산자를 사용하면 score >= 90 && score <= 100 과 같이 쓰면 되는데, case문에는 쓰지 못한다.
==> 해결방법
: score값을 10으로 나누면 일의 자리는 떨어져 나가고, 남은 10의자리 값으로 분기한다.
A학점은 90, 91,...,99점도 포함되지만 100점도 포함되므로, 10의자리가 10인 경우와 9인 경우를 묶어서 같이 묶어서 처리한다. ==> 그래서 case 10: 다음에 break;를 생략.
class JavaTest {
public static void main(String[] args) {
int score = 82;
switch (score/10) {
case 10:
case 9:
System.out.println("A");
break;
case 8:
System.out.println("B");
break;
case 7:
System.out.println("C");
break;
case 6:
System.out.println("D");
break;
default:
System.out.println("F");
break;
}
}
}
switch문과 if else문의 비교
- switch : 단일 상속값만 비교할 수 있으나 가독성이 뛰어나고 코드 편집이 쉽다.
- if else : 비교식을 직접 작성하므로 임의의 비교가 가능하지만 가독성이 떨어진다.
- switch 문의 최대 약점은 범위나 실수를 비교할 수 없다는 점.
- 실수는 상등 비교가 부정확하고 범위를 비교해야 하므로 if else문을 사용하는 것이 바람직하다.
By. 자바 정복