if ~ else 문은 관계 연산자나 논리 연산자를 활용하여 boolean 결과 값을 반환하는 조건식에 따라 실행의 흐름이 달라진다. 아래의 형태가 가장 기본적인 if ~ else 문을 활용한 조건문이다.
if ( 조건식 ) {
// 조건이 true 이면 실행
} else {
// 조건이 false 이면 실행
}
해당 조건의 결과에 따라 실행되는 코드 블럭이 달라지고 다른 코드 블럭들은 실행되지 않는다.
그리고 아래와 같이 더 다양한 조건으로 나눌 수도 있다.
if ( 조건식 1 ) {
// 조건식 1 이 true 이면 실행
} else if ( 조건식 2 ) {
// 조건식 1 이 false 이고 조건식 2 가 true 이면 실행
} else {
// 조건식 1 과 조건식 2 모두 false 이면 실행
}
여기서 알 수 있는 점은 조건식을 위에서 부터 순차적으로 확인하고 현재 조건식이 거짓일때만 다음 조건식으로 넘어가는 식이며 현재 조건식이 참이면 해당 코드 블럭이 실행되고 if ~ else 문을 빠져나가게 된다.
더 나아가 이렇게도 if ~ else 문을 중첩하는 것도 가능하다.
if( 조건식 1 ) {
if ( 조건식 2 ) {
// 조건식 1 과 조건식 2 가 true 이면 실행
} else {
// 조건식 1 은 true 이고 조건식 2 가 false 이면 실행
}
} else {
// 조건식 1 이 false 이면 실행
}
switch 문 또한 조건문이고 주로 변수로 정수값, ENUM 또는 문자열 등을 입력 받아 미리 정해놓은 여러 값들과의 일치여부를 판단할 때 사용된다. 이는 위의 if ~ else 문을 통해서도 표현이 가능하지만 switch 문을 사용하는 것이 적합하다.
아래는 if ~ else 문으로 표현한 것이다.
int num = 5;
int ret;
if (num == 0) ret = num;
else if (num == 1) ret = num;
else if (num == 3) ret = num;
else if (num == 5) ret = num;
else if (num == 7) ret = num;
else ret = num;
System.out.println(ret);입력하세요
아래는 같은 조건문을 switch로 표현한 것이다.
int num = 5;
int ret;
switch (num) {
case 0: ret = num; break;
case 1: ret = num; break;
case 3: ret = num; break;
case 5: ret = num; break;
case 7: ret = num; break;
default: ret = num; break;
}
System.out.println(ret);
위 두 개의 조건문은 동일한 기능을 제공하지만 작동 방식에서 큰 차이가 있다.
우선 성능과 관련하여, if else 문은 각각의 조건식을 순차적으로 확인하며 제어 흐름을 결정한다. 즉, N 개의 조건식이 있으면 N 개의 진위여부를 판단한다.
하지만, switch 문은 if else 문과 달리 JVM 에서 switch 구문안의 case 값들의 분포에 따라 내부적으로 각각의 상황에 최적화된 2개의 바이트 코드를 생성한다. 그리고 Lookup Table(HashTable과 같은)과 같은 LookupSwitch나 TableSwitch를 활용하여 각각의 if else문의 마지막 조건식은 앞의 모든 조건식을 지나친 후에 실행되는 것과 달리 각 case에 동일한 접근 시간을 보장한다.
- if else 문 O(n)
- switch 문 O(1)
그리고 제어 흐름 측면에서 switch 문은 각 변수의 값에 해당되는 case에서부터 아래의 case 들을 실행하는 구조이기 때문에 break문을 통해 적절히 분기해주어야 한다. 그리고 default는 앞서 설정한 case 들에 해당하는 값이 없을 때 실행되는 조건이다.
반복문이란
while( 조건식 ) {
// 조건식이 참이면 실행
}
while 문은 아래와 같은 순서로 동작한다.
- 조건식 진위 여부 판단
- 조건식이 참인 경우 코드 블럭을 실행
- 코드 블럭 실행 후 1번 항목부터 재개
- 조건식이 거짓인 경우 while문 탈출
for ( 초기화식 ; 조건식 ; 증감식 ) {
// 조건식이 참이면 실행
}
for 문은 아래와 같은 순서로 동작한다.
- 조건식에 사용될 변수 초기화
- 조건식 진위 여부 판단
- 조건식이 참이면 코드 블럭 실행
- 실행 후 증감식에 의한 변수 정보 갱신
- 2번 항목부터 재개
- 조건식이 거짓이면 for 문 탈출
아래는 for문의 예시로써 1 부터 10 까지를 출력해주는 반복문이다.
for (int i = 1 ; i < 11 ; i++){
System.out.println(i); //i 출력
}
do ~ while 문은 while문과 달리 조건식의 진위 여부와는 무관하게 무조건 한 번은 실행되는 구조이다.
do {
// 실행
} while ( 조건식 );
실행 순서는 아래오 같다.
- do 블럭 내의 코드 실행
- 조건식의 진위 여부 판단
- 조건식이 참일 경우 1번 항목부터 재개
- 조건식이 거짓이면 do ~ while 문 탈출
for each 문이라는 명칭은 다른 언어에서 주로 사용되고 enhanced for 문이라고 볼 수 있다. 그래서 for each 라는 키워드가 따로 존재하는 것이 아니라 동일한 for 를 사용한다.
for ( 변수타입 변수 : 컬렉션 또는 배열 ) {
// 코드
}
아래와 같이 사용할 수 있다.
ArrayList<String> numbers = new ArrayList<String>();
numbers.add("one");
numbers.add("two");
for (String number : numbers) {
System.out.println(number);
}