[Java] 선택문과 제어문

8 분 소요

Java언어에서 flow control을 담당하는 선택문과 제어문을 공부해보자! :raising_hand:

:point_right: 과제 회고
자바의 기본적인 문법은 알고 있었지만, 속성식으로 빠르게 배웠기 때문에 깊이가 없다고 생각했다.
그래서 이번 과제의 목표를 다음과 같이 잡았다.

  • oracle documentation과 예제보고 키워드 사용법 제대로 이해하기
  • 새롭게 업데이트 된 부분 공부하기

문서와 예제를 통해 공부를 하니까, 이미 알고있던 키워드도 더 잘 활용하는 방법을 배울 수 있었다.
또 새롭게 알게 된 내용도 많았다.

  • forEach 메서드
  • 새로운 Switch문 사용법
    • ->yield문 사용

배운 내용을 잘 활용하면, 좀 더 가독성 있는 코드를 짤 수 있을 거 같다.



:pencil2: 목차

  1. if
  2. else
  3. else if
  4. switch
    • 4.1. Java SE 12 switch expressions (yield, ->)
  5. while
  6. do while
  7. for
    • forEach(->)
  8. break
  9. continue



:pushpin: 프로그램의 흐름을 제어하는 선택문과 제어문

Java언어에서 프로그램의 흐름을 제어하기 위해서, 다음과 같은 키워드를 사용할 수 있다.

  1. 조건 확인 : if, else, switch
  2. 반복 사이클 생성 : while, for
  3. 사이클 제어 : break, continue

keyword의 쓰임을 예제를 통해 살펴보자.

1. if : 표현식이 참인지 판별

기본적인 형식은 다음과 같다.

if (표현식 expression){
	명령문 statement;
}
  • if표현식이 참인지를 판별하는 키워드이다.
  • 만약 참이라면, 명령문이 실행된다.
  • 명령문이 여러줄 인 경우, block을 사용하여 모든 명령문를 묶어준다.

:point_right: 예제1 : 생성한 난수가 양수인지 판별하기

package javastudy;

import java.util.Random;

public class IFStatement {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Random r = new Random();
		int num = r.nextInt();
		
		if (num > 0) {
			//statement가 다수인 경우 블록을 사용
			System.out.println("생성한 ");
			System.out.println("난수가 ");
			System.out.println("양수입니다.");
			
		}
		
		//statement가 하나인 경우
		if (num > 0) System.out.println("양수라구요.");  
	}

}


2. else

else 키워드를 사용하여 간단한 분기문을 만들 수 있다.

if (expression){
	statement;
} else {
	statement2;
}
  • if 키워드의 표현식거짓인 경우, else 키워드 뒤의 명령문이 자동으로 실행된다.

:point_right: 예제2 : 생성한 난수가 양수인지 아닌지 판별하기

package javastudy;

import java.util.Random;

public class Branch {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Random r = new Random();
		int num = r.nextInt();
		
		if (num > 0) {
			
			System.out.println("양수입니다.");
			
		}
		else {
			
			System.out.println("양수가 아닙니다.");
			
		}

	}

}


3. else if

else if를 사용하면 좀 더 복잡한 분기문을 만들 수 있다.

if (expression){
	statement;
} else if (expression2){
	statement2;
} else if (expression3){
	statement3;
}	.
	.
	.
else {
	statement10;
}
  • else if 키워드는 앞의 조건들이 모두 거짓일 경우에 또 다른 조건을 시험할 수 있는 키워드이다.
  • ifelse와 달리, 여러번 사용하여 분기를 만들 수 있다.

:point_right: 예제3 : 생성한 난수가 양수인지 0인지 음수인지 판별하기

package javastudy;

import java.util.Scanner;

public class MultipleBranches {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		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("음수입니다.");
			
		}

	}

}
숫자를 입력하세요:
-3
음수입니다.

숫자를 입력하세요:
1
양수입니다.

숫자를 입력하세요:
0
0 입니다.


4. switch

switch는 선택을 제어하는 키워드이다.
여러가지 분기를 만들 수 있다는 점에서 if-else if와 유사하지만, 보다 간단하고 가독성이 높은 형태로 구현할 수 있다.

기본형태는 다음과 같다.

switch(domain){
	case 1:
		break;
	case 2:
		break;
		.
		.
		.
	default:
		break;
}
  • switch는 대괄호 안에 오는 변수표현식을 기준으로, 각 분기에 해당하는 값들을 비교한다.
  • case 키워드 뒤에 각 분기에 해당하는 값을 제시하고, 만약 변수 혹은 표현식해당 case의 값과 일치할 경우 case 뒤의 명령문이 실행된다.
  • 일치 하는 값이 없을 경우에는 아무 명령문도 실행되지 않거나, default 옵션을 사용해서 일치하는 case가 없을 경우 실행할 명령문을 지정해 줄 수 있다.
  • 각각의 분기는 break 키워드로 종료한다.
    • break문이 없다면, 해당 case하단에 모든 case들이 실행된 후 종료된다.
  • 여러가지 case를 그룹화하여 사용할 수 있다. (예제5)


:point_right: 예제4 : 국가 판별하기

package javastudy;

import java.util.Scanner;

public class SwitchStatement {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		System.out.println("도메인을 입력하세요:");
		
		Scanner sc = new Scanner(System.in);
		String domain = sc.nextLine().toLowerCase();
		
		switch (domain) {
		
			case "kr":
				System.out.println("대한민국");
				break;
				
			case "us":
				System.out.println("미국");
				break;
			
			case "cn":
				System.out.println("중국");
				break;
				
			case "jp":
				System.out.println("일본");
				break;
				
			default:
				System.out.println("알 수 없는 나라");
				break;
				
		}
	}
}

도메인을 입력하세요:
kr
대한민국

도메인을 입력하세요:
de
  없는 나라


:point_right: 예제5 : 어느 구인지 판별하기

package javabasic;  
  
import java.util.Scanner;  
  
public class SwitchDemo2 {  
    public static void main(String[] args){  
        Scanner sc = new Scanner(System.in);  
  System.out.print("동을 입력하세요>>");  
  String district = sc.nextLine();  
  
 switch(district.trim()){  
            case "방배동": case "양재동": case "서초동":  
            case "반포동": case "잠원동":  
                System.out.println(district + " in 서초구");  
 break; case "합정동": case "망원동": case "연남동":  
            case "아현동": case "서교동":  
                System.out.println(district + " in 마포구");  
 break; default:  
                System.out.println("unknown");  
  }  
    }  
}
동을 입력하세요>>망원동
망원동 in 마포구

동을 입력하세요>>서교동
서교동 in 마포구

동을 입력하세요>>대학동
unknown


4.1. Java SE 12 switch expressions

:orange_book: References

자바 12에 break대신 yield문arrow를 사용한 switch문이 소개되었다.

  • yield : case의 결과로 반환하고 싶은 값이 있을 경우. yield를 사용한다.
  • ->: :대신 사용할 수 있다.

:point_right: 예제6 : arrow 사용전후 코드 비교

	public enum Day { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY; }  
  
    	// 기존의 switch문  
	  int numLetters = 0;  
	  Day day = Day.WEDNESDAY;  
	  switch (day) {  
	        case MONDAY:  
	        case FRIDAY:  
	        case SUNDAY:  
	            numLetters = 6;  
				break; 
			case TUESDAY:  
	            numLetters = 7;  
				break; 
			case THURSDAY:  
	        case SATURDAY:  
	            numLetters = 8;  
				break; 
			case WEDNESDAY:  
	            numLetters = 9;  
				break; 
			default:  
	            throw new IllegalStateException("Invalid day: " + day);  
	  }  
	   System.out.println(numLetters);  
    
   	// arrow 사용한 switch문  
	  Day day = Day.WEDNESDAY;  
	  System.out.println(  
	            switch (day) {  
			        case MONDAY, FRIDAY, SUNDAY -> 6;  
					case TUESDAY                -> 7;  
					case THURSDAY, SATURDAY     -> 8;  
					case WEDNESDAY              -> 9;  
					default -> throw new IllegalStateException("Invalid day: " + day);  
			  }  
);


:point_right: 예제7 : yield문을 사용하여 정수값을 반환

    Day day = Day.WEDNESDAY;
    // numLetters case문 실행 결과값 numLetter에 삽입
    int numLetters = switch (day) {
        case MONDAY:
        case FRIDAY:
        case SUNDAY:
            System.out.println(6);
            yield 6; // `월, 금, 일`인 경우 6을 yield하여 numLetter변수 초기화
        case TUESDAY:
            System.out.println(7);
            yield 7;// `화`인 경우 7을 yield하여 numLetter변수 초기화
        case THURSDAY:
        case SATURDAY:
            System.out.println(8);
            yield 8; // `목,토`인 경우 8을 yield하여 초기화
        case WEDNESDAY:
            System.out.println(9);
            yield 9;
        default:
            throw new IllegalStateException("Invalid day: " + day);
    };
    System.out.println(numLetters);


5. while

while은 대괄호 안에 주어진 boolean값의 상태에 따라, 반복을 제어할 수 있는 키워드이다.

기본형태는 다음과 같다.

while (표현식 expression){
	명령문 statement;
}
  • 표현식이 참인 경우 명령문을 계속해서 수행한다.

:point_right: 예제8 : 더하기 연산 반복하기

package javastudy.fourth;

public class WhileStatement {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		int i = 0;
		int sum = 0;

		while (i < 10) {

			i++;
			sum += i;
			System.out.println("i : " + i);
			System.out.println("sum : " + sum + "\n");

		}
	}
}

i : 1
sum : 1

i : 2
sum : 3
...
i : 9
sum : 45

i : 10
sum : 55


6. do while

do whilewhile문의 방식을 살짝 수정해서 사용할 수 있는 키워드이다.

  • 명령문이 최소 1번 실행된 후에, while문 뒤에 있는 표현식을 확인하여 반복여부를 결정한다.

:point_right: 예제9 : 횟수 카운팅하기

package javastudy.fourth;

public class DoWhile {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		int count = 0;
		
		do {
			
			System.out.println("횟수 : " + count);
			
		} while (count != 0);//expression이 false이므로 break

	}

}
횟수 : 0


7. for

for은 반복할 횟수가 주어져 있을 경우 반복을 제어할 수 있는 키워드이다.

기본형태는 다음과 같다.

for (카운팅 변수 초기화; 표현식 ; 명령문) {
    statement;
}
//예시
for (int i = 0; i < 10 ; i++) {
    System.out.println(i);
}

for는 기본적으로 4단계의 과정을 거친다.

변수 초기화 -> 표현식 참/거짓 확인 -> statement 실행 -> 괄호 안의 statement 실행

  1. int i = 0 : 카운팅 변수 i를 0으로 초기화
    • 이 단계는 오직 한번만 시행된다.
  2. i < 10 : 해당 조건이 참인지를 판별한다.
    • 참일 경우 다음 단계로 넘어가고,
    • 거짓일 경우 반복문에서 나간다.
  3. System.out.println(i) : for가 감싸고 있는 명령문을 실행한다.
  4. i++ : 괄호 안의 변수 i를 1 증가시키는 명령을 시행한다.

2단계의 조건이 거짓이 될 때까지 시행을 반복한다.

:point_right: 예제 10 : 배열 원소 출력하기

package javastudy.fourth;

public class ForStatement {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		String[] ch = { "내", " ", "이", "름", "은", " ", "이", "효", "리", "\n" };

		for (int i = 0; i < ch.length; i++) {

			System.out.print(ch[i]);

		}

		System.out.print("거꾸로 해도 ");

		for (int i = ch.length - 1; i >= 0; i--) {

			System.out.print(ch[i]);

		}

	}

}

 이름은 이효리
거꾸로 해도 
리효이 은름이 


괄호 안에 2개 이상의 명령문을 사용할 수도 있다

:point_right: 예제 11 : 난수의 합 구하기

  • for문의 각 시행마다 i++sum += num 연산을 함께한다.
  • block안에 sum을 구하는 명령문을 따로 넣을 필요 없이, 괄호 안에서 연산할 수 있다.
package javastudy.fourth;

import java.util.Arrays;
import java.util.Random;

public class ForStatement2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Random r = new Random();

		int[] values = new int[10];
		int num;
		int sum = 0;

		for (int i = 0; i < 10; i++, sum += num) {// i++, sum += num

			num = r.nextInt(10);// 10 아래의 난수를 생성
			values[i] = num;// 배열의 각 방에 초기화

		}

		System.out.println(Arrays.toString(values));
		System.out.println("합은 " + sum + "입니다");

	}

}

[6, 8, 5, 7, 2, 8, 2, 2, 0, 5]
합은 45입니다


배열의 원소를 하나씩 빼오는 형태로 사용할 수도 있다.

:point_right: 예제 12 : 배열 원소 출력하기

package javastudy.fourth;

public class ForStatement3 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		String[] str = { "내", " ", "이", "름", "은", " ", "이", "효", "리", "\n" };

		for (String s : str) {

			System.out.print(s);

		}

	}

}


(추가1) 무한루프

// infinite loop
for ( ; ; ) {
    
    // your code goes here
}

(추가2) forEach 메서드

// 기존의 forEach문
for (String name : names) {
	System.out.println(name);
}
// arrow를 사용하는 새로운 forEach 함수
names.forEach( name -> { // name 배열을 순회하며 꺼내온 값을 `name` 변수에 삽입하고, 매 시행마다 블럭을 실행
	System.out.println(name);
});


8. break

break는 반복을 종료할 수 있는 키워드이다.

  • while, for, switch와 함께 쓰인다.

:point_right: 예제13 : 특정숫자일 경우 반복 종료하기

package javastudy.fourth;

import java.util.Random;

public class BreakStatement {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
        Random random = new Random();

        while (true) {

            int num = random.nextInt(50);
            System.out.print(num + " ");

            if (num == 22) {

                break;//while문을 빠져나간다
            }
        }

        System.out.print('\n');

	}

}

20 19 46 49 16 49 18 6 47 31 38 38 31 24 36 33 43 37 9 22


9. continue

continue는 반복 중 특정 조건하에서 명령문 실행을 skip할 수 있는 키워드 이다.

  • for, while과 함께 쓰인다.

:point_right: 예제14 : 홀수만 출력하기

package javastudy.fourth;

public class ContinueStatement {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		int num = 0;

		while (num < 30) {
			
			num++;
			
			if ((num % 2) == 0) {//짝수일 경우 뒤의 명령은 시행하지 않는다
				
				continue;
				
			}

			System.out.println(num + " ");
		}

		System.out.println('\n');

	}

}
1 
3 
5 
...
25 
27 
29 



:orange_book: References



태그:

카테고리:

업데이트:

댓글남기기