🌑 조건문
조건문 ?
- 특정 조건에 따라서 다른 코드를 실행하는 것
➙ '조건식'과 문장(statement)을 포함하는 '블럭{}'으로 구성 ! - 조건문은 'if문'과 'switch문', 두 가지가 있다.
if 문 - if, else
if 문
- 특정 조건(condition)이 참(true : 1)인지 거짓(false : 0)인지 확인하고, 그 조건이 참(true)일 경우 특정 코드 블럭을 실행한다.
if (condition) {
// 조건이 참일 때 실행되는 코드
}
💡 괄호는 언제 생략 가능할까 ?
수행하는 문장이 '하나'인 경우에 생략 가능하다 !
if (true)
System.out.println("if문에서 실행됨");
💡 중첩 if 문
if문 블럭 내에 또 다른 if문을 포함시키는 것도 가능하고 중첩 횟수에도 제한이 없다 !
하지만, 중첩된 if문이 많을수록 가독성이 떨어지기 때문에 "괄호{} 생략"을 주의하는 등 항상 코드의 가독성을 생각하며 작성하도록 하자 !
if (num >= 0) {
if (num != 0) {
sign = '+';
} else {
sign = '-';
}
}
else 문
- if문에서 만족하는 조건이 없을 때 실행된다.
if (condition) {
// 조건이 참일 때 실행되는 코드
} else {
// 만족하는 조건이 없을 때 실행되는 코드
}
서로 연관된 조건일 때는 'else if 문' 사용 !
- 서로 연관된 조건일 때 아래처럼 코드를 작성하게 된다면 ?
➙ 불필요한 조건 검사를 진행하게 되고 효율적인 코드가 될 수 없다 !
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("성인");
}
- else 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("성인");
}
💡 만약 서로 독립된 조건인 경우에 'else if 문'을 사용하게 된다면 ?
아래처럼 원치 않는 결과를 얻게 될 것이다 !
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 + "원"); }
switch 문
- `if`문은 '비교 연산자'를 사용할 수 있지만, `switch`문은 단순히 값이 같은지만 비교할 수 있다.
➙ 조건식의 결과 값이 어떤 `case`의 값(value)와 일치하면 해당 `case`의 코드를 실행한다 !
- `break`문: 현재 실행 중인 코드를 끝내고 `switch`문을 빠져나간다 !
- `default`문: 조건식의 결과값이 모든 `case`의 값과 일치하지 않을 떄 실행되며 선택적으로 작성해주면 된다 !
switch (조건식) {
case value1 :
// 조건식의 결과 값이 value1일 때 실행되는 코드
break;
case value2 :
// 조건식의 결과 값이 value2일 때 실행되는 코드
break;
default :
// 조건식의 결과 값이 위의 어떤 값에도 해당하지 않을 때 실행되는 코드
}
- 옛날 switch문
//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);
Java 14 새로운 switch문
- `if`문보다 간결한 코드를 작성하려고 나온건데 기대한 만큼 깔끔하지는 않아서 새로운 `switch`문이 Java14부터 정식으로 도입되었다 !
➙ 기존 `switch`문과의 차이점
- `->` 를 사용한다.
- 선택된 데이터를 반환 가능 !
//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);
💡 만약 `break`문이 없으면, 어떻게 될까 ?
일치하는 `case` 이후의 모든 `case` 코드들도 순서대로 실행된다 !
💡 `if`문 vs `switch`문
`swtich`문 없이 `if`문만 사용해도 된다. 하지만 특정 값에 따라 코드를 실행할 때는 `switch`문을 사용하면 `if`문보다 간결한 코드를작성 가능하다 !
💡 삼항 연산자를 활용한 `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 문
- 조건식을 체크하고, 조건식이 참이면 코드 블럭을 실행하고, 거짓이면 while문을 벗어난다.
- 조건식이 참이면 코드 블럭을 실행하고, 이후에 코드 블럭이 끝나면 다시 조건식 검사로 돌아가서 조건식을 검사한다. (무한 반복)
while (조건식) {
// 코드
}
- 예제 코드 1
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 문
- while문의 변형 !
do {
// 코드
} while (조건식);
- 단, 조건에 상관없이 무조건 한 번은 코드를 실행한다 !
int i = 10;
while (i < 3) {
System.out.println("현재 숫자는:" + i);
i++;
}
int i = 10;
do {
System.out.println("현재 숫자는:" + i);
i++;
} while (i < 3);
break, continue
break
- 반복문을 즉시 종료하고 나간다.
while(조건식) { 코드1;
break;//즉시 while문 종료로 이동한다.
코드2;
}
//while문 종료
💡 1부터 시작해서 숫자를 계속 누적해서 더하다가 합계가 10보다 처음으로 큰 값을 찾으려면 ?
int sum = 0;
int i = 1;
while (true) {
sum += i;
if (sum > 10) {
System.out.println("합이 10보다 크면 종료: i=" + i + " sum=" + sum);
break;
}
i++;
}
continue
- 반복문의 나머지 부분을 건너뛰고 다음 반복으로 진행한다.
while(조건식) {
코드1;
continue;//즉시 조건식으로 이동한다.
코드2;
}
💡 1부터 5까지 숫자를 출력하는데, 숫자가 3일 때는 출력을 건너뛰게 하려면 ?
int i = 1;
while (i <= 5) {
if(i == 3) {
i++;
continue;
}
System.out.println(i);
i++;
}
for 문
for문 구조
for (초기식; 조건식; 증감식) {
// 조건식이 참일 때 수행할 statment
// statement가 한 줄인 경우엔 괄호{} 생략 가능 !
}
for (;;) { // 생략 가능 (무한 반복)
...
}
- 초기식이 실행된다.
- 주로 반복 횟수와 관련된 변수(i,j,k)를 선언하고 초기화 할 때사용한다.
- 초기식은 딱 1번 사용된다.
- 조건식을 검증한다. 참이면 코드를 실행하고, 거짓이면 for문을 빠져나간다.
- 코드를 실행한다.
- 코드가 종료되면 증감식을 실행한다. 주로 초기식에 넣은 반복 횟수와 관련된 변수의 값을 증가(i++)할 때 사용한다.
- 다시 "2. 조건식" 부터 시작한다. (무한 반복)
int sum = 0;
int endNum = 10;
for (int i = 1; i <= endNum; i++) {
sum = sum + i;
System.out.println("i=" + i + " sum=" + sum);
}
- 초기식이 실행된다. `int i = 1`
- 조건식을 검증한다. `i <= 10`
- 조건식이 참이면 코드를 실행한다. `System.out.println(i);`
- 코드가 종료되면 증감식을 실행한다. `i++`
- 다시 2. 조건식을 검증한다. (무한 반복) 이후 `i <= 10` 조건이 거짓이 되면 for문을 빠져나간다.
💡 `for` vs `while`
`for`문이 없이 `while`문으로 모든 반복을 다룰 수는 있다. 하지만 카운터 변수가 명확하거나, 반복 횟수가 정해진 경우엔 `for`문을 사용하는 것이 구조적으로 더 깔끔하고, 유지보수 하기 좋다 !
➙ 쉰게 말하면, 정해진 횟수만큼 반복을 수행해야 하면 `for`문을 사용하고 그렇지 않으면 `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 문 (enchanced for statement)
- JDK1.5부터 배열과 컬렉션에 저장된 요소에 접근할 때 기존보다 편리한 방법으로 처리할 수 있도록 추가된 for문의 새로운 문법 !
for (typeOfAccessVar accessVarName : arrayOrCollection) {
// 반복할 statment
}
- 배열 arr의 모든 요소를 출력하는 기존 for문
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
- 배열 arr의 모든 요소를 출력하는 향상된 for문
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
}
}