-
[Java] 선택문과 제어문Programming/Java 2021. 4. 5. 12:57
Java언어에서 flow control을 담당하는 선택문과 제어문을 공부해보자!
과제 회고
자바의 기본적인 문법은 알고 있었지만, 속성식으로 빠르게 배웠기 때문에 깊이가 없다고 생각했다.
그래서 이번 과제의 목표를 다음과 같이 잡았다.- oracle documentation과 예제보고 키워드 사용법 제대로 이해하기
- 새롭게 업데이트 된 부분 공부하기
문서와 예제를 통해 공부를 하니까, 이미 알고있던 키워드도 더 잘 활용하는 방법을 배울 수 있었다.
또 새롭게 알게 된 내용도 많았다.forEach
메서드- 새로운
Switch
문 사용법->
와yield
문 사용
배운 내용을 잘 활용하면, 좀 더 가독성 있는 코드를 짤 수 있을 거 같다.
프로그램의 흐름을 제어하는 선택문과 제어문
Java언어에서 프로그램의 흐름을 제어하기 위해서, 다음과 같은 키워드를 사용할 수 있다.
조건 확인
: if, else, switch반복 사이클 생성
: while, for사이클 제어
: break, continue
각 keyword의 쓰임을 예제를 통해 살펴보자.
1. if : 표현식이 참인지 판별
기본적인 형식은 다음과 같다.
if (표현식 expression){ 명령문 statement; }
if
는 표현식이 참인지를 판별하는 키워드이다.- 만약 참이라면, 명령문이 실행된다.
- 명령문이 여러줄 인 경우,
block
을 사용하여 모든 명령문를 묶어준다.
예제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 키워드 뒤의 명령문이 자동으로 실행된다.
예제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 키워드는 앞의 조건들이 모두 거짓일 경우에 또 다른 조건을 시험할 수 있는 키워드이다.
if
나else
와 달리, 여러번 사용하여 분기를 만들 수 있다.
: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)
예제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 알 수 없는 나라
예제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
References
- https://docs.oracle.com/en/java/javase/13/language/switch-expressions.html
- https://dev-kani.tistory.com/21
- https://stackoverflow.com/questions/58049131/what-does-the-new-keyword-yield-mean-in-java-13
자바 12에 break대신
yield문
과arrow
를 사용한 switch문이 소개되었다.yield
: case의 결과로 반환하고 싶은 값이 있을 경우. yield를 사용한다.->
::
대신 사용할 수 있다.
예제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; }
- 표현식이 참인 경우 명령문을 계속해서 수행한다.
예제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 while은
while
문의 방식을 살짝 수정해서 사용할 수 있는 키워드이다.- 명령문이 최소 1번 실행된 후에, while문 뒤에 있는 표현식을 확인하여 반복여부를 결정한다.
예제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 실행
int i = 0
: 카운팅 변수 i를 0으로 초기화- 이 단계는 오직 한번만 시행된다.
i < 10
: 해당 조건이 참인지를 판별한다.- 참일 경우 다음 단계로 넘어가고,
- 거짓일 경우 반복문에서 나간다.
System.out.println(i)
: for가 감싸고 있는 명령문을 실행한다.i++
: 괄호 안의 변수 i를 1 증가시키는 명령을 시행한다.
2
단계의 조건이 거짓이 될 때까지 시행을 반복한다.예제 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개 이상의 명령문을 사용할 수도 있다
예제 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
와 함께 쓰인다.
예제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
과 함께 쓰인다.
예제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
References
'Programming > Java' 카테고리의 다른 글
[Java] Stack 구현하고 JUnit5로 테스트하기 (0) 2021.04.05 [Java] LinkedList 구현하고 JUnit5로 테스트하기 (0) 2021.04.05 [Java] GitHub API를 사용해서 대시보드 만들기 (0) 2021.04.05 [Java] 자바파일 컴파일(javac)과 실행(java) (0) 2021.04.05 [Java] JVM의 구조 (0) 2021.04.05 댓글