제어문: 조건에 따라 문장을 건너뛰고, 때로는 같은 문장을 반복해서 수행하는 문장들
조건문: 조건에 따라 다른 문장이 수행되도록 하는 것.
경우의 수가 많을 때는 switch문이 효율적, 그러나 제약이 if 보다 많음.
if (조건식) {
// 조건식이 참이면 여기의 문장이 수행
}
조건식
일반적으로 비교연산자와 논리연산자로 구성.
class FlowEx1 {
public static void main(String[] args) {
int x= 0;
System.out.printf("x=%d 일때, 참인 것은%n", x);
if(x==0) System.out.println("x==0");
if(x!=0) System.out.println("x!=0");
if(!(x==0)) System.out.println("!(x==0)");
if(!(x!=0)) System.out.println("!(x!=0)");
System.out.println();
x = 1;
System.out.printf("x=%d 일때, 참인 것은%n", x);
if(x==0) System.out.println("x==0");
if(x!=0) System.out.println("x!=0");
if(!(x==0)) System.out.println("!(x==0)");
if(!(x!=0)) System.out.println("!(x!=0)");
}
}
블럭{ }
괄호를 이용하여 여러 문장을 하나의 단위로 묶은 것.
import java.util.*; // Scanner클래스를 사용하기 위해 추가
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.println("입력하신 숫자는 "+ input +"입니다.");
} // main의 끝
}
if (조건식) {
// 참일때
} else {
// 거짓일때
}
import java.util.*; // Scanner클래스를 사용하기 위해 추가
class FlowEx3 {
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입니다.");
} else { // input!=0인 경우
System.out.println("입력하신 숫자는 0이 아닙니다.");
}
} // main의 끝
}
처리해야할 경우의 수가 셋 이상인 경우
if (조건식1) {
// 조건식 1이 참일때
} else if (조건식 2) {
// 조건식 1이 참이 아닌것중에서 조건식 2가 참일때
} else {
// 거짓일때
}
import java.util.*;
class FlowEx4 {
public static void main(String[] args) {
int score = 0; // 점수를 저장하기 위한 변수
char grade =' '; // 학점을 저장하기 위한 변수. 공백으로 초기화한다.
System.out.print("점수를 입력하세요.>");
Scanner scanner = new Scanner(System.in);
String tmp = scanner.nextLine(); // 화면을 통해 입력받은 내용을 tmp에 저장
score = Integer.parseInt(tmp); // 입력받은 문자열(tmp)을 숫자로 변환
if (score >= 90) { // score가 90점 보다 같거나 크면 A학점
grade = 'A';
} else if (score >=80) { // score가 80점 보다 같거나 크면 B학점
grade = 'B';
} else if (score >=70) { // score가 70점 보다 같거나 크면 C학점
grade = 'C';
} else { // 나머지는 D학점
grade = 'D';
}
System.out.println("당신의 학점은 "+ grade +"입니다.");
}
}
if문 안에 또 다른 if문을 포함시키는 것.
if (조건식1) {
if (조건식2) {
// 조건식 1과 2가 둘다 참인 경우
} else {
// 조건식 1만 참인 경우
}
} else {
// 거짓일때
}
import java.util.*;
class FlowEx5 {
public static void main(String[] args) {
int score = 0;
char grade = ' ';
char opt = '0';
System.out.print("점수를 입력해주세요.>");
Scanner scanner = new Scanner(System.in);
String tmp = scanner.nextLine(); // 화면을 통해 입력받은 내용을 tmp에 저장
score = Integer.parseInt(tmp); // 입력받은 문자열(tmp)을 숫자로 변환
System.out.printf("당신의 점수는 %d입니다.", score);
if (score >= 90) { // score가 90점 보다 같거나 크면 A학점(grade)
grade = 'A';
if (score >= 98) { // 90점 이상 중에서도 98점 이상은 A+
opt = '+';
} else if (score < 94) { // 90점 이상 94점 미만은 A-
opt = '-';
}
} else if (score >= 80){ // score가 80점 보다 같거나 크면 B학점(grade)
grade = 'B';
if (score >= 88) {
opt = '+';
} else if (score < 84) {
opt = '-';
}
} else { // 나머지는 C학점(grade)
grade = 'C';
}
System.out.printf("당신의 학점은 %c%c입니다.%n", grade, opt);
}
}
처리할 경우의 수가 많은 경우에는 if문보다 switch문으로 작성하는 것이 좋음.
단, switch문은 제약조건이 있음.
switch (level) {
case 1:
case 2:
case 3:
}
switch문의 제약 조건
1. 조건식 결과는 정수 또는 문자열이여야 한다.
2. case문의 값은 정수 상수만 가능하며, 중복되지 않아야 한다.
public static void main (String[] args) {
int num, result;
final int ONE = 1;
switch (result) {
case '1': // OK 문자상수
case ONE: // OK 정수상수
case "YES": // OK 문자열상수
case num: // Error 변수는 불가
case 1.0: // Error 실수도 불가
}
}
switch문의 중첩
주의점: break문을 빼먹기 쉬움
import java.util.*;
class FlowEx11 {
public static void main(String[] args) {
char gender;
String regNo = "";
System.out.print("당신의 주민번호를 입력하세요.(011231-1111222)>");
Scanner scanner = new Scanner(System.in);
regNo = scanner.nextLine();
gender = regNo.charAt(7); // 입력받은 번호의 8번째 문자를 gender에 저장
switch(gender) {
case '1':
case '3':
switch(gender) {
case '1':
System.out.println("당신은 2000년 이전에 출생한 남자입니다.");
break;
case '3':
System.out.println("당신은 2000년 이후에 출생한 남자입니다.");
}
break; // 이 break문을 빼먹지 않도록 주의
case '2':
case '4':
switch(gender) {
case '2':
System.out.println("당신은 2000년 이전에 출생한 여자입니다.");
break;
case '4':
System.out.println("당신은 2000년 이후에 출생한 여자입니다.");
break;
}
break;
default:
System.out.println("유효하지 않은 주민등록번호입니다.");;
}
} // main의 끝
}
반복문: 어던 작업이 반복적으로 수행되도록 할 때 사용
반복 횟수를 알고 있을 때 적합.
for (int i = 1; i <= 5; i++) { //(초기화; 조건식; 증감식)
System.out.println("!");
}
초기화
반복문에 사용될 변수를 초기화하는 부분. 처음에 한번만 수행.
둘 이상의 변수가 필요할 때는 아래와 같이 콤마를 구분자로 변수를 초기화 하면 됨.
for (int i = 1, j = 0; i <= 10; i++)
조건식
조건식이 참인 동안 반복을 계속 함.
증감식
반복문을 제어하는 변수의 값을 증가 또는 감소시키는 식.
쉼표 사용하여 두 문장 이상을 하나로 연결해서 쓸 수 있음.
for (int i = 1, j = 0; i <= 10; i++, j++)
중첩 for문
for문안에 for문을 포함시키는 것.
class FlowEx16 {
public static void main(String[] args) {
for(int i=1;i<=5;i++) {
for(int j=1;j<=10;j++) {
System.out.print("*");
}
System.out.println();
}
} // main의 끝
}
향상된 for문(enhanced for statement)
for (타입 변수명 : 배열 또는 컬렉션) {
// 반복할 문장
}
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);
} // main의 끝
}
while (조건식) {
// 조건식이 참인 동안 반복 수행
}
import java.util.*;
class FlowEx27 {
public static void main(String[] args) {
int num;
int sum = 0;
boolean flag = true; // while문의 조건식으로 사용될 변수
System.out.println("합계를 구할 숫자를 입력하세요.(끌내려면 0을 입력)");
while(flag) { // flag의 값이 true이므로 조건식은 참이 된다.
System.out.print(">>");
Scanner scanner = new Scanner(System.in);
String tmp = scanner.nextLine();
num = Integer.parseInt(tmp);
if(num!=0) {
sum += num; // num이 0이 아니면, sum에 더한다.
} else {
flag = false; // num이 0이면, flag의 값을 false로 변경.
}
} // while문의 끝
System.out.println("합계:"+ sum);
}
}
do-while문은 while문의 변형으로 기본 구조는 while과 같으나 조건식과 블럭의 순서를 바꿔 놓은 것.
do-while문은 최소한 한번은 수행될 것을 보장.
do {
// 참일때 수행될 문장들
} while (조건식);
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 {
if(tmp%10%3==0 && tmp%10!=0) // tmp%10이 3의 배수인지 확인(0 제외)
System.out.print("짝");
} while((tmp/=10)!=0); // tmp /= 10은 tmp = tmp / 10과 동일
System.out.println();
}
} // main
}
break문은 자신이 포함된 가장 가까운 반복문을 벗어남.
class FlowEx30 {
public static void main(String[] args) {
int sum = 0;
int i = 0;
while(true) {
if(sum > 100)
break;
++i;
sum += i;
} // end of while
System.out.println("i=" + i);
System.out.println("sum=" + sum);
}
}
반복이 진행되는 도중에 continue를 만나면 반복문의 끝으로 이동하여 다음 반복으로 넘어간다.
class FlowEx31 {
public static void main(String[] args) {
for(int i=0;i <= 10;i++) {
if (i%3==0)
continue; //만나면
System.out.println(i);
//여기로
}
}
}
중첩 반복문 앞에 이름을 붙이고 break문과 continue문에 이름을 지정해 줌으로써 하나 이상의 반복문을 벗어나거나 반복을 건너뛸 수 있음.
class FlowEx33 {
public static void main(String[] args)
{
// for문에 Loop1이라는 이름을 붙였다.
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);
} // end of for i
System.out.println();
} // end of Loop1
}
}