Ch04. 제어문
제어문
- 제어문은 Java 코드의 흐름을 제어하는 데 사용할 수 있는 명령문을 제공하는데 이것을 제어문이라고 한다
- 이는 프로그램의 원활한 흐름을 다양하게 제공하기 위함이며, 5개의 제어문과 2개의 제어 키워드가 있다
- 조건문 : if, switch
- 반복 제어문 (Loop 문) : for, while, do-while
- 제어 키워드 (Jump 문) : break, continue
if 문
- if문은 특정 조건에 따라 프로그램을 제어하는 조건문이다
- if문의 조건식을 통해 boolean true 또는 false 값을 얻는다
- 기본 if 문, if-else 문, if-else-if 문, 중첩 if 문 4가지 유형이 있다
- 기본 if 문 : 가장 기본적인 조건문이다. 조건식이 true이면 if문의 코드블럭 { } 의 실행 구문이 실행 된다
- Syntax
if (조건식) {
실행 구문;
}
if-else 문
- if-else문은 if 조건이 true이면 if 코드블럭이 실행되고, false 이면 else 코드블록이 실행된다
- Syntax
if 조건식 {
실행 구문; // 조건이 true일 때 실행
} else {
실행 구문; // 조건이 false이면 실행
}
if-else if-else 문
- if-else if-else문은 여러 else if문이 체인처럼 포함된 if 문이다
- else문은 if문이나 else if문 조건이 모두 false이면 실행 된다
- Syntax
if 조건식1 {
실행 구문; // 조건식1이 true일 때 실행
} else if 조건식2 {
실행 구문; // 조건식2가 true이면 실행
} else if 조건식n {
실행 구문; // 조건식n이 true이면 실행
} else {
실행 구문; // 조건식들이 모두 false이면 실행
}
중첩(Nestde) if문
- 중첩 if문은 if문 안에 또 다른 if문을 중첩해서 넣을 수 있으며, 중첩 횟수는 거의 제한이 없다. 하지만 중첩 if문이 많을 수록 프로그램 흐름이나 조건 제어의 복잡도가 높아지기 때문에 지양해야 한다
- Syntaxif (조건식1) {
실행 구문; // 조건식1이 true일 때 실행
if 조건식2 {
실행 구문; // 조건식2가 true이면 실행
} else {
실행 구문; // 조건식2가 false이면 실행
}
} else {
실행 구문; // 조건식1이 false이면 실행
}
if문 코드블럭({ })
- if문의 조건이 true일 경우 실행되는 코드블럭을 중괄호 { } 로 감싸는 부분은 단일 실행구문의 경우 Optional로 제외해도 오류는 발생하지 않는다
int i = 20;
if (i < 10) {
System.out.println ("i는 10보다 작다" );
} else if (i < 15) {
System.out.println ("i는 15보다 작다") ;
} else {
System.out.println ("조건이 맞지 않았습니다") ;
}
int i = 20;
if (i < 10) {
System.out.println ("i는 10보다 작다") ;
} else if ( i < 15) System.out.println ("i는 15보다 작다" );
} else System.out.println ("조건이 맞지 않았습니다") ;
}
Switch 문
- Swtich 문은 if-else if문과 유사하다. case문을 통해 여러 조건과 코드 블럭 을 포함 시킬 수 있다
- if-else if문 대신 switch문을 사용하면 코드 가독성을 향상시킨다
- case 문의 변수는 byte, short, char, int 또는 enumeration 열거형 과 Java 7버전 부터는 문자열 타입도 지원된다
- case문의 종료는 ‘ : ’ 이어야 한다
- case문의 코드 블록은 비어있어도 컴파일 오류가 발생하지 않는다
- case문의 코드 블록에 break문이 없을 경우 조건이 일치해도 다음 case 문 이 실행된다
- break : switch 문이나 반복문을 강제로 빠져나오게 한다
- default : if문의 else를 의마하여 case문과 일치하는 않을 때 실행된다
- 특정변수를 반복적으로 비교해야 할 경우 if문 보다는 switch문을 사용하는게 효과적이다
- if문은 종적인 관계로 비교하기 때문에 조건이 많아질수록 실행 속도가 현저하게 떨어지게 된다. 대신 switch문은 횡적인 관계로 비교할 수 있다
중첩 Switch 문
- switch문 안에 또다른 switch 문을 중첩해서 넣을 수 있다
반복문
- 조건식이 true일 동안 반복문의 코드 블록을 반복적으로 실행할 때 사용한다
- 반복문은 3가지 유형이 있고, 각 유형별로 구문 및 조건을 확인 시간 차가 있다
- for 문
- while 문
- do-whie 문
for 문
- 동일하거나 유사한 문장을 지정한 수만큼 반복 수행
- 한 라인의 코드에 for문에서 사용할 변수를 초기화하고 조건을 확인하고 증가/감소할 수 있다
- 수행되는 내용이 단일 행 일 때는 블록 생략 가능
- 초기화는 for문 실행 시작 시 한번만 실행
- 초기화와 증감식에는 콤마 , 를 사용하여 여러 항목 삽입 가능
- 조건식이 비어 있을 경우 무한 루프로 동작한다
- 증감식의 경우 조건이 만족할 때 까지 실행된다
- break : for문을 강제로 빠져나오게 한다
- continue : 실행 순서를 for문의 ‘}’로 옮겨간다
예제)
- 변수를 두 개 이상 사용하여 반복 제어할 경우 ‘ , ‘ 를 구분자로 사용하여 변수를 초기화하고 업데이트 한다
- for문 안에 for문을 추가하여 중첩으로 실행 할 수 있다
for - each Loop (Enhanced for loop)
- 5.0부터 도입되었다
- 배열 또는 컬렉션의 element 요소 를 하나씩 꺼내와서 반복처리하는 for Loop이다
- 기본 for문 처럼 원하는 요소로 이동하여 처리할 수 없지만, 배열이나 컬렉션의 요소를 순회하여 처리할 때는 사용하는것이 좋다
- Syntaxfor (데이터타입 변수명 : 배열 또는 콜렉션) {
실행구문;
}
String[ ] names = {"홍길동","김철수","이순신"};
for (String name:names) {
System.out.println name ;
}
while 문
- 조건식이 true일 동안 반복 수행하는 명령으로 반복 횟수를 미리 알 수 없는 경우나 무한 반복 수행시 사용한다
- break 명령으로 Loop 작업을 강제 종료하고 블록을 빠져나온다
예제)
중첩 while 문 예제)
do ~ while 문
- while문과 흡사하며, while문이 실행되기 위해 선행되어야 하는 명령을 실행 후 그 데이터를 이용하여 반복작업을 처리하고자 할 경우 사용한다
- do { .. }블록 안의 내용을 먼저 실행 후 조건식을 검사하기 때문에 조건식과 상관없이 무조건 한 번은 실행된다
- while, for loop문은 zero/many iterative loop, do~while은 one/many iterative loop
예제)
continue keyword
- 반복문을 실행하는 중에 continue keyword를 만나면 반복문의 시작점 으로 이동하여 명령을 실행 시키는 강제성이 있는 keyword
- 잘못 사용할 경우 프로그램의 흐름에 오류가 발생할 수도 있으므로 사용 시 주의해야 한다
- while, for, do~while문의 코드 블럭내에서 사용하며 반복문을 벗아나지 않는다
break keyword
- break keyword는 반복문 수행 도중 강제적으로 loop를 종료시키는 키워드로 특정 조건에 해당 loop문을 강제 종료할 경우에 사용한다
- while, for, do~while문의 코드 블럭내에서 사용
레이블을 이용한 제어
- 반복문에 라벨을 지정하여 break와 continue 명령어에 레이블을 지정하면 해당 위치로 이동된다
public static void main (String args[])
{ // 레이블 first first:
for (int i = 1; i < 5; i++) {
// 레이블 second
second:
for (int j = 1; j < 3; j ++) {
System.out.println ("i = " + i + "; j = " +j );
if ( i == 2) {
// 현재 loop를 종료하고 first 레이블의 loop가 종료된다
break first;
} } } }