| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
- C
- 1일1코테
- 티스토리챌린지
- #코드트리 #코딩테스트 #코테공부 #백트래킹 #알고리즘 기초
- 99클럽
- 자바스크립트
- 오블완
- 웹
- til
- 자료구조
- 코드트리
- 코딩테스트준비
- 프로그래밍 언어
- 플로이드-워셜
- 자바
- 프로그래머스
- 연결 리스트
- Java
- 항해99
- 파이썬
- 운영체제
- 알고리즘
- 코딩테스트사이트추천
- 인접 행렬
- 데이터베이스
- 갭체크
- 개발자루틴
- 코딩테스트
- 코테공부
- 개발자취업
- Today
- Total
와드의 블로그
Chapter 4. 조건문과 반복문 본문
1. 조건문
조건문은 조건식과 문장을 포함하는 블록으로 구성되어 있으며, 조건식의 연산 결과에 따라 실행할 문장이 달라져서 프로그램의 실행 흐름을 변경할 수 있다. 조건문에는 if문과 switch문이 있다.
1.1 if문
if문은 가장 기본적인 조건문이며, 다음과 같이 조건식과 블록으로 이루어져 있다. 조건식이 참이라면 블록 안의 문장들을 수행한다.
if(조건식) {
// 조건식이 참일 때 수행될 문장을 적는다..
}
※ 조건식
if문에 사용되는 조건식은 일반적으로 비교 연산자와 논리 연산자로 구성된다.
public class FlowControl {
public static void main(String[] args) {
int x = 0;
if (x == 0)
System.out.println("x == 0");
if (x != 0)
System.out.println("x != 0");
x = 1;
if (x == 0)
System.out.println("x == 0");
if (x != 0)
System.out.println("x != 0");
}
}
※ 블럭
중괄호를 이용해서 여러 문장을 하나의 단위로 묶을 수 있는데, 이것을 블록이라고 한다. 블럭은 중괄호로 둘러싸인 부분인데 문장과는 달리 끝에 세미콜론을 붙이지 않는다. 블럭 내의 문장들은 들여쓰기를 해서 블럭 안에 속한 문장이라는 것을 알기 쉽게 해 준다.
블록 안에는 보통 여러 문장을 넣지만, 한 문장만 넣을 경우 중괄호를 생략할 수 있다.
import java.util.*;
public class FlowControl {
public static void main(String[] args) {
int input;
System.out.print("숫자를 하나 입력하세요: ");
Scanner scanner = new Scanner(System.in);
String tmp = scanner.nextLine();
input = Integer.parseInt(tmp);
if (input == 0)
System.out.println("입력한 숫자는 0입니다.");
if (input != 0) {
System.out.println("입력한 숫자는 0이 아닙니다.");
System.out.printf("입력한 숫자는 %d입니다.", input);
}
}
}
1.2 if-else문
if문의 변형인 if-else문의 구조는 다음과 같다. if문의 조건문이 참이면 if 블록이 수행되고 거짓이면 else 블록이 수행된다.
if (조건식) {
// 조건식이 참일 때 수행될 문장을 적는다.
} else {
// 조건식이 거짓일 때 수행될 문장을 적는다.
}
1.3 if-else if문
if-else문은 두 가지 경우 중 하나가 수행되는 구조인데, 처리해야 될 경우의 수가 셋 이상인 경우에 if-else if문을 사용한다.
if (조건식1) {
// 조건식1의 연산 결과가 참일 때 수행될 문장들을 적는다.
} else if (조건식2) {
// 조건식2의 연산 결과가 참일 때 수행될 문장들을 적는다.
} else if (조건식3) {
// 조건식3의 연산 결과가 참일 때 수행될 문장들을 적는다.
} else {
// 위의 어느 조건식도 만족하지 않을 때 수행될 문장들을 적는다.
}
1.4 중첩 if문
if문의 블록 내에 또 다른 if문을 포함시키는 것이 가능한데 이것을 중첩 if문이라고 한다.
import java.util.*;
public class FlowControl {
public static void main(String[] args) {
int score = 0;
char grade = ' ', opt = '0';
System.out.print("점수를 입력하세요: ");
Scanner scanner = new Scanner(System.in);
score = scanner.nextInt();
System.out.printf("당신의 점수는 %d점입니다.%n", score);
if (score >= 90) {
grade = 'A';
if (score >= 98)
opt = '+';
else if (score < 94)
opt = '-';
} else if (score >= 80) {
grade = 'B';
if (score >= 88)
opt = '+';
else if (score < 84)
opt = '-';
} else
grade = 'C';
System.out.printf("당신의 학점은 %c%c입니다.%n", grade, opt);
}
}
1.5 switch문
if문은 조건식의 결과가 참과 거짓, 두 가지밖에 없기 때문에 경우의 수가 많아질수록 else-if를 계속 추가해야 하므로 조건식이 많아져서 복잡해지고, 여러 개의 조건식을 계산해야 하므로 처리 시간도 많이 걸린다.
이러한 if문과 달리 switch문은 단 하나의 조건식으로 많은 경우의 수를 처리할 수 있고, 표현도 간결하므로 알아보기 쉽다. switch문은 조건식을 계산한 다음, 그 결과와 일치하는 case문으로 이동한다. 이동한 case문 아래에 있는 문장들을 수행하며, break문을 만나면 전체 switch문을 빠져나간다. 만일 조건식의 결과와 일치하는 case문이 하나도 없는 경우에는 default문으로 이동한다.
switch (조건식) {
case 값1:
// 조건식의 결과가 값1과 같을 경우 수행될 문장들
break;
case 값2:
// 조건식의 결과가 값2와 같을 경우 수행될 문장들
break;
default:
// 조건식의 결과와 일치하는 case문이 없을 때 수행될 문장들
}
switch문에서 break문은 각 case의 영역을 구분하는 역할을 하는데, 만일 break문을 생략하면 case문 사이의 구분이 없어지므로 다른 break문을 만나거나 switch문 블록의 끝을 만날 때까지 나오는 모든 문장들을 수행한다.
경우에 따라서 여러 개의 case를 하나로 묶기 위해서 break문을 의도적으로 생략하는 경우도 있다.
※ switch문의 제약 조건
- switch문의 조건식 결과는 정수 또는 문자열이어야 한다.
- case문의 값은 정수 상수와 문자열 리터럴만 가능하며, 중복되지 않아야 한다.
import java.util.*;
public class FlowControl {
public static void main(String[] args) {
System.out.print("현재 월을 입력하세요: ");
Scanner scanner = new Scanner(System.in);
int month = scanner.nextInt();
switch(month) {
case 3: case 4: case 5:
System.out.println("현재의 계절은 봄입니다.");
break;
case 6: case 7: case 8:
System.out.println("현재의 계절은 여름입니다.");
break;
case 9: case 10: case 11:
System.out.println("현재의 계절은 가을입니다.");
break;
default:
System.out.println("현재의 계절은 겨울입니다.");
}
}
}
※ switch문의 중첩
if문처럼 switch문도 중첩이 가능하다. 중첩 switch문에서는 break문을 빼먹지 않도록 주의해야 한다.
import java.util.*;
public class FlowControl {
public static void main(String[] args) {
System.out.print("당신의 주민번호(******-*******)를 입력하세요: ");
Scanner scanner = new Scanner(System.in);
String regNo = scanner.nextLine();
char gender = regNo.charAt(7);
switch(gender) {
case '1': case '3':
switch(gender) {
case '1':
System.out.println("당신은 2000년 이전에 출생한 남자입니다.");
break;
default:
System.out.println("당신은 2000년 이후에 출생한 남자입니다.");
}
break;
case '2': case '4':
switch(gender) {
case '2':
System.out.println("당신은 2000년 이전에 출생한 여자입니다.");
default:
System.out.println("당신은 2000년 이후에 출생한 여자입니다.");
}
break;
default:
System.out.println("유효하지 않은 주민번호입니다.");
}
}
}
2. 반복문
반복문은 어떤 작업이 반복적으로 수행되도록 할 때 사용된다. 반복문은 주어진 조건을 만족하는 동안 주어진 문장들을 반복적으로 수행하므로 조건식을 포함한다.
2.1 for문
for문은 반복 횟수를 알고 있을 때 적합하다. for문의 기본 구조는 다음과 같다.
for(초기화; 조건식; 증감식) {
// 반복될 문장
}
for문은 초기화, 조건식, 증감식, 블록, 모두 4가지 부분으로 이루어져 있다. 제일 먼저 초기화가 수행되고, 그 이후부터는 조건식이 참인 동안 조건식->블럭->증감식의 순서로 계속 반복된다. 그러다가 조건식이 거짓이 되면, for문을 빠져나간다.
public class FlowControl {
public static void main(String[] args) {
int sum = 0;
for(int i = 1; i <= 10; i++) {
sum += i;
System.out.printf("1부터 %2d까지의 합: %2d%n", i, sum);
}
}
}
※ 초기화
반복문에 사용될 변수를 초기화하는 부분이며 처음에 한 번만 수행된다. 보통 변수 하나로 for문을 제어하지만, 둘 이상의 변수가 필요할 때는 콤마로 변수를 구분하여 초기화하면 된다. 단, 두 변수의 타입은 같아야 한다.
※ 조건식
조건식의 값이 참이면 반복을 계속하고, 거짓이면 반복을 중단하고 for문을 벗어난다. 조건식을 잘못 작성하면 블럭 내의 문장이 한 번도 수행되지 않거나 영원이 반복되는 무한 루프에 빠지기 쉬우므로 조심해야 한다.
※ 증감식
반복문을 제어하는 변수의 값을 증가 또는 감소시키는 식이다. 매 반복마다 변수의 값이 증감식에 의해서 점진적으로 변하다가 결국 조건식이 거짓이 되어 for문을 벗어나게 된다.
※ 요소의 생략
위 세 요소는 필요하지 않으면 생략할 수 있으며, 심지어 모두 생략하는 것도 가능하다. 특히 조건식이 생략된 경우, for문은 무한 반복문이 된다.
※ 중첩 for문
if문 안에 또 다른 if문을 넣을 수 있는 것처럼, for문 안에 또 다른 for문을 포함시키는 것도 가능하다.
public class FlowControl {
public static void main(String[] args) {
for(int i = 2; i <= 9; i++) {
System.out.println(i + "단");
for(int j = 1; j <= 9; j++)
System.out.printf("%d * %d = %d%n", i, j, i * j);
}
}
}
※ 향상된 for문
JDK1.5부터 배열과 컬렉션에 저장된 요소에 접근할 때 기존보다 편리한 방법으로 처리할 수 있도록 for문의 새로운 문법이 추가되었다.
for(타입 변수명 : 배열 또는 컬렉션) {
// 반복할 문장
}
배열 또는 컬렉션에 저장된 값이 매 반복마다 하나씩 순서대로 읽혀서 변수에 저장된다.
public class FlowControl {
public static void main(String[] args) {
int[] arr = {10, 20, 30, 40, 50};
int sum = 0;
for(int i = 0; i < arr.length; i++)
System.out.printf("%d ", arr[i]);
System.out.println();
for(int tmp : arr) {
System.out.printf("%d ", tmp);
sum += tmp;
}
System.out.println();
System.out.println("sum = " + sum);
}
}
2.2 while문
for문에 비해 while문은 구조가 간단하다. while문은 조건식과 블록으로만 이루어져 있다. while문은 조건식이 참인 동안 블럭 내의 문장을 반복한다.
while(조건식) {
// 조건식의 연산 결과가 참인 동안, 반복될 문장들을 적는다.
}
※ for문과 while문의 비교
// 1부터 10까지 정수를 순서대로 출력하는 코드
// for문
for(int i = 1; i <= 10; i++)
System.out.println(i);
// while문
int i = 1;
while(i <= 10) {
System.out.println(i);
i++;
}
※ while문의 조건식은 생략 불가
for문은 조건식을 생략하면 무한 반복문이 되지만 while문은 조건식을 생략할 수 없다. 그래서 while문으로 무한 반복문을 만들려면 조건식에 true를 넣으면 된다.
while(true) {
// 무한 반복문
}
import java.util.*;
public class FlowControl {
public static void main(String[] args) {
int num, sum = 0;
System.out.print("양의 정수를 입력하세요: ");
Scanner scanner = new Scanner(System.in);
num = scanner.nextInt();
while(num != 0) {
sum += num % 10;
System.out.printf("sum = %3d num = %3d%n", sum, num);
num /= 10;
}
System.out.println("각 자리수의 합: " + sum);
}
}
2.3 do-while 문
do-while문은 while문의 변형으로 기본적인 구조는 while문과 같으나 조건식과 블록의 순서를 바꿔놓은 것이다. 그래서 while문과 반대로 블록을 먼저 수행한 후에 조건식을 평가한다. while문은 조건식의 결과에 따라 블록이 한 번도 수행되지 않을 수 있지만, do-while문은 최소 한 번은 수행된다.
do {
// 조건식의 연산 결과가 참일 때 수행될 문장들을 적는다.
} while(조건식);
import java.util.*;
public class FlowControl {
public static void main(String[] args) {
int input, answer;
answer = (int)(Math.random() * 100) + 1;
Scanner scanner = new Scanner(System.in);
do {
System.out.print("1과 100 사이의 정수를 입력하세요: ");
input = scanner.nextInt();
if(input > answer)
System.out.println("더 작은 수를 입력하세요.");
else if (input < answer)
System.out.println("더 큰 수를 입력하세요.");
} while(input != answer);
System.out.println("정답입니다.");
}
}
2.4 break문
앞서 switch문에서 break문을 사용했던 것처럼 반복문에서도 break문을 사용할 수 있다. break문은 자신이 포함된 가장 가까운 반복문을 벗어난다. 주로 조건문과 함께 사용되어 특정 조건을 만족하면 반복문을 벗어나도록 한다.
public class FlowControl {
public static void main(String[] args) {
int sum = 0;
int i = 0;
while(true) {
if(sum > 100)
break;
i++;
sum += i;
}
System.out.println("i = " + i);
System.out.println("sum = " + sum);
}
}
2.5 continue문
continue문은 반복문 내에서만 사용될 수 있어며, 반복이 진행되는 도중에 continue문을 만나면 반복문의 끝으로 이동하여 다음 반복으로 넘어간다. for문의 경우 증감식으로 이동하며, while문과 do-while문의 경우 조건식으로 이동한다. 전체 반복 중에 특정 조건을 만족하는 경우를 제외하고자 할 때 유용하다.
public class FlowControl {
public static void main(String[] args) {
for(int i = 0; i <= 10; i++) {
if(i % 3 == 0)
continue;
System.out.println(i);
}
}
}
2.6 이름 붙은 반복문
break문은 근접한 단 하나의 반복문만 벗어날 수 있기 때문에, 여러 개의 반복문이 중첩된 경우에는 break문으로 중첩 반복문을 완전히 벗어날 수 없다. 이때는 중첩 반복문 앞에 이름을 붙이고 break문과 continue문에 이름을 지정해 줌으로써 하나 이상의 반복문을 벗어나거나 반복을 건너뛸 수 있다.
public class FlowControl {
public static void main(String[] args) {
Loop1: for(int i = 2; i <=9; i++) {
for(int j = 1; j <= 9; j++) {
if(j == 5)
break Loop1;
System.out.printf("%d * %d = %d%n", i, j, i * j);
}
}
}
}
'프로그래밍 언어 > Java' 카테고리의 다른 글
| Chapter 6. 객체지향 프로그래밍 1 (0) | 2022.12.05 |
|---|---|
| Chapter 5. 배열 (0) | 2022.12.03 |
| Chapter 3. 연산자 (0) | 2022.11.24 |
| Chapter 2. 변수 (0) | 2022.11.23 |
| Chapter 1. 자바의 시작 (0) | 2022.11.23 |