목표
자바가 제공하는 제어문 학습하기
선택문(switch)
선택문은 자바가 제공하는 조건문 중 하나다. 조건문은 조건식과 문장을 포함하는 블럭 {} 으로 구성되어 있으며, 조건식의 연산결과에 따라 실행할 문장을 달리하여, 프로그램의 실행흐름을 변경할 수 있다.
조건문은 if문과 switch문이 있으며, 조건의 수가 많을 때는 switch문이 효율적이지만 switch문은 제약사항이 많아 사용율은 if문이 높다.
if문
if문의 조건식은 반드시 true/false의 결과를 반환해야하므로, 일반적으로 비교연산자와 논리연산자로 구성된다.
if (조건식) {
조건이 true일 때 수행할 문장
}
만일, 블럭내의 문장이 하나뿐 일 때는 { } 의 생략도 가능하다.
if (date == 25)
System.out.println("월급날입니다.");
if문이 처리해야하는 조건의 경우의 수가 2개 이상일 때는 else if 와 else 를 사용한다. else는 앞의 조건을 만족하지 않아야 하기 때문에 자동으로 '앞의 조건식을 만족하지 않을 때' 라는 조건이 추가된 것과 같다.
if (rank < 10) {
System.out.println("A 입니다.");
} else if (rank < 20) { // if ( rank >= 10 && rank < 20)
System.out.println("B 입니다.");
} else if (rank < 30) {
System.out.println("C 입니다.");
} else if (rank < 40) {
System.out.println("D 입니다.");
} else {
System.out.println("F 입니다.");
}
switch문
if문은 조건식의 결과가 참과 거짓, 두 가지 밖에 없기 때문에 경우의 수가 많아질수록 else-if의 수가 많아지고 복잡해진다. switch문은 if문과 달리 하나의 조건식으로 많은 경우의 수를 처리할 수 있고, 표현식도 간결하다.
switch (조건식) {
case 값1:
// 조건식의 결과가 값1과 같을 경우 수행되는 문장
break;
case 값2:
// 조건식의 결과가 값2과 같을 경우 수행되는 문장
break;
default:
// 조건식의 결과와 일치하는 case가 없을 때 수행되는 문장
break; // 마지막 break;는 생략가능
}
switch문은 break;문을 만날 때만 switch 문을 빠져나간다. 따라서 마지막 break;는 생략이 가능하다. 또 이 점을 이용하여 여러 case가 동일한 동작을 수행해야하는 경우에는 고의적으로 break;를 생략하기도 한다.
switch (grade) {
case 'A':
case 'B':
System.out.println("합격입니다.");
break;
case 'C':
System.out.println("불합격입니다.");
break;
default:
System.out.println("낙제입니다.");
}
case문의 값은 정수 또는 문자열이어야 한다. 실수나 변수는 case문의 값이 될 수 없다. 문자 상수도 유니코드로 정수값을 가지므로 가능하다. switch문도 if문 처럼 중첩으로 사용이 가능하다.
반복문
for문
반복의 횟수를 알고 있을 때 적합하다. 초기화, 조건식, 증감식, 블럭 {} 으로 이루어져 있다.
(초기화: 1부터)(조건식: 5까지)(증감식: 1씩 증가)
for(int i = 1; i <= 5; i++) {
System.out.println("실행블럭");
}
초기화
for(int i = 1, j = 0; ...; ...) {}
반복문에 사용될 변수를 초기화하는 부분이며, 처음에 한번만 수행된다. 둘 이상의 변수가 필요할 때는 콤마 ','를 구분자로 변수를 초기화하면 된다. (이 때, 타입은 같아야한다)
조건식
for(...; i < 100; ...) {}
조건식의 값이 참(true)이면 반복을 계속하고, 거짓(false)이면 반복을 중단하고 for문을 벗어난다.
증감식
for(...; ...; i++, j*=3, k-=2) {}
반복문을 제어하는 변수의 값을 증가 또는 감소시키는 식이다. 매 반복마다 변수의 값이 증감식에 의해서 점진적으로 변하다가 결국 조건식이 거짓이 되어 for문을 벗어나게 된다. 증감식도 콤마 ','를 구분자로 두 문장 이상을 지정할 수 있다.
위의 3가지 식은 모두 생략이 가능하며, 조건식이 생략되면 무한 반복문으로 실행된다.
향상된 for문(enhanced for statement)
for(타입 변수명 : 배열 또는 컬렉션) {
}
List<String> names = List.of("길동", "둘리", "또치");
for (String name : names) {
System.out.println("호이! " + name);
}
배열과 컬렉션에 저장된 요소에 접근할 때, 기존보다 편리한 방법으로 처리할 수 있는 문법이다. 이미 저장된 요소들을 읽어오는 용도로만 사용이 가능하다.
while 문
조건식과 블럭 {} 만으로 이루어져 있다. 조건식이 참(true)인 동안 블럭 내의 문장을 반복한다.
while (조건식) {
System.out.println("실행블럭");
}
while문은 먼저 조건식을 평가해서 조건식이 거짓이면 문장 전체를 벗어나고, 참이면 블럭 내의 문장을 수행한 뒤, 다시 조건식으로 돌아간다. 조건식이 거짓이 될 때까지 이 과정이 반복된다. for문과 다르게 while문의 조건식은 생략이 불가능하며, for문에서 조건문을 생략한 것과 같이 무한 반복문을 만들고자 하면 조건식을 true 또는 1 을 넣는다.
do-while 문
while문의 변형으로 기본적인 구조는 while문과 같으나, 블럭을 먼저 수행한 뒤 조건식을 평가하도록 순서를 바꿔놓은 것이다.
do {
System.out.println("수행블럭");
} while (조건식);
while문은 조건식의 결과에 따라 블럭이 한 번도 수행되지 않을 수 있지만, do-while문은 최소 한 번은 수행되는 것을 보장한다.
break 문
break 문은 자신이 포함된 가장 가까운 반복문을 벗어난다. 반복문의 실행블럭에서 break 하위의 구문들은 수행되지 않는다.
int i = 0, sum = 0;
while(true) {
if(sum > 10) {
break;
}
++i;
sum+=i;
}
for문에서 조건식이 거짓이 되기 전에 특정 케이스에서 반복문을 벗어나고 싶을 때 사용할 수 있다. 조건식이 생략된 for문, 또는 조건식이 true인 while문 등 무한 반복문에서는 break 문이 항상 같이 사용되어야 한다.
Continue 구문
break 문은 switch문에서도 사용되었지만 continue문은 반복문 내에서만 사용할 수 있다. continue문을 만나면 반복문의 끝으로 이동하여 다음 반복으로 넘어간다. for문의 경우 증감식으로 이동하며, while문과 do-while문의 경우 조건식으로 이동한다.
for (int i = 1; i <= 100; i++) {
System.out.print(i);
if (i % 3 > 0) {
continue;
}
System.out.println("(짝!)");
}
이름 붙은 반복문
break 문은 근접한 단 하나의 반복문만 벗어날 수 있기 때문에, 여러 개의 반복문이 중첩된 경우에는 break문으로 중첩 반복문을 완전히 벗어날 수 없다. 중첩 반복문에 이름을 붙이고 break문과 continue문에 이름을 지정해 줌으로써, 하나 이상의 반복문을 벗어나거나 반복문을 건너 뛸 수 있다.
ex) 2단부터 입력받은 숫자보다 작은 구구단만 출력하며, 입력받은 숫자와 동일한 값을 만나면 종료한다.
public void findGugudan(int number) {
Loop1 : for(int i = 2; i <= 9; i++) {
for(int j = 1; j <= 9; j++) {
int result = i * j;
if (result > number) {
continue Loop1;
}
System.out.println(i + "*" + j + "=" + result);
if (result == number) {
break Loop1;
}
}
}
}
※ 참고