[Java 기본 문법] 3. 제어문
2021.08.13 - [Java] - [Java 기본문법] 2. 연산자
[Java 기본문법] 2. 연산자
2021.08.13 - [Java] - [Java 기본 문법] 1. 변수와 타입 [Java 기본 문법] 1. 변수와 타입 변수 변수 : 프로그램이 작업을 처리하는 과정에서 필요에따라 데이터를 메모리에 저장하는데, 이 때 값을 저장할
blog.robinjoon.space
특정 조건을 만족할 때, 프로그램의 실행 흐름을 바꿀 수 있게하는게 제어문이다. 제어문은 조건식과 제어문 블록으로 이루어진다. 조건식을 만족할 때만 제어문 블록 내부의 코드를 실행하고, 만족하지 않으면 블록을 무시한다. 제어문은 조건문과 반복문으로 나뉜다. 조건문은 제어문 블록을 실행하고, 블록 밖을 다시 순서대로 실행하지만, 반복문은 조건문 블록을 실행하고 다시 조건식으로 돌아가 조건식을 만족하지 않을때까지 반복해서 조건문 블록을 실행한다.
제어문은 서로 중첩이 가능하다. 즉, 조건문안에 또 조건문이 있거나 반복문이 있을 수 있고, 반복문안에 또다른 반복문이나 조건문이 있을 수 있다. 즉, 아주 복잡한 흐름도 구현이 가능하다.
이하 내용에서 조건식이란 결과로 boolean 값을 가지는 모든 것을 의미한다.
조건문
자바에서 조건문은 if 문과 switch 문이 있다. if문은 조건식을, switch 문은 변수의 값을 이용해 실행흐름을 제어한다.
if 문
if 문의 문법은 다음과 같다.
if ( 조건식 ) {
조건식을 만족할 때 실행할 코드
}
조건식은 boolean을 결과로 가지는 연산식이나, boolean을 반환값으로 가지는 매서드(무슨 말인지 모를 수 있다. 일단 넘어가자.), boolean 변수가 가능하다. 만일, 조건식을 만족할 때 실행할 코드가 하나의 실행문이라면 중괄호 블록을 생략할 수 있다.
if ( 조건식 )
실행문;
그러나 웬만하면 중괄호를 사용하자. 나중에 실행문이 늘어날 수도 있고, 두 개 이상의 실행문을 실행해야 할 때 실수로 중괄호를 생략하면 흐름이 전혀 달라지기 때문이다.
코드를 작성하다보면, 조건이 만족할 때 실행하는 것 뿐만 아니라, 조건이 만족하지 않을때만 실행할 실행문이 필요할 수도 있다. 이를 위해 자바에선 if - else 문을 지원한다. 사용법은 이렇다.
if ( 조건식 ) {
조건식을 만족할 때 실행할 코드
}else {
조건식을 만족하지 않을 때만 실행할 코드
}
이 경우에도 실행문이 하나라면 중괄호를 생략할 수 있다. 만일, 첫번째 조건식을 만족하지 않았을 때에도 또 검사할 ㅗ건이 있다면 if - else if - else 문을 사용할 수 있다.
if ( 조건식1 ) {
조건식을 만족할 때 실행할 코드
}else if( 조건식2 ){
조건식1을 만족하지않고 조건식2를 만족할 때 실행할 코드
}else {
모든 조건식을 만족하지 않을 때 실행할 코드
}
이 때, 조건식1을 만족했다면, 조건식2는 검사하지 않고 블록밖으로 흐름이 이동된다. 만일, 두 조건식을 서로의 참거짓 여부와 상관없이 독립적으로 검사해야한다면, if - else if 문이 아니라, if문 두개를 연속으로 사용해야 한다.
if ( 조건식1 ) {
조건식을 만족할 때 실행할 코드
}
if( 조건식2 ){
조건식2를 만족할 때 실행할 코드
}
만일, 조건식을 만족했을 때, 또 다른 조건문을 실행해야 한다면 조건문을 중첩해야 한다.
if ( 조건식1 ) {
조건식1을 만족할 때 실행할 코드
if( 조건식2 ){
조건식1을 만족하고 조건식2를 만족할 때 실행할 코드
}else{
조건식1을 만족하고 조건식2를 만족하지 않을때 실행할 코드
}
}
switch 문
switch 문은 if문과는 다르게 조건식의 true 여부를 이용하는게 아니라, 특정 변수의 값이 무었인지에 따라 흐름을 제어하는 제어문이다. 특정 변수 하나의 값에의해 실행이 제어되어야 한다면, if - else 문 보다 switch 문이 더 간결하고 가독성이 좋을 수 있다. 사용법은 다음과 같다.
switch(변수){
case 값1:
실행문1;
break;
case 값2:
실행문2;
break;
case 값3:
실행문3;
break;
default:
실행문4;
}
변수의 값이 '값1' 이면 실행문1이, '값2' 면 실행문2이 실행되는 식이다. 만일, 괄호안의 값과 같은값을 가지는 case가 없으면 default로 가서 실행문이 실행된다. 각 case의 끝에 break; 이 없다면, break;을 만날때까지 case에 상관없이 실행문을 실행한다. 이 때, 변수 자리에는 byte, char, short, int, long 타입의 변수 혹은 이를 반환하는 매서드나 연산식만 올 수 있다. Java 7 부터는 String도 가능하다.
반복문
반복문의 종류로는 for문, while문, do-while문이 있다.
for문
for문의 구조는 다음과같다.
for(1.초기화식;2.조건식;4.증감식){
3.실행문
}
for문의 실행 흐름은 다음과같다.
- 초기화식을 수행한다.
- 조건식이 true 인지 확인한다 true이면 3번으로 넘어가고, 아니면 for 문을 빠져나온다.
- 실행문을 수행한다.
- 증감식을 수행한다.
- 2번으로 돌아간다.
가장 간단한 for문의 예시로 1부터 10까지 출력하는 예제다.
for(int i=1; i<=10; i++){
System.out.println(i);
}
초기화식은 조건식과 증감식에서 반복문의 반복여부를 결정하는 변수의 초기값을 지정하는 역할을 한다. 이 변수를 보통 카운터변수라고 부른다. 만약, 반복문을 제어하는 변수가 for문 밖에 위치한다면, 초기화식은 생략가능하다. 카운터변수를 초기화식에서 선언하였다면 for문 내에서만 사용할 수 있다. 만일, 카운터변수를 for문 밖에서 이용해야하면, for문 밖에서 선언해야 한다. 카운터변수는 정수형 특히 int를 주로 사용한다. 카운터변수에 제한이 있는 것은 아니나 float, double 같은 실수 자료형을 사용할 경우 증감식에서 정확한 값을 가지지 못해 반복 횟수가 예상과 다를 수 있기 때문이다.
while 문
while 문은 for 문과 다르게 정해진 횟수만큼 반복하는 것이 아닌, 조건식이 만족하면 계속 반복하는 형태의 반복문이다. 따라서, 문법과 실행 흐름 역시 간단하다.
while(1.조건식){
2.실행문
}
조건을 만족하면 실행문을 실행한다.
do - while 문
do - while 문은 실행문을 실행하고 조건식을 검사한다. while문과는 다르게 실행문의 1회 수행은 보장되는 것이다. 사용법은 이렇다.
do {
실행문;
} while( 조건식 )
break 문
switch 문에서 잠깐 등장한 break 문은 반복문을 강제로 빠져나오거나 switch 문에서 빠져나오는데 사용한다. 실행문을 실행중, break 문을 만나면 조건에 상관 없이 무조건 제어문 블록을 빠져나온다. 이런 특성때문에 break 문은 if 문과 같이 사용된다. 아래는 예제 코드다.
while(true){
int num = (int)(Math.random()*6)+1; // 1 ~ 6의 수중 하나를 랜덤으로 선택해 num에 저장
System.out.println(num);
if(num==6)break; // num이 6일경우 반복문을 빠져나옴.
}
만일, 여러 반복문이 중첩된경우, 안쪽 반복문에서 break 문을 만나면 안쪽 반복문만 빠져나가고, 바깥쪽 반복문은 빠져나오지 않는다. 만약 중첩된 반목문에서 바깥쪽 반복문도 빠져나가고 싶으면 이렇게 하면 된다.
Label : for ( ... ){
for( ... ){
break Label;
}
}
반복문 앞에 "(임의의 이름) : "을 붙이고, break (임의의 이름); 을 사용하면 이 이름이 붙은 반복문을 빠져나갈 수 있다.
continue 문
continue 문은 반복문 내에서 continue 문 밑에 있는 실행문은 건너뛰는 문법이다. for문 에서 continue 문을 사용하면 증감식이 바로 실행되고, while 문과 do-while 문에서는 조건식 검사가 진행된다. break문 처럼 if문과 함께 사용된다.
for(int i=1; i<=10; i++){
if(i%2==0) continue; // i가 짝수이면 바로 증감식으로 넘어간다.
System.out.println(i);
}