📔 학습한 내용을 정리하기 위해 작성하는 게시글입니다.
자바 프로그램이 원하는 결과를 얻기 위해 프로그램의 순차적인 흐름을 제어할 경우에 사용하는 명령문이다.
프로그램의 처리 순서를 바꾸게 도와주며, 조건식과 실행 구문인 중괄호({})
로 둘러싸여 있다. (실행문이 1개일 때는 생략 가능)
제어문 ⊃ 조건문, 반복문이 있다.
{중괄호} : 중괄호 영역을 블록이라고 한다.
주어진 조건식의 결과에 따라 별도의 명령을 수행하도록 제어하는 명령문이다. 조건식의 결과가 'true인 경우'와 'false인 경우'의 두 가지 흐름을 만들어낼 수 있다.
조건식 1개, 중괄호 1개가 있는 구조로, 조건식의 결과과 참(true)이면 명령문(중괄호 안)을 실행하고, 조건식의 결과가 'false'이면 아무것도 실행하지 않는다.
if (조건식) { //조건식은 boolean 타입만 가능
실행문; //조건식이 true일 경우 수행
}
public class Ex01_if {
public static void main(String[] args) {
int num = 100;
if (num > 50) {
System.out.println("num 변수의 값이 50보다 큽니다.");
}
}
}
조건식 하나와 중괄호 2개가 있는 형태로, if 구문의 조건식이 true일 때 if 구문의 중괄호가 실행되고, false일 때 else 구문의 중괄호가 실행된다. else문에는 조건식을 사용하지 않는다. (else구문은 생략 가능 = if문)
모든 조건식은 true or false 이므로 둘 중 하나는 반드시 실행된다.
if (조건식) {
실행문1; 조건식이 참일 경우 수행
}
else {
실행문2; //조건식이 거짓일 경우 수행
}
public class Ex02_switch {
public static void main(String[] args) {
int n = 4;
switch (n % 3) { //조건
case 1 :
System.out.println("나머지가 1");
break;
case 2 :
System.out.println("나머지가 2");
break;
default :
System.out.println("나머지가 0");
}
}
}
if-else문은 조건식의 결과값에 따라 둘 중 하나를 선택하는 제어문이므로 삼항 연산자와 상호 변환할 수 있다.
N개의 조건식과 N+1개의 중괄호를 포함하고 있는 형태로, if-else if-else의 구조이다. (중간의 else if문은 생략 가능 = if-else문)
if (조건식 1) {
실행문; //조건식 1이 true일 때 실행한 후 제어문 탈출
} else if (조건식 2) {
실행문; //조건식 2가 true일 때 실행한 후 제어문 탈출
} ... {
} else if (조건식 N) {
실행문; //조건식 N이 true일 때 실행한 후 제어문 탈출
} else {
실행문; //모든 조건식이 false일 때만 실행
}
public class 학점 {
// 90점 이상: A, 80점 이상 ~ 90점 미만: B, 70점 이상 ~ 80점 미만: C, 70점 미만: F
public static void main(String[] args) {
int a = 85;
if (a >= 90) {
System.out.println("A학점");
} else if (a >= 80) {
System.out.println("B학점");
} else if (a >= 70) {
System.out.println("C학점");
} else {
System.out.println("F학점");
}
}
}
switch문은 점프 위치 변숫값에 따라 특정 위치(case)로 이동해 구문을 실행하는 선택 제어문이다. 점프할 수 있는 위치는 'case 위칫값:'으로 설정한다.
어떤 경우에 switch-case문을 사용할까?
주로 조건이 하나의 변수 값이나 상수 값으로 구분되는 경우 사용한다. 조건이 복잡한 식으로 이루어지는 10 < age < 20과 같은 경우는 switch-case문이 적합하지 않는다. 하나의 값으로 조건을 비교할 수 있을 때, 에를 들어 학점 A, B, C처럼 대상을 하나의 값으로 비교할 수 있을 때 사용한다.
switch문
switch(점프 위치 변수) {
case 위칫값1 : // 점프 위치 변수 = 위칫값 1이면 이 위치로 이동
실행문1;
case 위칫값2 : // 점프 위치 변수 = 위칫값 2이면 이 위치로 이동
실행문2;
case 위칫값n : // 점프 위치 변수 = 위칫값 n이면 이 위치로 이동
실행문3;
default : // 조건식의 값이 어떤 값과도 일치하지 않을 때
실행문4; //(생략 가능)
}
public class switch문 {
public static void main(String[] args) {
int a = 2;
switch(a) {
case 1:
System.out.println("A");
case 2: //switch(a)에 따라 case 2:로 이동한 후 차례대로 구문 실행
System.out.println("B"); //실행됨
case 3:
System.out.println("C"); //실행됨
default:
System.out.println("D"); //실행됨
}
}
}
break 키워드를 포함한 switch문
switch(점프 위치 변수) {
case 위칫값1 : // 점프 위치 변수 = 위칫값 1이면 이 위치로 이동
실행문1;
break;
case 위칫값2 : // 점프 위치 변수 = 위칫값 2이면 이 위치로 이동
실행문2;
break;
case 위칫값n : // 점프 위치 변수 = 위칫값 n이면 이 위치로 이동
실행문3;
break;
default : // 조건식의 값이 어떤 값과도 일치하지 않을 때
실행문4; //(생략 가능)
}
public class Ex02_switch {
public static void main(String[] args) {
int n = 4;
switch(n % 3) { //조건
case 1 :
System.out.println("나머지가 1"); //실행됨
break; //switch문 탈출
case 2 :
System.out.println("나머지가 2");
break;
default :
System.out.println("나머지가 0");
}
}
}
프로그램 내에서 똑같은 명령을 일정 횟수만큼 반복하여 수행하도록 제어하는 명령문이다.
어떤 조건이 성립하는 동안 반복 처리를 실행하는 제어문이다.
실행 구문을 반복적으로 수행하는 반복 제어문으로, 일반적으로 반복 횟수가 정해질 때 주로 사용한다. 즉, for문의 구문을 보면 몇 번 반복하는지 유추할 수 있어야 한다.
for(초기식; 조건식; 증감식) {
실행문; //조건식이 true인 동안 실행
}
- 초기식
for문이 시작될 때 딱 한 번만 실행되고 다시는 실행되지 않는다. for문 안에서만 사용할 변수는 주로 초기식에서 초기화한다.- 조건식
조건식의 결과가 true가 나오는 동안 실행문을 반복한다. for문이 끝나는 위치는 중괄호({})가 아니라 조건식이다.- 증감식
for문의 실행 구문이 모두 수행된 후 닫힌 중괄호(})를 만나면 다음 번 반복을 위해 다시 이동하는 위치로 매회 반복이 수행될 때마다 호출된다.
중괄호 안의 실행 구문을 반복적으로 실행하는 반복 제어문으로 소괄호 안의 조건식이 true인 동안 반복이 지속되는 제어문이다.
(특정 조건을 만족할 때까지 계속해서 주어진 명령문을 반복 실행)
초기식; //필수는 아니지만 대부분 사용
while (조건식) { //while문 안으로 들어가는 유일한 입구, 생략 불가능
실행문1; //조건식이 true인 동안 실행
증감식; //필수는 아니지만 대부분 사용
}
실행 순서
1) 조건식을 검사하고 조건식이 true일 때 중괄호 안의 실행문 실행
2) 이후 닫힌 중괄호를 만나면 다시 조건식을 검사
3) 조건식이 거짓이 될 때까지 반복
4) 조건식이 거짓이 되면 while문 탈출
루프에 진입하기 전에 먼저 조건식부터 검사하는 반복 제어문이다.
초기식; //필수 문법은 아니지만 일반적으로 사용
do {
실행문; //실행 후 비교. 조건문이 false더라도 최소 1회 실행됨
증감식; //필수 문법은 아니지만 일반적으로 사용
} while (조건식); //문법 구조상 중괄호가 없으므로 세미콜론(;)으로 끝남
실행 순서
1) 일단 do 구문을 실행한 이후 조건식을 검사한다.
2) 조건식이 참이면 다시 do 구문을 실행하고, 거짓이면 제어문을 탈춘한다.
do{...} while(조건식);의 형태로, 마지막이 중괄호로 끝나지 않으므로 제어문들 중 유일하게 세미콜론(;)을 붙인다.
do-while문은 while문과 매우 비슷한 반복 제어문으로, 조건식의 검사와 반복 실행의 순서에만 차이가 있다.
while문은 조건을 먼저 검사하기 때문에 조건식에 맞지 않으면 반복 수행이 한 번도 일어나지 않는다. 반면 do-while문은 {} 안의 문장을 무조건 한 번 수행한 후에 조건식을 검사한다. (조건이 만족하는지 여부를 마지막에 검사함)
중괄호 안의 문장을 반드시 한 번 이상 수행해야 할 때는 while문 대신 do-while문을 사용한다.
배열과 컬렉션의 모든 요소를 참조하기 위한 반복문이다.
for (타입 변수이름 : 배열이나컬렉션이름) {
배열의 길이만큼 반복적으로 실행하고자 하는 명령문;
}
int[] arr = new int[]{1, 2, 3, 4, 5};
for (int e : arr) {
System.out.print(e + " ");
}
1 2 3 4 5 //실행 결과
일반적으로 조건식의 검사를 통해 루프로 진입하면, 다음 조건식을 검사하기 전까지 루프 안에 있는 모든 명령문을 실행한다.
하지만 continue 문과 break 문은 이러한 일반적인 루프의 흐름을 사용자가 직접 제어할 수 있도록 도와준다.
루프 내에서 사용하여 해당 반복문을 완전히 종료시킨 뒤, 반복문 바로 다음에 위치한 명령문을 실행하는 제어 키워드이다.
레이블을 이용해 이중 for문 한 번에 탈출하기
out: //레이블 위치 지정(break하고자 하는 반복문 앞에 레이블 표기)
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if (j == 3)
break out; //out레이블이 달린 반복문 탈출
System.out.println(i + ", " + j);
}
} //break out으로 탈출하는 중괄호
((0,0),(0,1),(0,2)) //실행 결과
루프 내에서 사용하여 해당 루프의 나머지 부분을 건너뛰고, 바로 다음 조건식의 판단으로 넘어가게 해주는 제어 키워드이다.
반복문 안에 continue만 단독으로 사용된 예
for(int i = 0; i < 10; i++) {
continue;
System.out.println(i); //오류(unreachable code)
} //continue가 대체하는 중괄호
continue를 만나면 아래쪽에 실행할 코드가 남아 있더라도 마치 닫힌 중괄호를 만난 것처럼 다음 반복을 위해 증감식으로 이동하므로 위 예제에서는 출력 구문에 절대 도달할 수 없다. → 오류 발생
반복문 안에 if문과 함께 continue가 사용된 예
for(int i = 0; i < 10; i++) {
if(i == 5) { //if문으로 continue를 실행할 조건 설정
continue;
}
System.out.println(i); //0, 1, 2, 3, 4, 5, 6, 7, 8, 9
} //continue가 대체하는 중괄호
continue문은 단독으로 사용되는 경우는 거의 없으며, if문과 함께 사용해 특정 조건에서 실행 구문을 건너뛰고자 할 때 사용한다.
<이재환의 자바 프로그래밍 입문>
<Do it! 자바 완전 정복>
<Do it! 자바 프로그래밍 입문>
http://www.tcpschool.com/java/java_control_condition