[java] 4.조건문과 반복문


조건문



조건문은 조건식과 문장을 포함하는 블록{}으로 구성되어 있으며,

조건식의 연산결과에 따라 실행할 문장이 달라져서 프로그램의 실행흐름을 변경할 수 있다.

조건문은 if문과 switch문, 두 가지가 있으며 주로 if문이 많이 사용된다.



if 문



if문은 가장 기본적인 조건문이며, 다음과 같이 ‘조건식’과 괄호 {}로 이루어져 있다.


if(조건식){
	//조건식이 참(true)일 때 수행될 문장들을 적는다.
}



자바에서 조건식의 결과는 반드시 true 또는 false이어야 한다는 것이 중요합니다.

다음은 if문에 대한 예제입니다.


image



if-else 문



if문의 변형인 if-else 문의 구조는 다음과 같습니다.


if(조건식){
	//조건식이 참(0이 아닌 값)일 때 수행될 문장들을 적는다.
}else{
	//조건식이 거짓(0)일 때 수행될 문장들을 적는다.
}



아까 작성했던 예제를 다시보죠!


if(input==0){
	System.out.println("0입니다.");
}

if(input!=0){
	System.out.println("0이 아닙니다.");
}



이것을 if-else문을 사용해서 다시 작성해보겠습니다.


if(input==0){
	System.out.println("0입니다.");
}else{
	System.out.println("0이 아닙니다.");
}



if-else 문을 사용한 것이 하나의 조건식만 계산하면 되므로 더 효율적이고 간단합니다!



if-else if문



if-else 문은 두 가지 경우 중 하나가 수행되는 구조인데,

처리해야할 경우의 수가 셋 이상인 경우에는 어떻게 해야할까요?

그럴 때는 한 문장에 여러 개의 조건식을 쓸 수 있는 if-else if 문을 사용하면 됩니다.


if(조건식1){
	//조건식1의 연산결과가 참일 때 수행될 문장들을 적는다.
}else if(조건식2){
	//조건식2의 연산결과가 참일 때 수행될 문장들을 적는다.
}else if(조건식3){
	//조건식3의 연산결과가 참일 때 수행될 문장들을 적는다.
}else{
	//위의 어느 조건식도 만족하지 않을 때 수행될 문장들을 적는다.
}



다음은 if-else if-else문을 이용한 예제입니다.


image



중첩 if문



if문의 블럭 내에 또 다른 if문을 포함시키는 것이 가능한데 이것을 중첩 if문이라고 부르며

중첩의 횟수에는 거의 제한이 없습니다.


if(조건식1){
	if(조건식2){
		//조건식 1과 조건식 2가 모두 true일 때 수행될 문장들
	}else{
		//조건식 1이 true이고, 조건식2가 false일 때 수행되는 문장들
	}
}else{
	//조건식1이 false일 때 수행되는 문장들
}



switch 문



if문은 조건식의 결과가 참과 거짓, 두 가지 밖에 없기 때문에 경우의 수가 많아질수록

else-if를 계속 추가해야하므로 조건식이 많아져서 복잡해지고, 여러 개의 조건식을 계산해야하므로

처리 시간도 많이 걸립니다.

이러한 if문과 달리 switch 문은 단 하나의 조건으로 많은 경우의 수를 처리할 수 있고,

표현도 간결하기에 알아보기 쉽습니다.

switch 문의 형식은 다음과 같습니다.


switch (조건식){
	case 값1 :
		//조건식의 결과가 값1과 같을 경우 수행될 문장들
		break; //조건문을 빠져나온다.
	case 값2 :
		//조건식의 결과가 값2와 같을 경우 수행될 문장들
		break;
	default :
		//조건식의 결과와 일치하는 case문이 없을 때 수행될 문장들
}



switch문에서 break문은 각 case문의 영역을 구분하는 역할을 하는데,

만일 break문을 생략하면 case문 사이의 구분이 없어지므로 다른 break문을 만나거나

switch 문 블록{}의 끝을 만날 때까지 나오는 모든 문장들을 수행합니다.

switch 문은 다음과 같은 제약조건이 있습니다.


<switch문의 제약조건>

1. switch문의 조건식 결과는 정수 또는 문자열이어야 한다.


2. case 문의 값은 정수 상수만 가능하며, 중복되지 않아야 한다.




final int ONE=1;

int num, result;

switch(result){
	case '1': //OK 문자 상수 (정수 상수 49와 동일)
	
	case ONE: //Ok 정수 상수
	
	case "YES": //OK 문자열 상수
	
	case num: //에러. 변수는 불가
	
	case 1.0: //에러. 실수도 불가
}




다음은 switch 문을 이용한 가위 바위 보 게임을 간단히 구현한 것입니다.


image



위의 코드에서 난수를 얻기 위해 Math.random()을 사용합니다.


Math.random() //0.0과 1.0 사이의 double 값을 반환



반복문



반복문은 어떤 작업이 반복적으로 수행되도록 할 때 사용되며,

반복문의 종류로는 for문과 while문, 그리고 while문의 변형인 do-while문이 있습니다.



for문



for문은 반복 횟수를 알고 있을 때 적합한 반복문입니다.

구조가 복잡하지만 직관적이라 오히려 더 이해하기 쉽습니다.

for문의 구조는 다음과 같습니다.


for(초기화;조건식;증감식){
	//수행될 문장
}



for문은 제일 먼저 초기화가 수행되고, 그 이후부터는 조건식이 참인 동안

조건식->수행될문장->증감식 순서로 계속 반복됩니다.

그러다가 조건식이 거짓이 되면 for문 전체를 빠져나오게 됩니다.

예를 들어 “hello”라는 문장을 5번 반복하고 싶으면, 다음과 같이 코드를 작성합니다.


image



다음과 같이 초기화 부분과 증감식 부분을 쉼표를 이용해서 두 문장 이상을 하나로 연결해서 쓸 수 있습니다.


for(int i=1,j=10;i<=10;i++,j--){...}

//i는 1부터 10까지 1씩 증가하고

//j는 10부터 1까지 1씩 감소한다.



또한, 초기화, 조건식, 증감식 부분을 생략도 가능합니다.


for(;;){...} //초기화, 조건식, 증감식 모두 생략. 조건식은 참이 된다.



중첩 for문



if문에 또 다른 if문을 넣을 수 있는 것처럼,

for문 안에 또 다른 for문을 포함시키는 것도 가능합니다.

다음은 중첩된 for문에 대한 예제입니다.


image




image



향상된 for문



JDK1.5부터 배열과 컬렉션에 저장된 요소에 접근할 때 기존보다 편리한 방법으로 처리할 수 있도록

for문의 새로운 문법이 추가되었습니다.


for(타입 변수명: 배열 또는 컬렉션){
	//반복할 문장
}



아직 배열을 배우지 않았지만 향상된 for문이 있다 정도만은 기억해주시길 바랍니다.

밑에 코드는 향상된 for문을 사용하기 전 코드입니다.


int[] arr={10,20,30,40,50}; //int 형 배열 선언

for(int i=0;i<arr.length;i++){
	System.out.println(arr[i]); //배열의 요소 출력
}



향상된 for문을 적용한 코드입니다.


for(int tmp: arr){
	System.out.println(tmp); //arr의 배열 요소를 차례대로 tmp에 전달
}



while 문



for문에 비해 while 문의 구조는 간단합니다.

if문처럼 조건식과 블록 {} 만으로 이루어져 있습니다.

if문과 달리 while 문은 조건식이 참인 동안, 즉 조건식이 거짓이 될 때까지 블록{} 내의 문장을 반복합니다.


while(조건식){
	//조건식의 연산결과가 참(true)인 동안, 반복 될 문장들을 적는다.
}



만일 처음부터 조건식이 거짓이면 while문이 한번도 수행되지 않을 수도 있습니다.

다음은 for문을 while문으로 변경한 것입니다.


//for 문
//초기화, 조건식, 증감식
for(int i=1;i<=10;i++){
	System.out.println(i);
}




//while 문
int i=1; //초기화

while(i<=10){ //조건식
	System.out.println(i);
	i++; //증감식
}



초기화와 조건식, 증감식이 분리되어 있기에

만일 반복을 할 때 초기화와 증감식이 없다면 while문이 for문보다 더 적합합니다~!

주의할 점이 while문은 조건식을 생략할 수 없습니다.

따라서 무한 루프문을 작성할 때는 다음과 같이 작성합니다.


while(true){ //항상 참이기에 무한 루프
	//반복할 문장
}



다음은 while 문을 이용한 코드입니다.


image



do-while 문



do-while문은 while 문의 변형으로 기본적인 구조는 while문과 같으나 조건식과 블록{}의 순서를 바꿔놓은 것입니다.

while 문과 다르게 최소한 한번은 무조건 수행될 것이 보장됩니다.


do{
	//조건식의 연산결과가 참일 때 수행될 문장들을 적는다.
}while(조건식);



그리 많이 쓰이지는 않지만, 다음의 예제처럼 반복적으로 사용자의 입력을 받아서 처리할 때 유용합니다.


image



break 문



break문은 switch문에서 나왔었는데 자신이 포함된 가장 가까운 반복문을 벗어나는 기능을 합니다.


int i=0,sum=0;

while(ture){
	if(sum>100)
		break; //break문이 실행되면 while 문을 벗어남
	
	i++; //break문 실행되면 실행 안 됨
	sum+=i; //break문 실행되면 실행 안 됨
}



위와 같이 무한루프문에는 항상 조건문과 break문을 같이 사용해야 합니다.

안 그러면 무한루프에서 빠져나올 수 없기 때문입니다.



continue 문



continue문은 반복문 내에서만 사용될 수 있으며, 반복이 진행되는 도중에 continue문을 만나면

반복문의 끝으로 이동하여 다음 반복으로 넘어갑니다.

전체 반복 중에 특정조건을 만족하는 경우를 제외하고자 할 때 유용합니다.


//3의 배수인 것은 제외하고 출력

for(int i=0; i<=10; i++){
	if(i%3=0)
		continue; // 조건식이 참이 continue문이 수행되면 블럭의 끝으로 이동한다. 
		//break문과 달리 반복문을 벗어나지 않는다.
	System.out.println(i);
}



이름 붙은 반복문



break 문은 근접한 단 하나의 반복문만 벗어나기 때문에, 여러 개의 반복문이 중첩된 경우

break문으로 중첩 반복문을 완전히 벗어날 수 없습니다.

이 때는 중첩 반복문 앞에 이름을 붙이고 break 문과 continue 문에 이름을 지정해 줌으로써

하나 이상의 반복문을 벗어나거나 반복을 건너뛸 수 있습니다.


image