조건문은 if문과 switch문 두 가지가 있으며 주로 if문을 많이 사용한다. 처리할 경우의 수가 많을 때는 if문보다 switch문이 효율적이지만, switch문은 if문보다 제약이 많다.
if문은 가장 기본적인 조건문이며 만일(if) 조건이 참(true)이면 괄호{} 안의 문장들을 수행하라. 하는 의미로 이해하면 된다.
if(조건식) {
// 조건식이 참(true)일 때 수행될 문장들을 적는다.
}
괄호{}를 이용해서 여러 문장을 단위로 묶는 것을 블럭(block)이라고 한다.
블러 안의 문장이 하나뿐일 경우엔 괄호{}는 생략 가능하다.
if (score > 60)
{ // 블럭의 시작
System.out.printlnl("합격입니다.")
} // 블럭의 끝
if문의 변형인 if-else문의 구조는 다음과 같다.
if (조건식) {
// 조건식이 참(true) 일 때 수행될 문장들을 적는다.
} else {
// 조건식이 거짓(false) 일 때 수행될 문장들을 적는다.
}
if문에 else블럭이 더 추가된 형태이다. else의 뜻이 '그 밖의 다른'이므로 조건식의 결과가 참이 아닐 때, 즉 거짓일 때 else블럭의 문장을 수행하라는 뜻이다.
if-else문은 두 가지 경우 중 하나가 수행되는 구조이다. 그렇다면 처리해야할 경우의 수가 셋 이상인 경우에는 if-else if문을 사용하면 된다.
if (조건식1) {
// 조건식1의 연산결과가 참일 때 수행될 문장들을 적는다.
} else if (조건식2) {
// 조건식2의 연산결과가 참일 때 수행될 문장들을 적는다.
} else if (조건식3) { // 여러 개의 else if를 사용할 수 있다.
// 조건식3의 연산결과가 참일 때 수행될 문장들을 적는다.
} else { // 마지막에는 보통 else블럭으로 끝나며, else블럭은 생략가능하다.
// 위의 어느 조건식도 만족하지 않을 때 수행될 문장들을 적는다.
}
if문의 블럭 내에 또 다른 if문을 포함시키는 것은 중첩 if문이라고 부른다. 중첩의 횟수에는 거의 제한이 없다.
if (조건문1) {
// 조건식1의 연산결과가 true일 때 수행될 문장들을 적는다.
if (조건식2) {
// 조건식1과 조건식2가 모두 true일 때 수행될 문장들
} else {
// 조건식1일 true이고, 조건식2가 false일 때 수행되는 문장들
}
} else {
// 조건식1이 false일 때 수행되는 문장들
}
단 하나의 조건식으로 많은 경우의 수를 처리할 때 switch문을 사용한다. 다만 switch문은 제약조건이 있기 때문에, 경우의 수가 많아도 어쩔 수 없이 if문으로 작성해야 하는 경우가 있다.
1. switch문의 조건식 결과는 정수 또는 문자열이어야 한다.
2. case문의 값은 정수 상수만 가능하며, 중복되지 않아야 한다.
반복문은 어떤 작업이 반복적으로 수행되도록 할 때 사용된다.
for문은 반복 횟수를 알고 있을 때 적합하다. 구조가 조금 복잡하지만 직관적이라 오히려 이해하기 편하다. 아래의 for문은 블럭{} 내의 문장 "I can do it."을 5번 반복한다.
for(int i = 1; i <= 5; i++) {
System.out.println("I can do it.");
}
for문은 '초기화', '조건식', '증감식', '블럭{}', 모두 4부분으로 이루어져 있다. 조건식이 참인 동안 블럭{} 내의 문장들을 반복하다 거짓이 되면 반복문을 벗어난다.
for(초기화; 조건식; 증감식) {
// 조건식이 참일 때 수행될 문장들을 적는다.
}
반복문에 사용될 변수를 초기화 하는 부분이며 처음 한 번만 수행된다.
둘 이상의 변수가 필요할 때는 콤마 ','를 구분자로 변수를 초기화 하면 된다. 이때 두 변수의 타입은 같아야 한다.
for(int i=1; i<=10; i++) {...} // 변수 i의 값을 1로 초기화 한다.
for(int i=1, j=0; i<=10; i++) {...} // int타입의 변수 i와 j를 선언하고 초기화
조선식이 참(true)이면 반복을 계속하고, 거짓(false)이면 반복을 중단하고, for문을 벗어난다.
for(int i=1; i<=10; i++) {...} // i<=10일동안 블럭{}안의 문장들을 반복
반복문을 제어하는 변수의 값을 증가 또는 감소시키는 식이다.
매 반복마다 변수의 값이 증감식에 의해서 점진적으로 변하다가 결국 조건식이 거짓이 되어 for문을 벗어나게 된다.
for(int i =1; i <=10; i++){ ... } // 1부터 10까지 1씩 증가
for(int i =10; i >=1; i--){ ... } // 10부터 1까지 1씩 감소
for(int i =1; i <=10; i+=2){ ... } // 1부터 10까지 2씩 증가
for(int i =1; i <=10; i*=3){ ... } // 1부터 10까지 3배씩 증가
증감식도 쉼표','를 이용하여 두 문장 이상을 하나로 연결해서 쓸 수 있다.
for(int i=1, j=10; i<=10; i++, j--) {...}
// i는 1부터 10까지 1씩 증가하고
// j는 10부터 1까지 1씩 감소한다.
for문 또한 for문 안에 또 다른 for문을 포함시키는 것이 가능하다.
for(int i = 1; i <= 5; i++) {
for(int j = 1; j <= 10; j++) {
System.out.print("*");
}
System.out.print();
}
for문의 새로운 문법으로 배열과 컬렉션에 저장된 요소에 접근할 때 기존보다 편리한 방법이다.
for (타입 변수명 : 배열 또는 컬렉션) {
// 반복할 문장
}
위의 문장에서 타입은 배열 또는 컬렉션의 요소의 타입이어야 한다.
배열 또는 컬렉션에 저장된 값이 매 반복마다 하나씩 순서대로 읽혀서 변수에 저장된다. 그리고 반복문의 괄호{}내에서는 이 변수를 사용해서 코드를 작성한다.
int[] arr = {10,20,30,40,50};
배열 arr을 위와 같이 선언했을 때, 이 배열의 모든 요소를 출력하는 for문은 두가지있다.
<일반적인 for문>
for(int i=0; i<arr.length; i++) {
System.out.println(arr[i]);
}
<향상된 for문>
for(int tmp : arr) {
System.out.println(tmp);
}
두 for문은 동등하며, 향상된 for문이 더 간결하다. 그러나 향상된 for문은 일반적인 for문과 달리 배열이나 컬렉션에 저장된 요소들을 읽어오는 용도로만 사용할 수 있다는 제약이 있다.
<향상된 for문 예시>
public static void main(Stringp[ 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);
}
while문은 for문에 비해 구조가 간단하다. if문처럼 조건식과 블럭{}만으로 이루어져 있다.
다만 if문과 달리 while문은 조건식이 참(true)인 동안, 즉 조건식이 거짓이 될 때까지 블럭{} 내의 문장을 반복한다.
while (조건식) {
// 조건식의 연산결과가 참(true)인 동안, 반복될 문장들을 적는다.
}
while문의 변형으로 기본적인 구조는 while문과 같으나 조건식과 블럭{}의 순서를 바꿔놓은 것이다.
그래서 while문과 반대로 블럭{}을 먼저 수행한 후에 조건식을 평가한다.
while문은 조건식의 결과에 따라 블럭{}이 한 번도 수행되지 않을 수 있지만, do-while문은 최소 한 번은 수행될 것을 보장한다.
do {
// 조건식의 연산결과가 참일 때 수행될 문장들을 적는다.
} while (조건식); // 끝에 ';'를 꼭 붙이자!
<do-while 예시>
int i=0;
do {
System.out.println("do-while 반복문 "+i);
i = i+1;
} while (i != 5;)
<실행결과>
do-while 반복문 0
do-while 반복문 1
do-while 반복문 2
do-while 반복문 3
do-while 반복문 4
break문은 자신이 포함된 가장 가까운 반복문을 벗어난다. 주로 if문과 함께 사용되어 특정 조건을 만족하면 반복문을 벗어나도록 한다.
while(true) {
if(sum > 100)
break;
++i;
sum += i;
}
continue문은 반복문 내에서만 사용될 수 있다. 반복이 진행되는 도중에 continue문을 만나면 반복문의 끝으로 이동하여 다음 반복으로 넘어간다.
for(int i = 0; i <= 10; i++) {
if (i%3==0)
continue; // 블럭의 끝으로 이동
// break문과 달리 반복문을 벗어나지 않는다.
System.out.println(i);
}
<실행결과>
1
2
4
5
7
8
10
break문은 근접한 단 하나의 반복문만 벗어날 수 있길 때문에, 여러 개의 반복문이 중첩된 경우에는 break문으로 중첩 반복문을 완전히 벗어날 수 없다. 이때는 중첩 반복문 앞에 이름을 붙이고 break문과 continue문에 이름을 지정해 줌으로써 하나 이상의 반복문을 벗어나거나 반복을 건널뛸 수 있다.
public class LoofTest
{
public static void main(String[] args)
{
Loop1 : for(int i=2; i<=9; i++) {
// for문에 Loop1이라는 이름 사용
for(int j=1; j<=9; j++) {
if(j==5)
break Loop1;
// break;
// continue Loop1;
// continue;
System.out.println(i+"*"+j+"="+i*j);
}
System.out.println();
}
}
}
<실행결과>
2*1=2
2*2=4
2*3=6
2*4=8