본문 바로가기
프로그래밍/Java

Java 제어문(조건문 if, switch case)

by 브이몬 2021. 8. 14.

◆ 제어문

  • {} 불럭이라고 한다. 여러 문장을 묶어준다.
  • 제어문은 특정 문장을 건너뛰게도 하고 특정 문장을 반복 실행하거나 프로그램의 흐름을 조절하는 역할.
    구 분 제어문
    선택문 if 문
    if else 문
    if else if 문
    switch case 문
    반복문 for 문
    while 문
    do while 문
    보조 제어문 break 문
    continue 문

◆ 조건문

1. if 문

문자 1;                             //문장1을 수행하고
if(조건문){                         //if문 조건문을 검사하여 참이면
    문장2;                          //문장2를 수행하고 문장3을 수행한다.
}                                     //거짓이면 문장2를 건너뛰고 문장3을 수행한다.
문장3;                              //문장2 쪽에 문장이 1개이면 { }를 생략할 수 있다.
                                      //{}가 없으면 ;으로 끝나는 한 문장만 수행한다.

 

 

 

 

 

 

 

 

 

// 절대값 구하기
int x = -5;
if(x < 0)
  x = -x;
System.out.println("절대값=" + x);         //절대값=5

 

2. if~else문

  • 참일 때와 거짓일 때 각각 다른 문장을 수행하도록 지정할 수 있다.
문장1;                                //문장 1을 수행.
if(조건문){                           //조건문 검사 결과가 참이면
    문장2;                            //문장2를 수행하고 거짓이면
} else {                               //문장3을 수행하고 문장4를 수행한다.
    문장3;
}
문장4;

 



 

 

 

 

 

 

int x = 5;

if(x % 2 == 1)
  System.out.println(x + "는 홀수입니다.");
else
  System.out.println(x + "는 짝수입니다.");​

 

3. 다중 if~else문

  • 여러 경우에서 하나의 처리를 선택할 경우
if(조건문1){                      //if(조건문1)이 참이면 문장1을 수행하고 if문 밖에 다음 문장을 수행한다.
    문장1;                         //거짓일 경우 조건문2를 검사해 참이면 문장2를 수행하고 if문 밖에 다음 문장 수행.
}else if(조건문2){                //조건문2도 거짓이면 조건문3을 검사한다. 이런 식으로 얼마든지 조건에 만족하지 
    문장2;                         //않을 경우 새로운 조건을 제시할 수 있다.
}else if(조건문3){
    문장3;
}else{                              //else{} 생략 가능하다. default condition이라고 한다.
    문장 n;
}
다음 문장;

 

 

 

 

 

 

 

 

 

 

 

int score = 75;

if(score>=90){
  System.out.println("A학점 입니다.");
}else if(score>=80){
  System.out.println("B학점 입니다.");
}else if(score>=70){
  System.out.println("C학점 입니다.");
}else if(score>=60){
  System.out.println("D학점 입니다.");
}else{
  System.out.println("F학점 입니다.");
}

//C학점 입니다.

 

4. 중첩 if문

  • if문의 블록 내에 또 다른 if문 포함. 중첩의 횟수에는 거의 제한이 없다.
if(조건문1){                      //if(조건문1)이 참이면 문장1을 수행하고 
    문장1;                         
    if(조건문2){                 //if(조건문2)를 수행해 참이면 문장2를 수행하고 거짓이면 문장3을 수행한다. 
        문장2;                       
    }else{
        문장3;
    }
}else{                              //else{} 생략 가능하다. default condition이라고 한다.
    문장 4;
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5. switch - case 문

  • 하나의 조건식으로 많은 경우의 수를 처리할 수 있고 간결해서 알아보기 쉽다.
  • switch문은 참이나 거짓의 결과를 반환하는 논리식이 아닌 정수식에 따라 분기.
  • if - else if - else문을 사용할 때 복잡하고 번거로운 부분을 가독성 좋게 구현.
  • 비교 조건이 특정 값이나 문자열인 경우 사용
  • break문을 사용하여 각 조건이 만족되면 switch블록을 빠져나오도록 한다.
  • 자바 14부터 좀 더 간결해진 표현식이 지원된다.(break 사용하지 않음)
switch(정수식){                   //정수식에는 변수가 올 수도 있다.
    case 정수값1 :                //switch문은 (정수식)의 결과 값과 case 다음의 정수 값이 일치하는 것을 찾아서
        문장1;                       //해당되는 행의 문장을 수행한다.
        break;
    case 정수값2:                  //case문의 정수 값은 각각 달라야 하며 case문의 정수 값의 순서는 크기의 순서와
        문장2;                       //상관없이 임의의 순서로 나타내도 상관없다.
        break;
    ....                                //case문의 값이 switch문의 정수식과 일치하는 것이 없을 경우에 수행할 문장을 
    case 정수값n:                 //기술하는 default가 있으면 이는 생략 가능하다.
        문장n;
        break;                       //break문은 각 case문의 영역을 구분하는 역할을 하는데 break문을 생략하면 
    default:                         //case문 사이의 구분이 없어지므로 다른 break문을 만나거나 switch문{} 블록의
        문장n+1;                   //끝을 만날 때까지 나오는 문장을 모두 수행한다.
}
                                     
//따라서, (정수식) or 변수를 case의 값과 비교하여 같은 값을 갖는 case구문의 실행문을(문장) 실행되고 break문을 만나 전체 switch문을 종료하고 빠져나오게 된다. 같은 값을 갖는 case가 없으면 default구문의 실행문이 실행된다.

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

case '1' :        //문자 상수
case ONE :      //정수 상수
case "YES" :     //문자열 상수

case num :      //error 변수 불가.

case 1.0 :        //error 실수 불가.

 

 

  • case문에서 case와 정수 부분에 공백이 없으면 논리 오류가 발생할 수 있으므로 주의한다.
    • case 3: 대신 공백 없이 case3:이라고 붙이면 case문이 아닌 레이블을 생성한 것으로 취급하여 논리 오류가 발생.
int score = 75;

switch(score/10){
  case 10:
    System.out.println("A학점입니다.");
    break;
  case 9:
    System.out.println("A학점입니다.");
    break;
  case 8:
    System.out.println("B학점입니다.");
    break;
  case 7:
    System.out.println("C학점입니다.");
    break;
  case 6:
    System.out.println("D학점입니다.");
    break;
  default :
    System.out.println("F학점입니다.");
}
//C학점입니다.

 

 

int score = 75;

switch(score/10){
  case 10:                                           //break문을 생략
  case 9:                                            //case 10: case9: 수행할 문장이 동일
    System.out.println("A학점입니다.");              //10과 9일때 A학점이다. 
    break;
  case 8:
    System.out.println("B학점입니다.");
    break;
  case 7:
    System.out.println("C학점입니다.");
    break;
  case 6:
    System.out.println("D학점입니다.");
    break;
  default :
    System.out.println("F학점입니다.");
}
//C학점입니다.

 

6. Java14부터 지원되는 Switch Expression

  • : 대신 간단하게 쉼표(,)로 조건 구분하고 ->를 쓴다.
  • 문장이 여러 개인 경우 {}를 써준다.
  • switch문이 끝나면 ;을 써준다. 문장에 끝을 알려주는 것이다.
  • 식으로 표현하여 반환 값을 받을 수 있다. 리턴 값이 없는 경우 오류가 생김.
  • yield 키워드 사용(return 같은 개념, 반환 값을 yield로 받는다.)
public static void main(String[] args) {

		Scanner scanner=new Scanner(System.in);
		System.out.print("월을 입력:");
		int month=scanner.nextInt();
		
		String season=switch(month) {
			case 3, 4, 5 ->{
				System.out.println("현재의 계절은 봄입니다.");
				yield "봄";
			}
			case 6, 7, 8 ->{
				System.out.println("현재의 계절은 여름입니다.");
				yield "여름";
			}
			case 9, 10, 11 ->{
				System.out.println("현재의 계절은 가을입니다.");
				yield "가을";
			}
			case 12, 1, 2 ->{
				System.out.println("현재의 계절은 겨울입니다.");
				yield "겨울";
			}
			default ->{
				System.out.println("존재하지 않는 달입니다.");
				yield "존재하지 않는 달";
			}
		};
		System.out.println(month+"월은 "+season+"입니다.");
}

 

댓글