JAVA/공부

제어문

GaeGim 2022. 6. 24. 00:42
반응형

제어문 : 프로그램 실행 순서를 사용자가 임의로 바꿀 수 있게 해주는 것

 

선택 제어문 - if, switch

반복 제어문 - while, for, do~while

제어 키워드 : break, continue

 


 

  • if문

· 단일 if문

조건식이 true일 때 중괄호 안을 실행하고 조건식이 false일 때는 중괄호 안을 실행하지 않는다.

if(5>3) {
	System.out.println("출력"); 	//실행됨
}

boolean bool=false;
if(bool) {
	System.out.println("출력1");	//실행 안 됨
}

 

중괄호 미작성 시 하나의 실행구문만 포함시킨다.

if(1>2) {	//중괄호 미 작성 시 컴파일러가 자동으로 하나의 구문 포함시킴 
	System.out.println("출력1"); }	//출력 안 됨
	System.out.println("출력2");	//출력됨

 

 

· if-else문

삼항 연산자와 상호 변경이 가능하다.

int a=5, b=0;
if(a>5) {
	b=10;
} else
	b=20;
System.out.println(b);	//20

int c=5, d=0;
d = (c>5) ? 10 : 20;
System.out.println(d);	//20

 

 

· if-else if-else문

N개의 조건식과 N+!개의 중괄호 포함.

else if문은 갯수 상관없이 추가가 가능하고 소괄호가 있어 조건식을 추가한다. else-if문을 생략 시 if-else문이 된다.

중괄호가 몇 개가 있든, 처음으로 조건식이 true가 나오는 중괄호 블록을 만나면 해당 블록의 중괄호를 실행하고 if문을 탈출한다.

-> 처음 참이 되는 블록만 실행된다.

-> 다수의 참이 나올 수 있어 순서에 유의하거나 유일한 참이도록 조건식을 만들어 줘야 한다.

 

 

 

  • switch문

점프 위치 변수값에 따라 특정 위치(case)로 이동해 구문을 실행하는 선택 제어문.

점프할 수 있는 위치) case 위칫값 :

default: 구문은 위칫값이 없을때 점프하는 위치로,  if문의 else구문과 비슷한 기능을 한다. 생략가능하다.

break;문이 없으면 위칫값으로 이동 후 차례대로 구문을 다 실행한다.

※break는 if문을 제외한 가장 가까운 중괄호를 탈출하는 키워드.

 

중복 코드 작성법

-> case구문 마다 break 키워드를 붙이는 대신 하나의 실행문에 여러 개의 case를 지정한다.

int num=8;
switxh(num) {
    case 10:
    case 9:
    case 8:
    case 7:
    	System.out.println("Pass");
    default:
    	System.out.println("Fail");
}

 

if문은 조건식에 다양한 비교 연산자, 논리 연산자를 쓸 수 있고,

switch문은 위칫값으로 정수, 문자, 문자열만 사용할 수 있다.

효율성의 차이는 있지만, if문과 switch문은 상호 변환할 수 있다.

 

int a=8;

switch(a) {
    case 10:
    case 9:
   	 System.out.println("A");
   	 break;
    case 8:
   	 System.out.println("B");
   	 break;
     default:
    	 System.out.println("D");
}

if(a>=9)
	System.out.println("A");
else if(a==8)
	System.out.println("B");
else 
	System.out.println("D");

 

- 둘의 성능 차이

전체적인 속도 차는 거의 없지만 결과에 따른 속도 차는 있을 수 있다.

if문은 A를 출력할 때 1번만 검사하지만 B, D를 출력할 땐 여러 번 검사해야 하기 때문이다.

switch문은 어떤 것을 출력하든 한 번의 점프를 수행하기 때문에 모든 출력 속도가 동일하다는 장점이 있다.

하지만.. 엄청난 데이터를 처리하는 것이 아니라면 어느 것을 사용해도 무관하다.

 

 

 

  • for문

실행구문을 반복적으로 수행하는 반복 제어문으로 반복 횟수가 정해질 때 사용된다.

-> 몇 번 반복하는 지 유추할 수 있어야 한다.

 

이중 for문 : for문 안 for문

삼중 for문 : for문 안 for문 안 for문

다중 loof : 중첩된 여러 개의 for문

 

for(초기식; 조건식; 증감식) { 실행구문 }

컴파일러는 문법적으로 for문 소괄호에 세미콜론이 2개 있는 지만 확인한다.

-> 여러 형태 특수한 for문 형태가 나올 수 있다.

 -조건식 생략 -> 컴파일러가 자동으로 true 입력 -> 무한루프 -> break 키워드 삽입해 특정 조건 만족 시 종료시킴

 

 

※ 무한 루프 코드 다음에 어떤 실행 코드 작성 시 이클립스는 바로 문법 오류 발생시킨다.

-> unreachable code를 작성했기 때문이다.

for( ; ; ) {
	System.out.println("출력");
}
System.out.println("출력1");	//오류 발생

for( ; false; ) {
	System.out.println("출력2");	//오류 발생
}

 

 

초기식 : for문이 시작할 때 딱 한 번 실행되고 다시 실행되지 않는다. for문 안에서만 쓰는 변수를 여기서 초기화한다.

변수를 for문 밖에 선언하면 for문이 종료되도 사라지지 않는다. 변수값이 증감식에 의해 바뀌겠지만..

조건식 : 실행 구문에 들어가기 위한 출입구. true가 나오는 동안은 실행 구문이 계속 반복된다. false나오면 더 이상 반복 수행하지 않고 for문을 빠져나간다. for문이 끝나는 위치는 닫힌 괄호가 아닌 조건식이다.

증감식 : for문의 실행 구문이 모두 수행된 뒤 닫힌 중괄호를 만나면 다음 반복을 위해 다시 이동하는 위치로 매회 반복 수행마다 호출된다.

※ 초기식과 증감식은 쉼표를 이용해 여러 개를 동시에 표기할 수도 있다.

 

 

for문 실행 순서

 

 

이중 for문 실행 순서

 

 

 

  • while문

중괄호 안의 실행 구문을 반복적으로 실행하는 반복제어문으로, 소괄호 안의 조건식이 true인 동안 반복은 지속된다.

 

문법)

초기식;

while(조건식) {

     실행구문;

     증감식;

}

 

초기식 : 필수는 아니지만 대부분 사용

조건식 : while문 안으로 들어가는 입구로, 생략 불가

실행구문 : 조건식이 true인 동안 실행될 수 있음

 

※ 초기식과 증감식은 생략 가능

-> 초기식은 while문 실행 전에 정의돼야 하고 증감식은 중괄호 안에 있어야 for문과 동일 한 수행을 할 수 있다.

 

※ 초기식을 중괄호 안에 넣으면 매 반복마다 초기화돼 무한루프에 빠질 수 있다.

 

 

while문 실행 순서

 

 

· while문에 도달할 수 없는 코드를 작성해 오류가 발생하는 예

while(true) {
	System.out.println("출력");
}
System.out.println("출력1");		//오류 발생

while(false) {
	System.out.println("출력2");	//오류 발생
}

 

 

for문과 같이, 반복 횟수가 지정돼 있을 때도 사용 가능하다.

초기시그 조건식, 증감식을 모두 포함하고 있어야 한정 횟수만큼 수행할 수 있어

while문과 for문은 언제든 상호 변환이 가능하다.

 

 

  • for문과 while문 차이점 : 초기식과 증감식이 작성되는 위치, while문에선 조건식 생략 불가.

for문 : 중괄호 끝나고 증감문이 실행됨. while문 : 증가문 위치를 바꿀 수 있음.

 

 

 

while문은 for문과 달리 중첩된 while문의 초기문을 다시 실행하지 않을 수 있어서 생각한 것과 다르게 실행될 수 있다.

 

따라서 중첩 while문은 위 그림과 같이 수정하도록 한다.

 

 

 

 

 

  • do-while 반복 제어문

문법)

do{

     실행구문;

     증감식;

} while(조건식);

 

~while(조건식);의 형태로 마지막이 중괄호로 끝나지 않아, 제어문들 중 유일하게 세미콜론을 붙여야 한다.

 초기식과 증감식은 생략이 가능하다.

 

일단 do 구문을 한 번 실행하고 조건식을 검사한다.

-> 조건이 참이면 다시 do 구문 실행하고 false면 제어문을 탈출한다.

 

do-while문의 최소 반복 횟수 : 1번, while문의 최소 반복 횟수 : 0번이라

do-while문이 while문보다 무조건 한 번 더 실행한다고 생각할 수 있지만,

while문이 0번 반복할 때만 차이가 있다. -> do-while이 무조건 한 번 더 실행되는 것 아니다.

int a=0;

while(a<0) {		//실행 횟수 : 0
	System.out.println(a + " ");
  	a++;
}	

a=0;

do {
	System.out.println(a + " ");
   	a++;
} while(a < 0);		//실행 횟수 : 1

 

 

 

  • break

반복문에서 특정 조건을 만족할 때 반복문을 탈출하는 데에 사용하는 키워드.

break 하나당 for문 하나 탈출.

for(int i=0; i<10; i++) {		//3. i값이 조건식에 맞지 않아 밖 for문 종료
	for(int j=0; j<10; j++) {
    	if(j==3) {
        	i=100;		//1. break 실행 전 i값 변경
          	break;
        }
        System.out.println(i+", "+j);
    }		//2. 안쪽 for문 중괄호 탈출
}

 

 

break로 다중 반복문을 한 번에 탈출하는 자바의 공식적인 방법 : break + Lable 문법

(자바에서 콜론은 이동할 위치를 의미한다.)

out:					//레이블 위치 지정
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으로 탈출하는 중괄호

 

break out은 out 레이블이 위치한 바깥 for문을 탈출하란 의미.

 

 

 

  • continue 제어 키워드

반복 제어문의 닫힌 중괄호 역할을 하는 제어 키워드.

 

for문에서 continue 키워드는 continue 아래 실행문을 있어도 실행하지 않고 바로 증감식을 수행하게 하도록 하거나

while문에서는 조건식을 검사하도록 하게 한다.

 

 

반복문 안에 continue 단독 사용 시

for(int i=0; i<10; i++) {
	continue;
 	System.out.println(i);	//unreachable code -> 오류 발생
}

continue를 만나면 아래에 실행할 코드가 남아있어도 증감식으로 이동함으로,

출력 구문이 절대 도달할 수 없는 코드가 돼 실행할 수 없어 오류가 발생한다.

 

 

따라서 continue를 단독 사용하기 보다 if문과 함께 사용해, 특정 조건에서 실행구문을 뛰어넘을 때 사용하도록 한다.

위는 i가 짝수일 때 continue를 통해 실행구문을 뛰어넘게 했다.

 

 

continue도 break와 마찬가지로, 하나의 반복문에만 영향을 미친다.

continue도 continue + Lable 문법을 사용할 수 있고 해당 레이블이 붙은 반복문의 닫힌 중괄호 역할을 수행해 한 번에 여러 반복문을 수행할 수 있다.

 POS1:					//레이블 위치 지정
 for(int i=0; i<10; i++) {
 	for(int j=0; j<10; j++) {
    		if(j==3) {
        		continue POS1;	//POS1 레이블이 달린 반복문의 닫힌 중괄호 대체
        }
        System.out.println(i+", "+j);
    }
}					//continue POS1로 대체하는 중괄호

 

 

반응형

'JAVA > 공부' 카테고리의 다른 글

클래스 내부 구성 요소  (0) 2022.07.02
클래스와 객체  (0) 2022.07.02
배열 성적 처리 프로그램  (0) 2022.06.26
스택과 힙 영역  (0) 2022.06.23
JAVA 기초  (1) 2022.06.22