[Java] 제어문

sobam·2022년 10월 23일
0

자바

목록 보기
13/18
post-thumbnail

📔 학습한 내용을 정리하기 위해 작성하는 게시글입니다.

제어문(control flow statements)이란?


자바 프로그램이 원하는 결과를 얻기 위해 프로그램의 순차적인 흐름을 제어할 경우에 사용하는 명령문이다.
프로그램의 처리 순서를 바꾸게 도와주며, 조건식과 실행 구문인 중괄호({})로 둘러싸여 있다. (실행문이 1개일 때는 생략 가능)

제어문 ⊃ 조건문, 반복문이 있다.

{중괄호} : 중괄호 영역을 블록이라고 한다.



조건문(conditional statements)


주어진 조건식의 결과에 따라 별도의 명령을 수행하도록 제어하는 명령문이다. 조건식의 결과가 'true인 경우'와 'false인 경우'의 두 가지 흐름을 만들어낼 수 있다.

1. if문, if-else문, if-else if-else문

1) if문

조건식 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-else문

조건식 하나와 중괄호 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문은 조건식의 결과값에 따라 둘 중 하나를 선택하는 제어문이므로 삼항 연산자와 상호 변환할 수 있다.

3) if-else if-else문

N개의 조건식과 N+1개의 중괄호를 포함하고 있는 형태로, if-else if-else의 구조이다. (중간의 else if문은 생략 가능 = if-else문)

  • else if문은 개수에 상관없이 추가 가능
  • 조건식을 검색할 때는 항상 위에서부터 검사를 수행하며, 처음으로 조건식이 true가 나오는 중괄호의 실행문을 실행하고 if문을 탈출한다.
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학점");
		}
	}
}

2. switch문

switch문은 점프 위치 변숫값에 따라 특정 위치(case)로 이동해 구문을 실행하는 선택 제어문이다. 점프할 수 있는 위치는 'case 위칫값:'으로 설정한다.

  • default: 문은 if 문의 else 구문과 비슷한 기능으로, 일치하는 위칫값이 없을 때 점프할 위치를 나타낸다. (생략 가능)
  • break: 문은 switch-case문의 실행 흐름을 중단시키고 해당 중괄호 밖으로 빠져나간다. (반복문과 switch문에서만 사용 가능)
  • if / else 문보다 가독성이 좋고, 컴파일러가 최적화를 쉽게 할 수 있어 속도가 빠른 편이다.
  • Java7부터 문자열을 직접 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");
		}
	}
}



반복문(iteration statements)


프로그램 내에서 똑같은 명령을 일정 횟수만큼 반복하여 수행하도록 제어하는 명령문이다.
어떤 조건이 성립하는 동안 반복 처리를 실행하는 제어문이다.

1. for문

실행 구문을 반복적으로 수행하는 반복 제어문으로, 일반적으로 반복 횟수가 정해질 때 주로 사용한다. 즉, for문의 구문을 보면 몇 번 반복하는지 유추할 수 있어야 한다.

for(초기식; 조건식; 증감식) {
	실행문; //조건식이 true인 동안 실행
}
  • 초기식
    for문이 시작될 때 딱 한 번만 실행되고 다시는 실행되지 않는다. for문 안에서만 사용할 변수는 주로 초기식에서 초기화한다.
  • 조건식
    조건식의 결과가 true가 나오는 동안 실행문을 반복한다. for문이 끝나는 위치는 중괄호({})가 아니라 조건식이다.
  • 증감식
    for문의 실행 구문이 모두 수행된 후 닫힌 중괄호(})를 만나면 다음 번 반복을 위해 다시 이동하는 위치로 매회 반복이 수행될 때마다 호출된다.
  • 반복문 중에서 가장 많이 사용하는 반복문이다.
  • for문을 자주 사용하는 이유는 반복 횟수를 관리할 수 있고, 가독성이 좋기 때문이다.
  • 배열과 함께 자주 사용한다.
  • for문의 요소는 생략 가능하다. (초기화식, 조건식, 증감식 생략, 요소 모두 생략 가능(무한 반복))
  • 컴파일러는 for문의 소괄호(()) 안에 2개의 세미콜론(;)이 있는지만 문법적으로 점검한다.
  • while문보다 간결하게 반복문을 표현할 수 있다.
  • 변수를 for문에 외부에 선언할 수 있다. 외부에서 변수를 선언하고 초기식에서 초기화만 했을 때, for문이 종료된 이후에도 변수는 사라지지 않는다.

2. while문

중괄호 안의 실행 구문을 반복적으로 실행하는 반복 제어문으로 소괄호 안의 조건식이 true인 동안 반복이 지속되는 제어문이다.
(특정 조건을 만족할 때까지 계속해서 주어진 명령문을 반복 실행)

초기식; //필수는 아니지만 대부분 사용
while (조건식) { //while문 안으로 들어가는 유일한 입구, 생략 불가능
	실행문1; //조건식이 true인 동안 실행
	증감식; //필수는 아니지만 대부분 사용
}

실행 순서
1) 조건식을 검사하고 조건식이 true일 때 중괄호 안의 실행문 실행
2) 이후 닫힌 중괄호를 만나면 다시 조건식을 검사
3) 조건식이 거짓이 될 때까지 반복
4) 조건식이 거짓이 되면 while문 탈출

  • 초기식은 while문 실행 이전에 정의되어야 하고, 증감식은 중괄호 안에 있어야 for문과 동일한 수행을 한다.
  • 초기식을 중괄호 안에 넣으면 무한 루프에 빠질 수도 주의해야 한다.

3. do-while문

루프에 진입하기 전에 먼저 조건식부터 검사하는 반복 제어문이다.

초기식; //필수 문법은 아니지만 일반적으로 사용
do {
	실행문; //실행 후 비교. 조건문이 false더라도 최소 1회 실행됨
    증감식; //필수 문법은 아니지만 일반적으로 사용
} while (조건식); //문법 구조상 중괄호가 없으므로 세미콜론(;)으로 끝남

실행 순서
1) 일단 do 구문을 실행한 이후 조건식을 검사한다.
2) 조건식이 참이면 다시 do 구문을 실행하고, 거짓이면 제어문을 탈춘한다.

  • do{...} while(조건식);의 형태로, 마지막이 중괄호로 끝나지 않으므로 제어문들 중 유일하게 세미콜론(;)을 붙인다.

  • do-while문은 while문과 매우 비슷한 반복 제어문으로, 조건식의 검사와 반복 실행의 순서에만 차이가 있다.

  • while문은 조건을 먼저 검사하기 때문에 조건식에 맞지 않으면 반복 수행이 한 번도 일어나지 않는다. 반면 do-while문은 {} 안의 문장을 무조건 한 번 수행한 후에 조건식을 검사한다. (조건이 만족하는지 여부를 마지막에 검사함)

  • 중괄호 안의 문장을 반드시 한 번 이상 수행해야 할 때는 while문 대신 do-while문을 사용한다.


4. Enhanced for문(JDK 1.5~)

배열과 컬렉션의 모든 요소를 참조하기 위한 반복문이다.

 for (타입 변수이름 : 배열이나컬렉션이름) {
	배열의 길이만큼 반복적으로 실행하고자 하는 명령문;
}
int[] arr = new int[]{1, 2, 3, 4, 5};
for (int e : arr) {
    System.out.print(e + " ");
}
1 2 3 4 5 //실행 결과 
  • 컬렉션 프레임워크와 배열에서 유용하게 자주 사용된다.
  • 명시한 배열이나 컬렉션의 길이만큼 반복되어 실행된다.
  • 루프마다 각 요소는 명시한 변수의 이름으로 저장되며, 명령문에서는 이 변수를 사용하여 각 요소를 참조할 수 있다.
  • Enhance for문 내부에서 사용되는 배열 요소는 배열 요소 그 자체가 아닌 배열 요소의 복사본이므로 Enhance for문에서 배열 요소의 값을 변경하여도 원본 배열에는 아무런 영향을 주지 못한다.
  • 요소를 참조할 때만 사용하는 것이 좋고, 요소의 값을 변경하는 작업에는 적합하지 않다.



제어 키워드


1. 루프의 제어

일반적으로 조건식의 검사를 통해 루프로 진입하면, 다음 조건식을 검사하기 전까지 루프 안에 있는 모든 명령문을 실행한다.

하지만 continue 문과 break 문은 이러한 일반적인 루프의 흐름을 사용자가 직접 제어할 수 있도록 도와준다.


2. break 제어 키워드

루프 내에서 사용하여 해당 반복문을 완전히 종료시킨 뒤, 반복문 바로 다음에 위치한 명령문을 실행하는 제어 키워드이다.

  • 루프 내에서 조건식의 판단 결과와 상관없이 반복문을 완전히 빠져나가고 싶을 때 사용한다.
  • 반복문에서 break문을 사용하면 그 지점에서 더 이상 수행문을 반복하지 않고 반복문을 빠져나온다.
  • break를 이용해 탈출하는 것은 if문을 제외한 가장 가까운 중괄호 하나

레이블을 이용해 이중 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)) //실행 결과

3. continue 제어 키워드

루프 내에서 사용하여 해당 루프의 나머지 부분을 건너뛰고, 바로 다음 조건식의 판단으로 넘어가게 해주는 제어 키워드이다.

  • continue문은 반복문과 함께 사용한다. 반복문 안에서 continue문을 만나면 이후의 문장은 수행하지 않고 for문의 처음으로 돌아가 증감식을 수행한다.
  • 반복 제어문의 닫힌 중괄호(}) 역할을 한다.
  • 보통 반복문 내에서 특정 조건에 대한 예외 처리를 하고자 할 때 자주 사용된다.
  • break문과 마찬가지로 Label문법 사용 가능

반복문 안에 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문과 함께 사용해 특정 조건에서 실행 구문을 건너뛰고자 할 때 사용한다.



🔔 Reference

<이재환의 자바 프로그래밍 입문>
<Do it! 자바 완전 정복>
<Do it! 자바 프로그래밍 입문>
http://www.tcpschool.com/java/java_control_condition

0개의 댓글

관련 채용 정보