1. 조건문 - if, switch
- 처리할 경우의 수가 많으면 if 보다 switch가 효율적이지만 if 보다 제약이 많다.
1.1 if문
- 결과가 참인 조건식을 만날 때까지 첫 번째 조건식부터 순서대로 평가한다.
<hide/>
package javaStudy;
import java.util.*;
public class FlowEx2 {
public static void main(String[] args) {
int input;
System.out.print("숫자를 하나 입력하세요.>");
Scanner scanner = new Scanner(System.in);
String tmp = scanner.nextLine(); // 화면 통해 입력받은 내용을 tmp에 저장
input = Integer.parseInt(tmp); // 입력받은 문자열 tmp를 숫자로 변환한다.
if( input == 0) {
System.out.println("입력하신 숫자는 0입니다.");
}if( input != 0) {
System.out.println("입력하신 숫자는 0이 아닙니다.");
System.out.printf("입력하신 숫자는 %d입니다." , input);
}
}
}
Note) 실행 결과
- import java.util.* : Scanner 클래스 사용하기 위해 추가한다.
- String tmp = scanner.nextLine() : 화면을 통해 입력받은 내용을 tmp에 저장한다.
- Integer.parseInt(문자열) : 문자열을 숫자로 변환한다.
1.4 중첩 if문
1.5 switch문
- 각 case마다 Break를 꼭 적어줘야한다.
- 제약조건
-> switch문의 조건식 결과는 정수 또는 String이어야 한다.
-> case문의 값은 정수 상수(ex) ONE, ONE은 final이 붙은 정수 상수이다.)만 가능하며, 중복되지 않아야 한다.
<hide/>
switch (조건식) {
case 값1:
// 조건식의 결과가 값1과 같은 경우 수행될 문장들
break;
case 값2:
// 조건식의 결과가 값2과 같은 경우 수행될 문장들
break;
default:
// 조건식의 결과와 일치하는 case문이 없을 때 수행될 문장들
}
Ex 4-7)
<hide/>
package javaStudy;
import java.util.*;
public class FlowEx7 {
public static void main(String[] args) {
System.out.print("가위(1), 바위(2), 보(3) 중 하나를 입력하세요.>");
Scanner scanner = new Scanner(System.in);
int user = scanner.nextInt(); // 화면 통해 입력 받은 숫자를 user에 저장한다.
int com = (int)(Math.random() * 3) + 1; // 1, 2, 3 중 하나가 com에 저장된다.
System.out.println("당신은 " + user + "입니다.");
System.out.println("컴은 " + com + "입니다.");
switch (user - com) {
case 2: case -1:
System.out.println("당신이 졌습니다.");
break;
case 1: case -2:
System.out.println("당신이 이겼습니다.");
break;
case 0:
System.out.println("비겼습니다."); // 마지막 문장은 break 필요 없다.
}
}
}
Note) 실행 결과
- user: 사용자가 입력한 값, com: 컴퓨터가 생성한 난수
- 가위(1), 바위(2), 보(3)라고 했을 때,
-> user - com = 1 또는 -2 인 경우: user승
-> user - com = -1 또는 2 인 경우: com승
-> user - com = 0 : 무승부
- Math.random() : 난수(임의의 수)를 얻기 위해 이용한다.
-> 0.0과 1.0 사이의 범위에 속하는 하나의 double값을 반환한다.
-> 0.0 <= Math.random() < 1.0
-> 만약 1과 3 사이의 정수를 구하기 원한다면?
(1) 각 변에 3을 곱한다.
0.0 <= Math.random() * 3 < 3.0
(2) 각 변을 int형으로 변환한다.
(int)0.0 <= (int) (Math.random() * 3 ) < (int)3.0
0 <= (int) (Math.random() * 3 ) < 3
(3) 각 변에 1을 더한다.
1 <= (Math.random() * 3 ) + 1 < 4
- 문자열.charAt(i): 문자열의 i번째 인덱스(0부터 시작)에 있는 문자를 가져온다
- char타입은 값은 문자가 아닌 정수(유니코드)로 저장된다.
- 따라서, 이처럼 char타입의 값도 switch문의 조건식과 case문에 사용할 수 있다.
2. 반복문 - for, while, do-while
2.1 for문
- for, while 중에서 for는 반복 횟수를 알고 있을 때 적합하다.
- for( 초기화; 조건식; 증감식 ){ 수행될 문장 }
- 순서: 초기화 -> 조건식이 참일 때 -> 수행될 문장 -> 증감식
- 순서: 초기화 -> 조건식이 거짓일 때 -> for문을 빠져 나온다.
- for문의 세 가지 요소는 생략 가능하다. for(;;),
- 이 때, 조건식은 참이 된다.
Note) 향상된 for문 (for each문)
-> for( 타입 변수명 : 배열 또는 컬렉션 ){ 반복할 문장 }
-> Arrays.stream().forEach(e -> {System.out.println(e);}); ...도 많이 쓴다.
Ex)
<hide/>
String[] str = {"홍길동", "이순신", "세종대왕"};
Arrays.stream(str).forEach(e -> {
System.out.println(e);
});
Ex 4-22) for each문
<hide/>
package javaStudy;
public class FlowEx22 {
public static void main(String[] args) {
int [] arr = {10, 20, 30, 40, 50};
int sum = 0;
for(int i= 0; i < arr.length; ++i )
System.out.printf("%d " , arr[i]);
System.out.println();
for(int tmp : arr) {
System.out.printf("%d ", tmp);
sum += tmp;
}
System.out.println();
System.out.println("sum = " + sum);
}
}
Note) 실행 결과
- 배열 arr 의 모든 요소를 출력한다.
- for문 보다 간결하다.
- 그러나, for문과 달리 배열이나 컬렉션에 저장된 요소들을 읽어오는 용도로만 사용할 수 있다는 제약이 있다.
2.2 while문
- while(조건식){ 조건식이 참일 때, 반복될 문장들 }
- 조건식이 거짓이면 반복문을 빠져나간다.
- for문과 다르게 초기화를 while문 밖에 적는다.
- 조건식은 생략 불가.
Ex 4-23)
<hide/>
package javaStudy;
public class FlowEx23 {
public static void main(String[] args) {
int i = 5;
while(i-- != 0 ) {
System.out.println( i + " - I can do it.");
}
}
}
Note) 실행 결과
- 조건식( i-- != 0): i값이 0이 아닌 동안만 참이 되고 i값이 매 반복마다 1씩 감소하다가
- 0이 되면 조건식은 거짓이 되어 while문을 빠져나간다.
- i--는 후위형이므로 조건식이 평가된 다음에 i값이 감소된다.
-> 예를 들어 i = 1일 때, 조건식이 참이므로 평가된 후에 i = 0이 된다.
Ex 4-25)
<hide/>
package javaStudy;
import java.util.*;
public class FlowEx25 {
public static void main(String[] args) {
int num = 0, sum = 0;
System.out.print("숫자를 입력하세요.(예:12345)>");
Scanner scanner = new Scanner(System.in);
String tmp = scanner.nextLine();
num = Integer.parseInt(tmp);
while( num != 0) {
// num을 10으로 나눈 나머지를 sum에 더한다.
sum += num % 10;
System.out.printf("sum = %3d num = %d%n", sum, num);
num /= 10;
}
System.out.println("각 자리수의 합: "+ sum);
}
}
Note) 실행 결과
- 사용자로부터 숫자를 입력 받고 이 숫자의 각 자리의 합을 구하는 예제이다.
- 2423을 입력하면 결과는 11이다.
- 어떤 수를 10으로 나머지 연산하면 마지막 자리를 얻을 수 있다.
- 그 다음 10으로 나누면 마지막 한 자리가 제거된다.
- 입력 받은 숫자 num을 0이 될 때까지 반복해서 10으로 나눠가면서 10으로 나머지연산하면 된다.
2.3 do-while문
- do{ 조건식의 결과가 참일 때 수행될 문장} while( 조건식 );
- while문 뒤에 세미콜론 ; 을 꼭 붙인다.
- while문과 다르게 블럭 안의 문장이 반드시 한 번이상 수행된다. while 문과 조건식과 블럭의 순서만 다르다.
Ex 4-28)
<hide/>
package javaStudy;
import java.util.*;
public class FlowEx28 {
public static void main(String[] args) {
int input = 0, answer = 0;
answer = (int) (Math.random() * 100) + 1; // 1~100 사이 임의 값 저장
Scanner scanner = new Scanner(System.in);
do {
System.out.print("1과 100사이의 정수를 입력하세요.>");
input = scanner.nextInt();
if(input > answer) {
System.out.println("더 작은 수로 다시 시도해보세요.");
}else if(input < answer) {
System.out.println("더 큰 수로 다시 시도해보세요.");
}
}while( input != answer );
System.out.println("정답입니다.");
}
}
Note) 실행 결과
- Math.randeom()을 이용해서 1과 100 사이의 임의의 수를 변수 answer에 저장한다.
- 이 값은 맞출 때까지 반복하는 예제이다.
- 사용자가 입력한 input이 변수와 다른 동안 반복하다가 두 값이 같으면 반복문을 벗어난다.
Ex 4-29) 369 게임
<hide/>
package javaStudy;
public class FlowEx29 {
public static void main(String[] args) {
for(int i = 1;i <= 100; ++i) {
System.out.printf("i = %d", i);
int tmp = i;
do {
//tmp의 일의자리가 3의 배수인지 확인
if( tmp % 10 % 3 == 0 && tmp % 10 != 0 ) {
System.out.print(" 짝");
}
}while( (tmp /= 10) != 0 );
System.out.println();
}
}
}
Note) 실행 결과
...
- 숫자 중에 3의 배수가 있으면 포함된 개수만큼 손뼉을 치는 369게임을 1~100까지 출력하는 예제이다.
- 숫자의 각 자리를 확인해야하기 때문에 10으로 나누고 10으로 나머지 연산을 한다.
- 이 작언을 변수i에 직접 하면 안 되고 다른 변수(tmp)에 저장해서 처리해야한다.
- 변수 i는 for문의 제어에 사용되는 변수이기 때문이다.
- if문에서 조건식을 보면 tmp % 10이 3의 배수인지 확인한다.(tmp % 10 = 0이 되는 경우는 제외)
2.4 break문
Def) break문: 자신이 포함된 가장 가까운 반복문을 벗어난다.
Ex 4-30)
<hide/>
package javaStudy;
public class FlowEx30 {
public static void main(String[] args) {
int sum = 0;
int i = 0;
while( true ) {
if( sum > 100 )
break;
++i;
sum += i;
}
System.out.println("i = "+i);
System.out.println("sum = " + sum);
}
}
Note) 실행 결과
- 1부터 자연수를 계속 더해서 몇 까지 더하면 합이 100보다 커지는지 알아내는 문제이다.
- sum이 100을 넘으면 if문의 조건식이 참이므로 break문이 수행되어 자신이 속한 반복문(while 문)을 빠져나간다.
- break가 없으면 무한 반복문이 된다.
2.5 continue문
Def) continue문: 반복이 진행되는 도중에 continue문을 만나면 반복문의 끝으로 이동하여 다음 반복으로 이동한다.
- 반복문 내에서만 사용할 수 있다.
- 반복문 전체를 벗어나지 않고 다음 반복을 계속 수행한다는 점이 break문과 다르다.
-> for문의 경우: 증감식으로 이동
-> while문, do-while문의 경우: 조건식으로 이동한다.
- 주로 if문과 함께 사용되어 특정 조건을 만족하는 경우,
- continue문 이후의 문장들을 수행하지 않고 다음 반복으로 넘어간다.
Ex 4-32)
<hide/>
package javaStudy;
import java.util.*;
public class FlowEx31 {
public static void main(String[] args) {
int menu = 0;
int num = 0;
Scanner scanner = new Scanner(System.in);
while(true) {
System.out.println("(1) square");
System.out.println("(2) square root");
System.out.println("(3) log");
System.out.println("원하는 메뉴(1~3)을 선택하세요.(종료 : 0)");
String tmp = scanner.nextLine();
menu = Integer.parseInt(tmp);
if( menu == 0) {
System.out.println("프로그램을 종료합니다. ");
break;
}else if( !( 1 <= menu && menu <= 3) ) {
System.out.println("메뉴를 잘못 선택하셨습니다. (종료는 0)");
continue;
}
System.out.println("선택하신 메뉴는 " + menu + "번입니다.");
}
}
}
Note) 실행 결과
- 메뉴를 보여주고 선택하게 하는 예제이다.
- 메뉴를 잘못 선택하는 경우, continue문으로 다시 메뉴를 보여준다.
- 종료를 선택하는 경우, break문으로 반복을 빠져나가서 프로그램이 종료된다.
2.6 이름 붙은 반복문
- break문은 근접한 단 하나의 반복문만 벗어날 수 있다.
- 여러 개의 반복문이 중첩된 경우에는 break문으로 중첩 반복문을 완전히 벗어날 수 없다.
- 이 때는 중첩 반복문 앞에 이름을 붙이고 break문과 continue문에 이름을 지정해주면 하나 이상의 반복문을 벗어나거나 반복을 건너뛸 수 있다.
Ex)
<hide/>
Loop1:
for (int i = 2; i <= 9; ++i) {
for (int j = 1; j <= 9; ++j) {
if (j == 5) {
break Loop1;
// break;
// continue Loop1;
// continue ;
}
System.out.println(i + " * " + j + " = " + i * j);
}
System.out.println();
}
Note) 실행 결과
'Java > Java의 정석' 카테고리의 다른 글
Chapter 06 객체지향 프로그래밍 I (0) | 2022.02.22 |
---|---|
Chapter 05 배열(Array) (0) | 2022.02.20 |
Chapter 03 연산자(Operator) (0) | 2022.02.19 |
Chapter 02 변수(Variable) (0) | 2022.02.17 |
Chapter 01 자바를 시작하기 전에 (0) | 2022.02.15 |