Java의 조건문과 반복문은 논리적인 사고를 활용하여 문제를 해결하는 데 필수적인 도구들입니다. 각 요소를 자세히 살펴보고 예제를 통해 이해해 봅시다.
1. 조건문
(1) if-else 문
- 특정 조건이 참인지 확인하고, 조건에 따라 다른 코드를 실행합니다.
기본 구조:
if (조건식) {
// 조건식이 참일 때 실행
} else {
// 조건식이 거짓일 때 실행
}
예제:
int age = 20;
if (age >= 18) {
System.out.println("성인입니다.");
} else {
System.out.println("미성년자입니다.");
}
(2) switch-case 문
- 하나의 변수에 대해 여러 값을 비교할 때 사용됩니다.
- if-else보다 코드가 간결해집니다.
기본 구조:
switch (변수) {
case 값1:
// 값1일 때 실행
break;
case 값2:
// 값2일 때 실행
break;
default:
// 위 조건에 모두 해당하지 않을 때 실행
}
예제:
int day = 3;
switch (day) {
case 1:
System.out.println("월요일");
break;
case 2:
System.out.println("화요일");
break;
case 3:
System.out.println("수요일");
break;
default:
System.out.println("알 수 없는 요일");
}
* 참고: switch-case 에서는 break, default는 무조건 사용해야 하는 건 아니다.
switch-case 문에서 break와 default는 선택 사항이며, 각각의 사용 여부에 따라 코드의 동작이 달라집니다. 이를 더 깊이 이해하기 위해, break와 default의 역할과 그 부재로 인해 발생하는 동작을 설명하겠습니다.
1. break가 없는 경우
break가 없으면 "fall-through" (다음 case로 실행이 이어짐) 현상이 발생합니다. 즉, 현재 case의 코드가 실행된 후, 조건과 상관없이 아래의 모든 case 코드가 실행됩니다.
예제: break 없는 경우
int day = 3;
switch (day) {
case 1:
System.out.println("월요일");
case 2:
System.out.println("화요일");
case 3:
System.out.println("수요일");
case 4:
System.out.println("목요일");
default:
System.out.println("알 수 없는 요일");
}
출력
수요일
목요일
알 수 없는 요일
- 설명:
- day == 3이므로 case 3:부터 실행됩니다.
- 그러나 break가 없으므로 case 3 이후의 모든 case와 default가 연달아 실행됩니다.
2. default가 없는 경우
default는 모든 case가 만족하지 않을 때 실행될 코드를 작성하는 선택 사항입니다. default가 없으면, 어느 case도 해당하지 않을 경우 아무 작업도 하지 않고 switch 문이 종료됩니다.
예제: default 없는 경우
int day = 8;
switch (day) {
case 1:
System.out.println("월요일");
break;
case 2:
System.out.println("화요일");
break;
case 3:
System.out.println("수요일");
break;
case 4:
System.out.println("목요일");
break;
}
출력
(아무것도 출력되지 않음)
- 설명:
- day == 8은 어떤 case와도 일치하지 않으므로 switch 문이 종료되고 아무 결과도 출력되지 않습니다.
3. break와 default를 모두 사용하지 않는 경우
break와 default가 모두 없을 경우, fall-through가 발생하며, 일치하는 case부터 모든 코드가 실행됩니다. 이와 동시에 일치하지 않는 경우 아무 작업도 하지 않습니다.
예제: break와 default 없는 경우
int day = 2;
switch (day) {
case 1:
System.out.println("월요일");
case 2:
System.out.println("화요일");
case 3:
System.out.println("수요일");
case 4:
System.out.println("목요일");
}
출력
화요일
수요일
목요일
- 설명:
- day == 2이므로 case 2부터 실행됩니다.
- break가 없으므로 이후 모든 case 코드가 실행됩니다.
4. 유용한 패턴: 의도적인 fall-through
때로는 break를 사용하지 않고, fall-through를 의도적으로 활용할 수 있습니다. 예를 들어, 여러 case가 같은 코드를 실행하도록 설계할 수 있습니다.
예제: 의도적인 fall-through
int month = 5;
switch (month) {
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
System.out.println("31일");
break;
case 4: case 6: case 9: case 11:
System.out.println("30일");
break;
case 2:
System.out.println("28일 또는 29일");
break;
default:
System.out.println("유효하지 않은 월입니다.");
}
출력
31일
- 설명:
- 여러 case가 동일한 코드를 실행해야 하는 경우 fall-through를 사용하여 코드 중복을 줄입니다.
정리
- break:
- 반복적인 실행을 방지하기 위해 각 case 끝에 추가.
- 없을 경우 fall-through가 발생.
- default:
- 모든 case와 일치하지 않을 때 실행될 코드를 제공.
- 없을 경우 조건을 만족하지 않는 경우 아무 작업도 하지 않고 종료.
- 의도적으로 break를 생략하여 fall-through를 활용할 수도 있음.
2. 반복문
(1) for 문
- 반복 횟수가 정해져 있을 때 주로 사용됩니다.
기본 구조:
for (초기식; 조건식; 증감식) {
// 반복할 코드
}
예제:
for (int i = 1; i <= 5; i++) {
System.out.println("숫자: " + i);
}
Java의 for-each 문
for-each 문은 Java에서 배열이나 컬렉션을 반복(iterate) 할 때 사용하는 간단하고 직관적인 반복문입니다. 일반적인 for 문보다 코드가 간결하며, 인덱스를 따로 관리할 필요가 없습니다.
특징
- 배열이나 컬렉션에 저장된 모든 요소를 순차적으로 탐색합니다.
- 반복 횟수가 고정되어 있지 않아도 사용 가능하며, 요소의 순서를 신경 쓰지 않을 때 유용합니다.
- 읽기 전용 접근 방식: 배열의 값을 수정하고 싶다면 다른 방식이 필요합니다.
구문
for (데이터타입 변수 : 배열 또는 컬렉션) {
// 반복할 코드
}
- 데이터타입 변수: 배열 또는 컬렉션의 요소를 받을 변수.
- 배열 또는 컬렉션: 반복할 대상.
예제 1: 배열에서의 사용
배열에 저장된 값을 하나씩 출력하기.
int[] numbers = {1, 2, 3, 4, 5};
for (int number : numbers) {
System.out.println("숫자: " + number);
}
출력
숫자: 1
숫자: 2
숫자: 3
숫자: 4
숫자: 5
- 설명:
- numbers 배열의 각 요소가 number 변수에 순차적으로 할당됩니다.
- 반복문 안에서 number를 사용하여 요소를 출력합니다.
예제 2: 컬렉션에서의 사용
ArrayList와 같은 컬렉션을 순회.
import java.util.ArrayList;
ArrayList<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
names.add("Charlie");
for (String name : names) {
System.out.println("이름: " + name);
}
출력
이름: Alice
이름: Bob
이름: Charlie
- 설명:
- names 컬렉션의 각 요소가 name 변수에 순차적으로 할당됩니다.
- 반복문 안에서 name을 사용하여 각 요소를 출력합니다.
주의 사항
- 읽기 전용:
- for-each 문에서는 요소의 값을 변경할 수 없습니다. 배열이나 컬렉션의 값을 수정하려면 일반적인 for 문을 사용해야 합니다.
int[] numbers = {1, 2, 3, 4, 5};
for (int number : numbers) {
number += 10; // 원본 배열에는 영향 없음
}
System.out.println(Arrays.toString(numbers)); // [1, 2, 3, 4, 5]
- 인덱스 접근 불가:
- 반복 중 현재 요소의 인덱스가 필요하다면 for-each 문을 사용할 수 없습니다. 대신 일반 for 문을 사용해야 합니다.
for (int i = 0; i < numbers.length; i++) {
System.out.println("인덱스 " + i + ": " + numbers[i]);
}
- null 처리:
- 배열이나 컬렉션이 null이면 NullPointerException이 발생합니다. 반복문 전에 반드시 null 체크를 해야 합니다.
장점
- 코드가 간결하고 가독성이 높습니다.
- 컬렉션이나 배열의 모든 요소를 탐색할 때 편리합니다.
예제 3: 2차원 배열에서 사용
for-each 문으로 2차원 배열 탐색.
int[][] matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
for (int[] row : matrix) {
for (int num : row) {
System.out.print(num + " ");
}
System.out.println();
}
출력
1 2 3
4 5 6
7 8 9
정리
- 언제 사용하면 좋을까?
- 배열이나 컬렉션의 모든 요소를 순차적으로 읽고 처리할 때.
- 요소의 값을 변경하거나 인덱스가 필요하지 않을 때.
- 언제 피해야 할까?
- 요소의 값을 수정해야 하거나, 특정 인덱스를 기반으로 작업해야 할 때.
for-each 문은 직관적이고 편리한 반복문으로, 읽기 전용 작업에 최적화된 도구입니다.
(2) while 문
- 조건이 참일 때 계속 실행합니다. 조건이 거짓이 되면 종료됩니다.
기본 구조:
while (조건식) {
// 반복할 코드
}
예제:
int i = 1;
while (i <= 5) {
System.out.println("숫자: " + i);
i++;
}
(3) do-while 문
- 최소 한 번은 실행한 뒤, 조건을 확인합니다. (* 맨 마지막에 ; 세미콜론을 꼭 붙여야 함!)
기본 구조:
do {
// 실행할 코드
} while (조건식);
예제:
int i = 1;
do {
System.out.println("숫자: " + i);
i++;
} while (i <= 5);
3. 반복문 제어
(1) break
- 반복문을 즉시 종료합니다.
예제:
for (int i = 1; i <= 5; i++) {
if (i == 3) {
break; // 반복문 종료
}
System.out.println("숫자: " + i);
}
(2) continue
- 반복문의 현재 루프를 건너뛰고, 다음 반복으로 넘어갑니다.
예제:
for (int i = 1; i <= 5; i++) {
if (i == 3) {
continue; // 다음 반복으로 건너뜀
}
System.out.println("숫자: " + i);
}
논리적인 사고와 Java 문법의 결합
- 문제를 단계적으로 나눔:
- 복잡한 문제를 여러 단계로 나누고 각각의 조건과 반복을 정의합니다.
- 조건과 루프를 활용한 해결:
- 조건(if, switch)을 통해 논리적인 분기를 설정합니다.
- 반복문(for, while)을 통해 데이터를 처리하거나 동작을 반복합니다.
- 디버깅:
- 작은 단위로 코드를 작성하고, 출력문(System.out.println())을 사용하여 논리의 흐름을 확인합니다.
Java의 기본적인 조건문과 반복문을 논리적으로 조합하면 어떤 문제든 해결할 수 있습니다.
'Java' 카테고리의 다른 글
Java - 객체를 접근하는 권한 / Access Modifier / Package란? / 클래스 접근하는 방법 (1) | 2024.11.29 |
---|---|
Java - Method / static 정적/ parameter passing 매개변수 전달기법 / method overloading 메서드 중복정의 / (4) | 2024.11.28 |
Java - 연산자 (증가 연산자/ 감소 연산자/ 삼항 연산자) (0) | 2024.11.25 |
Java - Scanner / (메모리 heap 영역) (0) | 2024.11.23 |
Java - Array - /Array vs. Class / array의 크기, 초기화, 기본값 / 2차원 배열과 다차원 배열 / Jagged array 가변 배열 (0) | 2024.11.22 |