본문 바로가기

JAVA/이것이 자바다

Chapter .04 조건문과 반복문

4.1 코드 실행 흐름 제어

자바 프로그램을 시작하면 main() 메소드의 시작 중괄호 { 에서 시작해서 끝 중괄호 } 가지 위에서 부터 아랠 ㅗ실행하는 흐름을 가지고 있따.

이러한 실행 흐름을 개발자가 원하는 방향으로 바꿀 수 있도록 해주는 것이 흐름 제어문이다.

흐름 제어문을 간단히 제어문 이라고 한다.

 

제어문은 조건식과 중괄호 { } 블록으로 구성 되는데, 조건식의 연산 결과에 따라 블록 내부의 실행 여부가 결정된다.

흐름 제어문을 사용 할 경우 다양한 실행 흐름이 생성된다는 것을 다음 그림에서 보여주고 있다.

제어문의 종류

 - 조건문

   • if, switch

 

 - 반복문

   • for, while, do-while

 

 - break, continue

 

 

 

4.2 조건문(if문, switch문)

4.2.1 if문

if문은 조건식의 결과에 따라 블록 실행 여부가 결정된다.

 

조건식에는 true 또는 false 값을 산출할 수 있는 연산식이나, boolean 변수가 올 수 있다.

조건식이 true면 블록을 실행하고 false이면 블록을 실행하지 않는다.

만약 조건식이 true가 될 떄 실행 해야 할 문장이 하나밖에 없다면 중괄호를 생략 할 수 있다.

 

 

4.2.2 if-else문

if문은 else 블록과 함께 사용되어 조건식의 결과에 따라 실행 블록을 선택한다.

if문의 조건식이 true 이면 if문의 블록이 실행되고, 조건식이 false이면 else 블록이 실행된다.

조건식의 결과에 따라 이 두개의 블록 중 어느 한 블록의 내용만 실행하고 전체 if문을 벗어나게 된다.

if-else문의 형식과 실행

 

4.2.3 if-else if-else문

조건문이 여러개인 if문도 있다.

처음 if문의 조건식이 false일 경우 다른 조건식 결과에 따라 실행 블록을 선택할 수 있는데, if 블록의 끝에 else if문을 붙이면 된다.

else if문의 수는 제한이 없으며 여러 개의 조건식 중 true가 되는 블록만 실행하고 전체 if문을 벗어나게 된다. 

else if 블록의 마지막에는 else 블록을 추가 할 수 있는데, 모든 조건식이 false일 경우 else 블록을 실행하고 if문을 벗어나게 된다.

 

복수의 조건식 두어 조건식을 만족하는 블록만 실행

 

4.2.4 중첩 if문

if문의 블록 내부에는 또 다른 if문을 사용 할 수 있다. 이것을 중첩 if문이라고 부르는데,

중첩의 단계는 제한이 없기 때문에 실행 흐름을 잘 판단해서 작성하면 된다.

 

사실 if문만 중첩 되는 것은 아니며, if문, for문, while문, do-while문은 서로 중첩시킬 수 있다.

예를 들어 if문 안에 for문을 중첩 시킬 수도 있고, while문에 if문을 중첩시킬 수도 있다.

중첩 if문의 실행 흐름

 

4.2.5 switch문

switch문은 if문과 마찬가지로 조건 제어문이다.

하지만 switch문은 if문처럼 조건식이 true일 경우에 블록 내부의 실행문을 실행하는 것이 아니라, 변수가 어떤 값을 갖느냐에 따라 실행 문이 선택 된다.

if문은 조건식의 결과가 true, false 두 가지밖에 없기때문에 경우의 수가 많아질수록 else-if를 반복적으로 추가해야 하므로 코드가 복잡해진다.

그러나 switch문은 변수의 값에 따라 실행문이 결정되기 때문에 같은 기능의 if문보다 코드가 간결하다.

switch문의 형식과 실행흐름

switch문은 괄호 안의 값과 동일한 값을 갖는 case로 가서 실행문을 실행시킨다.

만약 괄호 안의 값과 동일한 값을 갖는 case가 없으면 default로 가서 실행문을 실행시킨다.

default는 생략 가능 하다.

 

끝에 break;가 뭍어 있는 이유는 다음 case를 실행하지 말고 switch문을 빠져나가기 위해서이다.

break가 없다면 다음 case가 연달아 실행되는데, 이때에는 case 값과는 상관없이 실행된다.

 

 

4.3 반복문(for문, while문, do-while문)

반복문은 어떤 작업(코드들)이 반복적으로 실행되도록 할 때 사용되며, 반복문의 종류로는 for문, while문, do-while문이 있다. 

for문과 while문은 서로 변환이 가능하기 때문에 반복문을 작성할 때 어느 쪽을 선택해도 좋지만, for문은 반복 횟수를 알 수 있을 때 주로 사용하고, while문은 조건에 따라 반복할 때 주로 사용한다.

while문과 do-while문의 차이점은 조건을 먼저 검사 하느냐 나중에 검사하느냐일 뿐 동작 방식은 비슷하다.

 

 

4.3.1 for문

프로그램을 작성하다 보면 똑같은 실행문을 반복해야 하는 경우가 많이 발생한다.

 

int sum = 0;
sum = sum + 1;
sum = sum + 2;
sum = sum + 3;
sum = sum + 4;
sum = sum + 5;
System.out.println("1~5까지의 합 : "+sum);

상기 코드는 1부터 5까지으 ㅣ합을 구하는 것으로 5개의 실행문으로 해결했다.

하지만 1부터 100까지의 합을 구하는 코드를 같은 방법으로 작성한다면 코드 양이 엄청 늘어난다.

100개의 지루한 실행문이 필요하기 때문이다. 이러한 경우 for문을 사용하면 코드를 획기적으로 줄여준다.

 

int sum = 0;
for(int i=1;i<=100;i++){
	sum = sum + i;
}

System.out.println("1~100까지의 합 : "+sum);

100개의 실행문을 단 3라인으로 압축한 것이라고 볼 수 있는데, 반복문은 한 번 작성된 실행문을 여러 번 반복 실행 해주기 때문에 코드를 절감하고 간결하게 만들어준다.

for문은 주어진 횟수 만큼 실행문을 반복 실행할 때에 적합한 반복 제어문이다.

 

for문의 형식과 실행 흐름

 

for문이 처음 실행될때 ①초기화 식이 제일 먼저 실행된다.

그런 다음 ②조건식을 평가해서 true이면 ③실행문을 실행하고, false이면 for문 블록을 실행하지 않고 끝나게 된다.

블록 내부의 ③실행문이 모두 실행되면 ④증감식을 실행시키고 다시 조건②를 평가하게 된다.

평가 결과가 true이면 ③→④→②로 다시 진행하고, false이면 for문이 끝나게 된다.

 

어떤 경우에는 초기화식이 둘 이상 있을 수도 있고, 증감식도 둘 이상이 있을 수 있다.

이런 경우에는 쉼표( , )로 구분해서 작성하면 된다.

for(int i=0,j=0; i<=50 && j>=50; i++, j--){          }

초기화식에 선언 된 변수는 for문 블록 내부에서 사용되는 로컬 변수이다. 따라서 for문을 벗어나서는 사용할 수 없다.

int sum = 0;

int i =0;
for(i = 1; i <= 100; i++){
	sum += i;
}

System.out.println("1~" + (i-1)+"합 : "+sum);   //i 와 sum을 for문 블록 밖에서 선언 했기때문에 
                                                //사용이 가능하다.

 

for문을 작성할때 초기화식에서 루프 카운트 변수를 선언할 때 부동소수점 타입을 사용하지 말아야 한다.

public class ForFloatCOunterExample {
		public static void main(String[] args) {
			for(float x=0.1f; x<=1.0f; x+=0.1f) {
				System.out.println(x);
			}
		}
}

출력 결과

0.1은 float 타입으로 정확하게 표현할 수 없기 때문에 x에 더해지는 실제값은 0.1보다 약간 크다.

결국 루프는 9번만 실행된다.

 

for문은 또 다른 for문을 내포할 수 있는데, 이것을 중첩된 for문이라고 한다.

이 경우 바깥쪽 for문이 한 번 실행할 때마다 중첩된 for문은 지정된 횟수만큼 반복해서 돌다가 다시 바깥쪽 for문으로 돌아간다.

 

다음은 구구단을 출력하는 코드이다.

public class ForMultiplicationTableExample {
	public static void main(String[] args) {
		for(int m=2; m<=9;m++) {
			System.out.println("*** " + m + "단 ***");
			for(int n=0;n<=9;n++) {
				System.out.println(m+" X " + n + " = " + (m*n));
			}
		}
	}
}

구구단 출력

 

3라인의 바깥쪽 for문은 m이 2에서 9까지 변하면서 8번 반복 실행되는데, 바깥쪽 for문이 한 번 실행할 때마다 5라인의 중첩 for문은 n이 1에서 9까지 변하면서 9번 반복 실행한다.

즉 m = 2일때 n은 1~9까지 변하면서 2 X n = 2*n을 출력하게 된다.

 

4.3.2 while문

for문이 정해진 횟수 만큼 반복한다면, while문은 조건식이 true일 경우에 계속해서 반복한다.

조건식에는 비교 또는 논리 연산식이 주로 오는데, 조건식이 false가 되면 반복 행위를 멈추고 while문을 종료한다.

while문 작성 형식과 실행 흐름

while문이 처음 실행될 때 ①조건식을 평가한다. 평가 결과가 true 이면 ②실행문을 실행한다.

②실행문이 모두 실행되면 다시 조건식으로 되돌아가서 ①조건식을 다시 평가한다.

만약 조건식이 true라면 ②→①로 다시 진행하고, false라면 while문을 종료한다.

int i = 1;
while(i<=10){ //조건식이 true이면 실행된다.
	System.out.println(i);
    i++;
}

 

4.3.3 do-while문

- 조건 따라 반복 계속할지 결정할 때 사용하는 것은 while문과 동일

- 무조건 중괄호 { } 블록을 한 번 실행한 , 조건 검사해 반복 결정

 

do-while문은 조건식에 의해 반복 실행한다는 점에서는 while문과 동일하다.

while문은 시작할 때부터 조건식을 검사하여 블록 내부를 실행할지 결정하지만, 경우에 따라서는 블록 내부의 실행 문을 우선 실행시키고 실행 결과에 따라서 반복 실행을 계속할지 결정하는 경우도 발생한다.

이때 do-while문을 사용할 수 있다.

예를 들어 키보드로 입력받은 내용을 조사하여 계속 루플르 돌 것인지를 판단하는 프로그램이 있다고 가정하자. 

조건식은 키보드로 입력받은 이후에 평가되어야 하므로, 우선적으로 키보드로부터 입력된 내용을 받아야 한다.

 

작성시 주의할 점은 while()뒤에 반드시 세미콜론( ; )을 붙여 주어야 한다.

do-while문의 실행 흐름

do-while문이 처음 실행 될 때 ①실행문을 우선 실행한다.

①실행문이 모두 실행 되면 ②조건식을 평가하는데, 그 겨로가가 true이면 ① → ②와 같이 반복 실행을 하고, 조건식의 결과가 false이면 do-while문을 종료한다.

 

 

4.3.4 break문

break문은 반복문인 for문, while문, do-while문을 실행 중지할 때 사용된다.

또한 이전에 학습 한 switch문에서도 break문을 사용하여 switch문을 종료한다.

반복문에서 break문을 사용 할 때의 실행 흐름

while(true){
	int num = (int)(Math.random()*6) + 1;
    System.out.pritln(num);
    if(num == 6){
    	break;
    }
}

System.out.println("프로그램 종료");

break문은 대게 if문과 같이 사용되어 if문의 조건식에 따라 for문과 while문을 종료할 때 사용한다.

 

반복문이 중첩 되어 있을 경우 break문은 가장 가까운 반복문만 종료하고 바깥쪽 반복문은 종료시키지 않는다.

중첩된 반복문에서 바깥쪽 반복문까지 종료시키려면 바깥쪽 반복문에 이름(라벨)을 붙이고, "break 이름;"을 사용하면 된다.

 

반복문이 중첩된 경우

 - 반복문이 중첩되어 있을 경우 break; 문은 가장 가까운 반복문만 종료

 - 바깥쪽 반복문까지 종료시키려면 반복문에 이름(라벨)을 붙이고, “break 이름;” 사용

반복문이 중첩된 경우 Label을 이용하여 바깥쪽까지 빠져 나올 수 있다.

 

Outter:for(char upper='A'; upper<='Z'; upper++){
	for(char lower='a'; lover<='z'; lower++){
    	System.out.println(upper + "-" + lower);
        if(lower=='g'){
        	break Outter;
        }
    }
}

System.out.println("프로그램 종료");

 

 

4.3.5 continue문

countinue문은 반복문인 for문, while문, do-while문에서만 사용되는데, 블록 내부에서 continue문이 실행되면 for문의 증감식 또는 while문, do-while문의 조건식으로 이동한다.

continue문의 실행 흐름

continue문은 반복문을 종료하지 않고 계속 반복을 수행한다는 점이 break문과 다르다.

break문과 마찬가지로 continue문도 대개 if문과 같이 사용된느데, 특정 조건을 만족하는 경우에 continue문을 실행해서 그 이후의 문장을 실행하지 않고 다음 반복으로 넘어간다.

for(int i=1; i<=10; i++){
	if(i%2 != 0){ //2로 나눈 나머지가 0이 아닐경우, 즉 홀수일 경우
    	continue; 
	}
    System.out.println(i); //홀수는 실행되지 않는다.
}

 

'JAVA > 이것이 자바다' 카테고리의 다른 글

Chapter .06-1 클래스  (0) 2021.07.14
Chapter .05 참조 타입  (0) 2021.07.06
Chapter .03 연산자  (0) 2021.07.02
Chapter .02 변수와 타입  (0) 2021.07.01
Chapter .01 자바 시작하기  (0) 2021.06.28