자바의 정석 책을 공부하고 정리한 글입니다!
혹시라도 틀린 부분이 있다면 친절하게 알려주세요.
감사합니다!
CH4. 조건문과 반복문
특정 조건에 따라 문장을 건너뛰거나, 때로는 같은 문장을 반복해서 수행해야할 때가 있습니다. 이처럼 프로그램의 흐름을 바꾸는 역할을 하는 문장을 제어문이라 하는데, 조건문과 반복문이 제어문에 속합니다.
조건문 - if, switch
1) if / if-else / if-else if
if문
가장 기본적인 조건문으로 다음과 같이 사용합니다.
if(조건문) {
// 조건이 참(true)일 때 수행될 로직 작성
}
보통 블럭(중괄호) 안에 여러 문장을 넣지만, 한 문장일 때는 블럭을 생략할 수 있습니다.
if(score > 60)
System.out.println("합격");
System.out.println("축하합니다"); // if문에 해당 x -> 60점 이하인 사람들에게도 모두 출력됨
if-else문
if문에 else블럭이 추가된 형태로, 조건의 결과가 참이 아닐 때 else문장을 수행하라는 뜻입니다.
두 가지 경우 중 하나가 수행되는 구조입니다.
if(조건식) {
// 조건식이 참일 때 수행될 로직 작성
} else {
// 조건식이 거짓일 때 수행될 로직 작성
}
if-else if문
처리리해야할 경우의 수가 세 가지 이상인 경우에는 if-else if문을 사용합니다.
if(조건식1) {
// 조건식1이 참인 경우 수행
} else if(조건식2) {
// 조건식2가 참인 경우 수행
} else if(조건식3) {
// 조건식3이 참인 경우 수행
} else {
// 위의 조건식이 아무것도 만족하지 못할 경우 수행
}
보통 else문으로 끝나지만, else문은 생략할 수도 있습니다.
2) switch문
if문의 경우, 조건식의 결과가 참/거짓 밖에 없기 떄문에 경우의 수가 많아질수록 복잡해지고 처리시간도 많이 걸립니다. 이러한 if문과는 달리 switch문은 단 하나의 조건식으로 많은 경우의 수를 처리할 수 있고 표현도 간결해 알아보기가 쉽습니다.
다만 switch문은 제약조건이 있어, 경우의 수가 많아도 어쩔 수 없이 if문으로 작성해야 하는 경우가 있습니다.
switch(조건식) {
case 값1 :
// 조건식의 결과가 값1일 경우 수행
break;
case 값2 :
// 조건식의 결과가 값1일 경우 수행
break;
case 값3 :
// 조건식의 결과가 값1일 경우 수행
break;
default:
// 조건식의 결과와 일치하는 case문이 없을 때 실행
}
조건식의 결과가 일치하는 case문이 있다면, 해당로직을 수행한 후 break문을 만나 switch문을 빠져나가게 됩니다. 만약 break문이 없으면 어떻게 될까요? 아래 예시를 보며, 설명드리겠습니다.
int num = 2;
switch (num) {
case 1:
System.out.println("하나");
case 2:
System.out.println("둘");
case 3:
System.out.println("셋");
default:
System.out.println("기본값");
}
num은 2로 설정되어 있어 case 2로 가서 "둘"을 출력할것입니다.
하지만 break문이 없어서, switch문을 빠져나가지 못하고 case 3, default를 모두 실행하게 됩니다! break가 없으면 아래로 다 떨어진다라는 의미에서 fall-through라고 합니다.
(저는 부끄럽지만 정처기 공부할 때 처음 안 사실이었습니다..!)
따라서 break문을 작성해주는 것이 일반적입니다. default의 경우 가장 마지막 문장이므로, break문을 안 써도 되지만 항상 default 밑에 다른 문장이 있는 경우에는 break문을 작성해주셔야 합니다!
위에서 switch문은 제약조건이 존재한다 했는데, 제약조건은 무엇일까요?
- switch문의 조건식 결과는 정수 또는 문자열이어야 한다.
- case문의 값은 정수 상수만 가능하며, 중복되지 않아야 한다. (변수는 불가능)
이러한 제약조건 때문에 switch문을 if문으로 변환하는 것은 항상 가능하지만, if문을 switch문으로 변환하지 못하는 경우가 많다.
if문, switch문 모두 중첩해서 사용 가능합니다!
반복문 - for, 향상된 for문, while, do-while
1) for문
for문은 반복 횟수를 알고 있을 때 적합하며, 다음과 같이 사용합니다.
for(초기화; 조건식; 증감식) {
// 반복하고 싶은 로직 추가
}
- 초기화 진행
- 조건식 확인 -> 참이면 for문 안에 있는 로직 수행
- 증감식
- 조건식이 거짓이 될 때까지 2, 3번 반복
// 1.
for(int i = 0; i <= 10; i++) {...}
// 2.
for(int i = 0, j = 0; i <= 10; i++, j--) {...}
// 3.
for(;;) {...}
가장 기본적인 형식은 1번 문장입니다.
하지만, 2번 문장처럼 초기화와 증감식은 같이 콤마로 구분하여 사용할 수 있습니다. (단, 초기화를 2개 이상의 변수를 초기화할 때는 변수들의 타입이 같아야 합니다.)
3번 문장처럼 초기화, 조건식, 증감식 모두 생략 가능한데, 이때 조건식은 참으로 간주되어 무한 반복이 됩니다. 따라서 문장 안에 if문을 넣어 특정 조건을 만족하면 for문을 빠져나오도록 설계해야 합니다.
2) 향상된 for문
JDK1.5부터 배열과 컬렉션에 저장된 요소에 접근할 때, 더 편리한 방법으로 처리할 수 있도록 for문의 새로운 문법이 추가되었습니다. 이 문법을 향상된 for문 혹은 for-each문이라고 부릅니다.
for(타입 변수명 : 배열 또는 컬렉션) {
// 반복할 문장
}
이떄 타입은 배열 또는 컬렉션 요소의 타입과 일치해야 합니다. 그 이유는 배열 또는 컬렉션의 0번 인덱스부터 저장된 값을 반복해서 변수에 저장되기 때문입니다. (만약 0번 인덱스부터 시작하고 싶지 않다면 기본적인 for문을 사용해주시면 됩니다.)
실제 예시를 보면 다음과 같습니다.
int[] arr = {1, 2, 3, 4, 5};
System.out.println("1. 향상된 for문 결과: ");
for(int tmp : arr) {
System.out.print(tmp + " ");
}
System.out.println("\n2. for문 결과:");
for(int i = 0; i < arr.length; i++) {
System.out.print(i + " ");
}
3) while문
for문에 비해 while문은 간단합니다.
while(조건식) {
// 조건식의 결과가 참인 동안, 반복될 로직 추가
}
while문에서는 조건식 생략은 불가합니다. 그래서 조건식이 항상 참이 되도록 하려면 0이 아닌 다른 숫자 혹은 true를 조건식에 넣으면 됩니다. 역시나 무한반복으로 문장 안에 if문을 넣어 특정 조건을 만족하면 while문을 빠져나오도록 설계해야 합니다.
while(true) {...}
4) do-while문
do-while문은 while문과 기본적인 구조는 같으나, 조건식과 블럭의 순서를 바꿔놓은 것입니다. 따라서 반복할 로직을 먼저 수행한 후, 조건식을 평가하는 것이지요. while문은 조건식의 결과에 따라서 한 번도 수행되지 않을 수도 있지만, do-while문은 최소 한 번은 수행될 것을 보장합니다.
do {
// 반복할 로직
} while (조건식)
break문과 continue문
- break문: 자신이 포함된 가장 가까운 반복문을 벗어납니다. 무한반복문에서 특정 조건이 일치하면 break문을 설정하여 반복문을 빠져나가도록 해야합니다.
- continue문: 반복문 내에서만 사용될 수 있으며, 반복이 진행되는 도중 continue문을 만나면 반복문의 끝으로 이동하여 다음 반복으로 넘어갑니다. (break문처럼 빠져나가는 것이 아닌, 다음 반복을 수행하도록 합니다!)
'도서 정리 > 자바의 정석' 카테고리의 다른 글
[자바의 정석] CH06 객체지향 프로그래밍Ⅰ (2) (2) | 2025.04.09 |
---|---|
[자바의 정석] CH06 객체지향 프로그래밍Ⅰ (1) (2) | 2025.04.07 |
[자바의 정석] CH05 배열 정리 (0) | 2025.04.04 |
[자바의 정석] CH03 연산자 정리 (1) | 2025.04.02 |
[자바의 정석] CH01-02 정리 (1) | 2025.04.01 |