1. 조건문
1-1. if / else 문
if 문은 ()에 들어가는 조건식이 참인 경우 {} 블록의 코드를 실행하는 조건문이다.
int num = 7;
if(num > 1) { // 조건식 참
System.out.println("num이 1보다 큰 경우 실행되는 코드");
}
만약 if 문의 조건식이 참이 아닌 경우가 발생한다면? if 문 블록의 코드는 실행되지 않고 끝나버린다.
이런 경우에는 다른 조건을 추가해서 데이터를 걸러야 하는데, 이를 다중 조건 else if 문을 통해 구현할 수 있다.
int num = 7;
if(num < 5) { // 조건식 거짓
System.out.println("num이 5보다 작은 경우 실행되는 코드"); // {} 블록은 실행되지 않는다.
} else if (num > 5) { // 조건식 참
System.out.println("num이 5보다 큰 경우 실행되는 코드"); // {} 블록이 실행된다.
} else {
System.out.println("num이 if 문과 else if 문의 조건식에 포함되지 않을 때 실행되는 코드");
}
대상이 되는 데이터는 참이 되는 조건식을 만나게 될 때까지 순차적으로 조건식을 돌게 된다.
if 문과 else if 문의 조건식에도 포함되지 않는 경우가 생긴다면,
else 문을 사용해서 그 이외의 조건에 해당하는 모든 경우를 받아 낼 수 있다.
🖍 조건이 더 늘어난다면 else if 문을 더 늘릴 수 있다.
✍️ 중첩 if 문
if 문 내에 if 문을 한 번 더 작성하는 조건문으로, 두 가지 이상의 조건식을 충족하는 데이터를 추출할 수 있다.
int num = 7;
if(num > 5) {
if(num < 10) {
System.out.println("num은 5와 10 사이의 숫자이다.");
} else {
System.out.println("num은 10 보다 큰 숫자이다.");
}
} else {
System.out.println("num은 5보다 작은 숫자이다.");
}
1-2. switch / case 문
if 문은 조건이 늘어날 수록 코드의 가독성이 떨어지고,
참인 조건식을 만날 때까지 탐색해야 하므로 속도 측면에서도 늦어진다는 단점이 있다.
이러한 단점을 개선한 조건문이 바로 swich / case 문이다.
int score = 9;
switch(score) {
case 10 :
System.out.println("수");
break;
case 9 :
System.out.println("수");
break;
case 8 :
System.out.println("우");
break;
case 7 :
System.out.println("미");
break;
case 6 :
System.out.println("양");
break;
case 5 :
System.out.println("가");
break;
}
switch 문의 경우 변수에 따라 해당되는 case가 실행되기 때문에 간결하다.
다만 하나의 조건이 만족하면 더이상 실행되지 않는 if 문과 다르게,
switch 문은 각 case에 break 키워드를 작성하지 않으면 실행된 case 문 이후의 모든 case 문이 실행되기 때문에 주의해야 한다.
case 문을 작성할 때 원하는 출력값이 같은 경우에는, 예시 코드와 같이 case 를 중복 작성할 수 있다.
int score = 9;
switch(score) {
case 10 : case 9 :
System.out.println("수");
break;
(생략)
}
이외에도 if 문에서의 else 문에 해당하는 switch 문에서도 default 문을 통해 구현한다.
int score = 9;
switch(score) {
(생략)
default : // case 문의 모든 조건을 만족하지 않을 때 실행하는 코드
System.out.println("가");
break;
}
✍️ switch 문의 제약 조건
모든 switch 문은 if 문으로 변환이 가능하지만, 그 반대인 모든 if 문에서 switch 문으로는 몇 가지 제약으로 인하여 불가능하다.
👉 switch 문의 조건식 결과는 정수 또는 문자열이어야 한다.
👉 case 문의 값을 정수, 상수, 문자열만 가능하다.
👉 case 문의 값은 서로 중복되어선 안 된다.
int num, result;
final int NUM = 1;
switch(result) {
case '1' : // OK , 문자형 리터럴(유니코드)
case NUM : // OK , 정수형 상수
case "YES" : // OK , 문자열 리터럴
case num : // ERROR , 변수 사용 불가
case 1.0 : // ERROR , 실수 사용 불가
case '1' : // ERROR , 중복 불가
}
1-2-1. 개선된 switch 문 (Enhanced Switch Expressions)
가독성 측면의 이점을 극대화 하기 위하여 Java 14 부터는 보다 개선된 switch 문을 지원하고 있다.
// 기존의 switch 문
switch (day) {
case MONDAY :
case FRIDAY :
case SUNDAY :
System.out.println(6);
break;
case TUESDAY :
System.out.println(7);
break;
case THURSDAY :
case SATURDAY :
System.out.println(8);
break;
case WENDESDAY :
System.out.println(9);
break;
}
앞서 설명했듯이 switch 문에서는 break 키워드의 역할이 굉장히 중요하다.
하지만 코드를 작성하다 보면 break 키워드를 실수로 작성하지 않을 때도 있을 것이고,
반복되는 작업이기 때문에 가독성 면에서도 좋지 않다.
// 개선된 switch 문 1
swtich (day) {
case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
case TUESDAY -> System.out.println(7);
case THURSDAY, SATURDAY -> System.out.println(8);
case WEDNESDAY -> System.out.println(9);
}
👉 다중 case 사용 시에 : 가 아닌 ,(쉼표)로 구분할 수 있다.
👉 화살표 -> 를 사용함으로써 break 문을 별도로 작성하지 않아도 됨 (결과문이 2줄 이상일 경우 {} 사용)
// 개선된 switch 문 2
int letters = swtich (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
};
👉 case 문의 결과 값을 바로 변수에 저장할 수 있다.
만약 변수에 저장하는 값뿐만 아니라 콘솔창에서도 값을 보고 싶다면 어떻게 해야 할까?
// 개선된 switch 문 2
int letters = swtich (day) {
case MONDAY, FRIDAY, SUNDAY -> { // 에러 발생
System.out.println("6 글자 입니다.");
6;
};
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
};
{} 중괄호를 사용하여 코드를 추가해 보아도 에러가 발생하게 된다.
이러한 경우 활용할 수 있는 것이 바로 'yield' 예약어이다.
// 개선된 switch 문 3
int letters = swtich (day) {
case MONDAY, FRIDAY, SUNDAY -> {
System.out.println("6 글자 입니다.");
yield 6;
};
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
};
yield 예약어는 {} 안에서만 사용할 수 있으며, var 처럼 사용이 가능하다.
2. 반복문
2-1. for 문
for 문은 (초기화; 조건문; 증감식) 구조로, 초기화 된 값을 증감식에 따라 조건문을 충족할 때까지 반복하는 구문이다.
for (int i = 0; i < 10; i++) {
1. int i = 0; => int 타입의 변수 i 는 0 에서 부터 시작하겠다.
2. i < 10; => 변수 i 의 값이 10 보다 작을 때까지만 반복하겠다.
3. i++ => 변수 i 가 반복문을 돌 때마다 1씩 증가하겠다.
}
1, 2, 3에 작성한 내용이 없이 (;;) 형태로 for 문을 작성할 수도 있는데,
이는 조건을 입력하지 않았기 때문에 {}에서 반복문을 빠져나오는 구문을 작성하지 않으면 무한으로 반복하게 된다.
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
}
}
위와 같은 형태를 이중 for 문이라고 한다.
바깥 for 문이 한 번 돌 때 안쪽 for 문은 조건식이 참이 될 때까지 반복한다.
i 가 0 일 때, j는 0~9까지 반복
i 가 1 일 때, j는 다시 0~9까지 반복하는 식으로 구현된다.
✍️ for-each 문 (향상된 for 문)
for-each 문은 기존의 for 문 코드를 보다 간편하게 사용할 수 있도록 제공되는 기능으로 가독성 측면에서 좋다.
또한 for 문에서 많이 활용되는 배열, 리스트 등의 인덱스 관련 예외를 피할 수 있다는 점에서 장점을 가진다.
for (타입 변수명 : 배열명) {
}
타입에는 for-each 문으로 반복할 대상이 되는 배열 등의 내부 요소 타입을 작성하면 된다.
int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for (int i : array) {
System.out.print(i); // 1 2 3 4 5 6 7 8 9 10
}
이 코드는 array 변수에 데이터 길이만큼 반복되면서 i 변수에 저장된다.
그리고 i 에 저장된 값을 차례로 출력할 수 있게 된다.
이처럼. for-each 문을 통해서는 배열, 리스트 등에 저장된 값을 차례로 출력하는 데에 굉장히 편리하다.
하지만 기존의 저장된 값을 출력만 할 수 있고 수정은 불가하다는 단점이 있다.
또한 for 문과 달리 인덱스를 사용할 수 없기 때문에 이를 활용하는 코드도 작성하지 못한다.
✍️ 다차원 배열 원소 추출
String[][] arr = {{"1-1","1-2","1-3","1-4","1-5"},{"2-1","2-2","2-3","2-4","2-5"}};
for(String[] arrs : arr) {
for(String s : arrs) {
System.out.println(s);
}
}
다차원의 배열은 이처럼 for-each 문을 중첩해서 추출할 수 있다.
2-2. while 문
while 문은 조건식이 참일 경우 반복하는 구문으로, 조건이 항상 참일 경우 무한 반복할 수 있다.
for 문에서와 마찬가지로 무한 반복이 되는 경우에는 반드시 내부에 빠져 나올 수 있는 조건을 추가해 줘야 한다.
int num = 5;
while (num < 10) {
// 조건식은 항상 참이기 때문에 무한 반복
num += 1; // 무한 반복을 멈추기 위해 빠져 나올 수 있는 구문을 추가해야 한다.
}
✍️ do-while 문
while 문은 작성된 조건을 확인하고 true 일 경우에만 실행이 되는 반면,
do-while 문은 먼저 do 문에 작성된 구문이 실행이 되고 난 후에 조건을 확인한다는 차이점이 있다.
'JAVA' 카테고리의 다른 글
객체 지향 4대 특성 : 다형성, 캡슐화 (0) | 2022.08.22 |
---|---|
객체 지향 4대 특성 : 추상화, 상속 (0) | 2022.08.21 |
클래스(Class) 와 객체(Object) (0) | 2022.08.20 |
연산자 (0) | 2022.08.18 |
변수(Variable) (0) | 2022.08.16 |