4. 제어문


1. 조건문

  • 조건의 진위 여부에 따라 명령의 실행 여부를 결정하는 문장
  • 특정 조건이 만족될 때에만 실행하고 싶은 경우 사용

    a. if문

    1) 기본 if문

    if(조건식){
    문장;
    }

  • 조건을 만족하면 문장을 실행하고, 다음 라인을 수행한다.
  • if문의 조건을 만족하지 않으면 수행을 한번도 하지 않는다.
import java.util.*;
class If{
  public static void main(String[] args){
    
    System.out.println("숫자 1을 입력하세요");
    
    Scanner sc = new Scanner(System.in);
    int num = sc.nextInt();
    if (num==1){
      System.out.println("맞았습니다.");
    }
  }
}

2) if~else문

if(조건식){
문장1;
}else{
문장2;
}

  • 조건을 만족하면 문장1을 수행
  • 조건을 만족하지 않으면 문장 2 수행
import java.util.*;
class If{
  public static void main(String[] args){
    
    System.out.println("숫자 1을 입력하세요");
    
    Scanner sc = new Scanner(System.in);
    int num = sc.nextInt();
    if (num==1){
      System.out.println("맞았습니다.");
    }else{
      System.out.println("틀렸습니다.");
    }
  }
}

3) 다중if문

if(조건1){
문장1;
}else if(조건2){
문장2;
}else{
문장3;
}

  • 조건1이 참이면 문장 1 수행
  • 조건1이 거짓이면 조건2와 비교
  • 조건2 참이면 문장 2 수행
  • 조건2 거짓이면 문장3 수행
  • else if를 추가하여 조건을 추가할 수 있다.
import java.util.*;
class If{
  public static void main(String[] args){
    
    System.out.println("숫자를 입력하세요");
    
    Scanner sc = new Scanner(System.in);
    int num = sc.nextInt();
    if (num>0){
      System.out.println("양수");
    }else if (num==0){
      System.out.println("0");
    }else{
      System.out.println("음수");
    }
  }
}

4) 중첩if문

if(조건문){
if(조건문){
문장1;
}
}

  • 바깥쪽 if문이 참일 때 안쪽 if문을 수행한다.
import java.util.*;
class If{
  public static void main(String[] args){
    
    System.out.println("회원여부를 입력하세요 (1. 회원, 2. 비회원");
    Scanner sc = new Scanner(System.in);
    
    int mem = sc.nextInt();
    if (mem==1){
      System.out.printlnt("구매금액을 입력사헤요")
      int amount = sc.nextInt();
      if(amount >= 10000){
        System.out.println("만원 이상 구매 회원");
      }else{
        System.out.println("만원 이하 구매 회원");
      }
    }else{
      System.out.println("비회원");
    }
  }
}

b. switch문

switch(제어 변수){
case 값1 :
실행블록1;
break;
case 값2 :
실행블록2;
break;
default:
실행블록 default 처리;
break;
}

  • 여러 개의 case 구문을 사용하여 여러 조건 처리
  • case 다음에는 상수만 쓸 수 있다.
  • 제어변수 : byte,short,int,char 자료형의 값을 나타낼 수 있는 필드나 식
  • case 문 안에 있는 코드는 모두 한 묶음으로 {}로 블록을 묶을 필요는 없다.
  • 묶음의 끝을 표시하기 위해 break문이 있어야 한다.

case1:
case2:
case3:
실행구문
break;

  • case문을 비움으로 여러개의 case를 or로 연결할 수 있다.
  • case만 써두고 명령을 비워두면 아래쪽 case의 명령을 실행한다.
import java.util.*;
class If{
  public static void main(String[] args){
    
    System.out.println("숫자를 입력하세요");
    
    Scanner sc = new Scanner(System.in);
    int num = sc.nextInt();
    switch(num){
      case 1:
        System.out.println("one");
        break;
      case 2:
        System.out.println("two");
        break;
      default:
        System.out.println("그 외 숫자");
        break;
      }
  }
}

2. 반복문

a. for 문

  • 지정된 횟수만큼 반복해서 실행하는 구문
  • 시작값, 최종값, 증가값을 설정하여 반복적인 수행을 한다.

1) for문 기본

for(초기식;조건식;증감식){
반복명령;
}

for(int 1=0; i<3; i++){
System.out.println(i);
;

  • 시작과 동시에 초기식을 실행, i의 시작값을 확인한다.
  • 조건식과 비교하여 만족한다면 명령을 실행한다.
  • 증감식을 통해 i의 값을 변환한다.
  • 조건식과 비교하는 루프를 돌린다
class For{
  public static void main(String[] args){
    for(int=0; i<3; i++){             //0hi
      System.out.println(i+"hi");     //1hi
    }                                 //2hi
  }
}

2) for 문 활용 누적

class For{
	public static void main(String[] arge){
		int sum = 0;
		for(int i=1; i<=3; i++){
			sum += i;
			System.out.println("i="+i+", sum="+sum);
		}
		System.out.println("1~3까지의 합 : " +sum);
	}
}

3) 중첩 for문

public class ForOverlap {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		for(int i=0; i<3; i++){
			System.out.println("=====현재 i : "+i);		
			for(int j=0;j<2;j++) {
				System.out.println("현재 j : "+j);
			}//안for
		}//밖for
	}
}

4) for 무한루프

  • 조건식을 생략하면 무한루프
  • for(;;)
  • 빠져나올 때는 break문 사용
public class ForLoop {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		
		for(;;) {
			System.out.println("진행중");
			System.out.println("계속하시겠습니까 Y/N");
			String q = sc.nextLine();
			if(q.equals("N")) {
				sc.close();
				break;
			}
		}
	}
}

5) Enhanced for문(확장 for문)

  • 일정한 개수로 구성된 특정 집합의 요소들을 반복 처리 할 때 사용
  • 배열의 모든 요소를 순회할 때
  • 배열 또는 컬렉션(해시, 리스트 등)에 있는 데이터만큼 반복

    for(타입 변수 : 배열){
    > 명령문;
    > }

    > int[] number={10,20,30,40};   
    > for(int n : number){   
    > System.out.println(n);   
    > }   
     		- 제어변수 n 은 읽기 전용, 반복문 내에서 n의 값을 변경할 수 없다.
    
 class ForeachTest{
	public static void main(String[] args) {
		int[] num= {12, 43, 64, 56, 32};
		for (int n : num) {
			System.out.println(n);
		} // 배열 수만큼 반복, 12, 43, 64, 56, 32 출력
	} //main
} //class
String[] hobby= {"movie", "reading", "sports"};
	for (String s : hobby){
		System.out.println(s);
	}
 // movie, reading, sports 출력

b. while문

  • 특정 조건을 주고, 조건이 참인 동안에는 계속 반복
  • 반복 횟수가 가변적인 처리에 적합
  • while 내부 문장에서 조건이 거짓이 되도록 만들어 루프를 빠져나오게 해야한다.

1) while문 기본

초기값;
while(조건식){
명령문;
증감식;
}

class WhileTest{
	public static void main(String[] args){
	int n=1; // 초기식
	while(n<3){ // 조건식
		System.out.println(n); // 명령
		n++; // 증감식
	}
}

2) while 무한루프

-조건식에 true를 넣어주면 무한루프가 된다.

while(true){}

import java.util.Scanner;
public class WhileLoop {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		while(true) {
			System.out.println("양수입력!");
			int n = sc.nextInt();
			String rst = "";
			
			if (n>0) {
				rst = "양수";
			}else {
				rst = "음수";
			}
			System.out.println(rst+"\n");
		}
	}
}
  • 무한루프를 끝내기 위해서는 break문이 필요하다.
import java.util.Scanner;
public class WhileLoop {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		while(true) {
			System.out.println("정수입력! : 0이면 종료");
			int n = sc.nextInt();
			String rst = "";
			
			if (n==0) break;
			
			if (n>0) {
				rst = "양수";
			}else {
				rst = "음수";
			}
			System.out.println(rst+"\n");			
		}
	}
}

3) do-while문

do{
명령문;
증감식;
}while(조건식);

  • 조건보다 명령이 먼저온다.
  • 선 실행 후 조건 처리
  • 조건이 거짓이라도 실행구문을 최소 한번은 수행한다.
public class DoWhile {
	public static void main(String[] args) {
		int k=0;
		do {
			System.out.println(k);
			k++;
		}while(k<0);
	} // 조건에 맞지 않아도 0이 출력되는 것을 볼 수 있다.
}

3. 분기문

a. break

  • 반복문이나 switch문의 case를 벗어날 때 사용
  • 무한루프를 사용할 때 종종 사용
public class Break {

	public static void main(String[] args) {
		
		for(int i=1;i<=10;i++) {
			if(i==5) break;
			System.out.print(i);
		}
	}

}
  • 결과 : 1234
public class Break {
	public static void main(String[] args) {
		for(int i=0;i<3;i++) {
			for(int j=0;j<3;j++) {
				if(j==1) break;
				System.out.println("i="+i+", j="+j);
			}
		}
	}

}
  • 결과

    i=0, j=0
    i=1, j=0
    i=2, j=0

b. continue

  • 루프의 나머지 뒷 부분을 무시하고 반복문의 선두로 점프하여 루프를 실행
    • 다음 스텝으로 넘어간다
    • 다음 반복위치로 이동한다
    • 루프에서 특정 값에 대한 처리를 제외할 때 사용한다
public class Continue {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		for(int i=1;i<=10;i++) {
			if(i==5) continue;
			System.out.print(i);
		}
	}
}
  • 결과 : 1234678910
public class Continue {
	public static void main(String[] args) {
		for(int i=0;i<3;i++) {
			for(int j=0;j<3;j++) {
				if(j==1) continue;
				System.out.println("i="+i+", j="+j);
			}
		}
	}
}
  • 결과

    i=0, j=0
    i=0, j=2
    i=1, j=0
    i=1, j=2
    i=2, j=0
    i=2, j=2

c. return

  • 메서드의 실행을 종료하고 호출원으로 복귀한다
  • 메서드의 처리결과를 호출원으로 돌려주는 기능도 한다.

4. 라벨

  • 여러 반복문이 중첩되어 있을 때
  • 반복문 앞에 이름을 붙이고(Label)
  • break문과 continue문에 이름을 지정함으로써
  • 하나 이상의 반복문을 벗어나거나 반복을 건너뛸 수 있다.

Loop1 : for(int i=0; j<3; i++)

public class ContinueTest2 {
	public static void main(String[] args) {
		Loop1: for(int i=0; i<3; i++) {
			for(int j=0; j<3; j++) {
				if(j==1) {
					break Loop1;
				}
				System.out.println("i="+i+", j="+j);
			}
		}	
	}
}
  • 결과 : i=0, j=0
public class ContinueTest2 {
	public static void main(String[] args) {
		Loop1: for(int i=0; i<3; i++) {
			for(int j=0; j<3; j++) {
				if(j==1) {
					continue Loop1;
				}
				System.out.println("i="+i+", j="+j);
			}
		}		
	}
}
  • 결과

    i=0, j=0
    i=1, j=0
    i=2, j=0