특정 조건에 따라 서로 다른 코드를 실행하는 것을 의미한다.
조건문에는 if문과 switch문이 있고, 조건식과 문장을 포함하는 블럭{}으로 구성된다.
if (condition) {
// 조건이 참일 때 실행되는 코드
}
수행하는 문장이 '하나'인 경우에 생략 가능하다 !
if (true)
System.out.println("if문에서 실행됨");
if문 블럭 내에 또 다른 if문을 포함시키는 것도 가능하고 중첩 횟수에도 제한이 없다
하지만, 중첩된 if문이 많을수록 가독성이 떨어지기 때문에 "괄호{} 생략"을 주의하는 등 항상 코드의 가독성을 생각하며 작성한다.
if (num >= 0) {
if (num != 0) {
sign = '+';
} else {
sign = '-';
}
}
if (condition) {
// 조건이 참일 때 실행되는 코드
} else {
// 만족하는 조건이 없을 때 실행되는 코드
}
int age = 14;
if(age <= 7) { //~7: 미취학
System.out.println("미취학");
}
if(age >= 8 && age <= 13) { //8~13: 초등학생
System.out.println("초등학생"); }
if(age >= 14 && age <= 16) { //14~16: 중학생
System.out.println("중학생");
}
if(age >= 17 && age <= 19) { //17~19: 고등학생
System.out.println("고등학생"); }
if(age >= 20) { //20~: 성인
System.out.println("성인");
}
if else와 차이
int age = 14;
if(age <= 7) { //~7: 미취학
System.out.println("미취학");
} else if(age <= 13) { //8~13: 초등학생
System.out.println("초등학생");
} else if(age <= 16) { //14~16: 중학생
System.out.println("중학생");
} else if(age <= 19) { //17~19: 고등학생
System.out.println("고등학생");
} else { //20~: 성인
System.out.println("성인");
}
아래처럼 원치 않는 결과를 얻게 될 것이다
int price = 10000;// 아이템 가격 int age = 10;//나이
int discount = 0;
if (price >= 10000) {
discount = discount + 1000;
System.out.println("10000원 이상 구매, 1000원 할인");
} else if (age <= 10) {
discount = discount + 1000;
System.out.println("어린이 1000원 할인");
} else {
System.out.println("할인 없음");
}
System.out.println("총 할인 금액: " + discount + "원"); }
첫번째 요소 이미 충족 else if 사용 X
switch (조건식) {
case value1 :
// 조건식의 결과 값이 value1일 때 실행되는 코드
break;
case value2 :
// 조건식의 결과 값이 value2일 때 실행되는 코드
break;
default :
// 조건식의 결과 값이 위의 어떤 값에도 해당하지 않을 때 실행되는 코드
}
//grade 1:1000, 2:3000(변경), 3:3000, 나머지: 500
int grade = 2;
int coupon;
switch (grade) {
case 1:
coupon = 1000;
break;
case 2:
case 3:
coupon = 3000;
break;
default:
coupon = 500;
break;
}
System.out.println("발급받은 쿠폰 " + coupon);
int month = 4; // 4월
String season;
switch (month) {
case 3:
case 4:
case 5:
season = "봄";
break;
case 6:
case 7:
case 8:
season = "여름";
break;
case 9:
case 10:
case 11:
season = "가을";
break;
case 12:
case 1:
case 2:
season = "겨울";
break;
default:
season = "알 수 없음";
break;
}
System.out.println(season); // "봄" 출력
int month = 4; // 4월
String season = switch (month) {
case 3, 4, 5 -> "봄";
case 6, 7, 8 -> "여름";
case 9, 10, 11 -> "가을";
case 12, 1, 2 -> "겨울";
default -> "알 수 없음";
};
System.out.println(season); // "봄" 출력
훨씬 간단하다
case 문엔 문자, 정수, 상수만 가능하며 중복이 불가능
//grade 1:1000, 2:2000, 3:3000, 나머지: 500
int grade = 2;
int coupon = switch (grade) {
case 1 -> 1000;
case 2 -> 2000;
case 3 -> 3000;
default -> 500;
};
System.out.println("발급받은 쿠폰 " + coupon);
일치하는 `case` 이후의 모든 `case` 코드들도 순서대로 실행된다 !
`swtich`문 없이 `if`문만 사용해도 된다. 하지만 특정 값에 따라 코드를 실행할 때는 `switch`문을 사용하면 `if`문보다 간결한코드를작성 가능하다 !
(조건) ? 참_표현식 : 거짓_표현식
int age = 18;
String status;
if (age >= 18) {
status = "성인";
} else {
status = "미성년자";
}
System.out.println("age = " + age + " status = " + status);
// 삼항 연산자를 사용하여 간결해진 코드
int age = 18;
String status = (age >= 18) ? "성인" : "미성년자";
System.out.println("age = " + age + " status = " + status);
while (조건식) {
// 코드
}
int count = 0;
while (count < 3) {
count++;
System.out.println("현재 숫자는:" + count);
}
변경 사항이 발생했을 때 변경해야 하는 부분이 적을수록 좋은 코드이다 !
int sum = 0;
sum = sum + 1; //sum(0) + 1 -> sum(1)
sum = sum + 2; //sum(1) + 2 -> sum(3)
sum = sum + 3; //sum(3) + 3 -> sum(6)
// i부터 1씩 증가하는 수를 3번 더하기
int sum = 0;
int i = 1;
sum = sum + i;
i++;
sum = sum + i;
i++;
sum = sum + i;
// i부터 1씩 증가하는 수를 endNum(마지막 수)까지 더하기
int sum = 0;
int i = 1;
int endNum = 3;
while (i <= endNum) {
sum = sum + i;
i++;
}
➙ 코드가 실행되는 횟수를 유연하게 변경 가능해졌다 !
do {
// 코드
} while (조건식);
int i = 10;
while (i < 3) {
System.out.println("현재 숫자는:" + i);
i++;
} while 문은 실행 안됨.
int i = 10;
do {
System.out.println("현재 숫자는:" + i);
i++;
} while (i < 3); 조건식에 맞지 않아도 한번은 실행.
while(조건식) { 코드1;
break;//즉시 while문 종료로 이동한다.
코드2;
}
//while문 종료
int sum = 0;
int i = 1;
while (true) {
sum += i;
if (sum > 10) {
System.out.println("합이 10보다 크면 종료: i=" + i + " sum=" + sum);
break;
}
i++;
}
while(조건식) {
코드1;
continue;//즉시 조건식으로 이동한다.
코드2;
}
int i = 1;
while (i <= 5) {
if(i == 3) {
i++;
continue;
}
System.out.println(i);
i++;
}
for (초기식; 조건식; 증감식) {
// 조건식이 참일 때 수행할 statment
// statement가 한 줄인 경우엔 괄호{} 생략 가능 !
}
for (;;) { // 생략 가능 (무한 반복)
...
}
int sum = 0;
int endNum = 10;
for (int i = 1; i <= endNum; i++) {
sum = sum + i;
System.out.println("i=" + i + " sum=" + sum);
}
`for`문이 없이 `while`문으로 모든 반복을 다룰 수는 있다. 하지만 카운터 변수가 명확하거나, 반복 횟수가 정해진 경우엔 `for`문을 사용하는 것이 구조적으로 더 깔끔하고, 유지보수 하기 좋다 !
➙ 쉰게 말하면, 정해진 횟수만큼 반복을 수행해야 하면 `for`문을 사용하고 그렇지 않으면 `while`문을 사용하면 된다 !
정해진 횟수의 반복이 필요할 때는 for 문을 사용하는 것이 좋다. for 문은 반복의 범위와 횟수가 명확할 때 코드를 더 깔끔하게 작성할 수 있도록 도와준다.
조건에 따라 반복 횟수가 결정되거나, 무한 반복이 필요한 경우 while 문을 사용하는 것이 더 적합할 수 있다. while 문은 특히 조건에 기반한 반복이나 예측할 수 없는 횟수의 반복에 유용하다.
int sum = 0;
int i = 1;
int endNum = 3;
while (i <= endNum) {
sum = sum + i;
System.out.println("i=" + i + " sum=" + sum);
i++;
}
조건문인 `if`문 처럼 반복문(`for`, `while`)도 내부에 또 반복문을 만들 수 있다 !
➙ 중첩 횟수에 제한은 없지만, '데이터가 많을수록' 중첩 반복문의 성능은 확연히 떨어지기 때문에, 최대한 중첩 횟수를 줄일 수 있으면 줄이는 것이 성능 개선 측면에서 유리하다 !
( 보통 3중 for문까지 사용해야 할 경우가 없다는 점 .. )
for (int i = 0; i < 2; i++) {
System.out.println("외부 for 시작 i:" + i);
for (int j = 0; j < 3; j++) {
System.out.println("-> 내부 for " + i + "-" + j);
}
System.out.println("외부 for 종료 i:" + i);
System.out.println(); //라인 구분을 위해 실행
}
외부 for 시작 i:0
-> 내부 for 0-0
-> 내부 for 0-1
-> 내부 for 0-2
외부 for 종료 i:0
외부 for 시작 i:1
-> 내부 for 1-0
-> 내부 for 1-1
-> 내부 for 1-2
외부 for 종료 i:1
for (typeOfAccessVar accessVarName : arrayOrCollection) {
// 반복할 statment
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
for (int tmp : arr) { // tmp: 임시값을 의미하는 변수명
System.out.println(tmp);
}
말 그대로 반복문 자체에 이름을 지정해주고 특정 반복문에 대해 `break`이나 `continue` 명령어 같은 것들을 수행할 수 있다.
( 사실 실제 코드에서 사용하는 걸 본 적도 없고 사용할 일도 없을 듯 ... )
class Naming {
public static void main(String[] args) {
// for문에 Loop1이라는 이름 설정
Loop1 : for (int i = 2; i <= 9; i++) {
for (int j = 1; j <= 9; j++) {
if (j == 5)
break Loop1; // for j를 break
break; // Loop1를 break
continue Loop1; // end of Loop1로 이동
continue; // end of for i로 이동
System.out.println(i + "*" + j + "=" + i * j);
} // end of for i
} // end of Loop1
}
}