3. 제어문
프로그램 흐름 제어
제어문 없으면 순차적으로 진행
1) 조건문: 조건을 따져서 특정 문장 실행 여부 결정
* if 문: 조건이 true이면 if블록을 실행, false이면 블록 건너뛰기
if (조건) {
실행문(true);
}
* if - else 문: if조건을 만족하면 if블록 실행, false이면 else블록 실행
if (조건) {
실행문(true);
}else {
실행문(false);
}
* if - else if - else 문: 조건이 여러개일 때
if(조건1){
실행문(1 true);
}else if(조건2){
실행문(2 true);
}else if(조건3){
실행문(3 true);
}else{
실행문(모두 false);
}
※ 입력문
Scanner sc = new Scanner(System.in)
- Ctrl Shift O
=> import java.util.Scanner; 추가됨
// System.in --- 표준입력(키보드)
// next() --- 문자열(단어 한개) 읽는 method
// nextInt() --- 정수 한개 읽는 method
//입력에 사용할 스캐너 장치 생성
Scanner sc = new Scanner(System.in);
System.out.println("이름을 입력하시오");
String name = sc.next();
System.out.println("name:" + name);
System.out.println("나이를 입력하시오");
int age = sc.nectInt();
System.out.println("age:" + age);
** 학점계산기에 점수입력 기능 추가 **
int score;
Scanner sc = new Scanner(System.in);
System.out.println("점수(0~100):");
score = sc.nextInt();
if( score >= 0 && score <= 100 ) {
System.out.println("정상 점수");
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");
}
} else {
System.out.println("잘못된 점수");
}
* switch 문 : 단답으로 값을 물어볼 때 / 보통 숫자열 비교, 문자열 비교도 제공
switch(비교대상) {
case1:
실행문;
break; //블록 빠져나감
case2:
실행문;
break;
case3:
실행문;
break;
default: //모든 case가 faulse일 때 실행
실행문;
}
String day = "화요일";
int val = 0;
switch(day) {
case "월요일":
val = 1;
break;
case "화요일":
val = 2;
break;
case "수요일":
val = 3;
break;
case "목요일":
val = 4;
break;
case "금요일":
val = 5;
break;
default:
val = 6;
}
System.out.println(val);
2) 반복문: 특정 문장 반복
* for 문 (like 줄넘기) -- 횟수가 정해진 반복
for(시작값; 반복조건; 증감연산) {
실행문;
}
// 반복조건이 true일 경우에만 반복
- 1~10 증감
//print 1 2 3 4 5 6 7 8 9 10
int i;
for (i = 1; i <= 10; i++) {
System.out.println(i);
}
//print 10 9 8 7 6 5 4 3 2 1
for (i = 10; i > 0; i--) {
System.out.println(i);
}
- 1~100까지 합 계산해서 최종 결과만 산출
int i;
int sum = 0;
for (i = 1; i <= 100; i++) {
sum += i;
}
System.out.println("sum:" + sum);
- 구구단
//구구단 3단 출력
int i;
for (i = 1; i < 10; i++) {
System.out.println("3X" + i + "=" + ( 3 * i));
}
//단수를 입력받아 구구단 출력
Scanner sc = new Scanner(System.in);
System.out.print("단수:");
int dan = sc.nextInt();
for (i = 1; i < 10; i++) {
System.out.println(dan + "X" + i + "=" + (dan * i));
}
※
System.out.println("이름을 입력하시오");
=> 끝에 enter 자동
System.out.print("이름:");
=> enter X
** for 문의 2중 루프 : 반복 안에 반복이 필요할 경우
###
###
for (i = 0; i < 2; i++) { //i가 0, 1 두 번 돌아감
for (j = 0; j < 3; j++) { //j가 0, 1, 2 세 번 돌아감
System.out.print("#");
}
System.out.println(); //enter
}
구구단 2~9단까지 연달아 출력
int i;
int dan;
for (dan = 1; dan < 10; dan++) {
for (i = 1; i < 10; i++) {
System.out.println(dan + "X" + i + "=" + (dan * i));
}
}
** for 문의 무한 루프
for(;;) {
실행문;
}
for(i = 1; i > 0; i++) {
실행문;
}
(주석처리 단축키 -- Ctrl Shift C)
** for 문의 0번 루프 (조건을 잘 못 줘서)
for (i = 10; i < 5; i--) {
System.out.println("한 번도 실행 안 됨");
}
루프(블록) 안에서 선언한 변수는 루프(블록) 밖에서는 사용 불가!!
for (int k = 0; k < 3; k++) {
System.out.print("#");
System.out.print("k:" + k); //정상
}
System.out.print("k:" + k); //error!!
* while 문 --- 횟수가 가변일 때
While (조건) {
실행문;
}
int i = 1;
while (i < 5) {
System.out.println(i);
i++;
}
//print 1 2 3 4
i = 10;
while (i > 0) {
System.out.println(i);
i--;
}
//print 10 9 8 7 6 5 4 3 2 1
- 1~100 합 최종
int i = 1;
int sum = 0;
while (i <= 100) {
sum += i;
i++
}
정해진 횟수를 반복할 때는 for문
횟수가 가변할 때는 while문
// 사용자가 입력한 숫자들의 합. 입력횟수 무제한
int num;
int sum = 0;
Scanner sc = new Scanner(System.in);
while(true) { //무한루프
System.out.println("숫자입력");
num = sc.nextInt();
sum += num;
System.out.println("멈추려면 0을 입력하시오");
i = sc.nextInt();
if (i == 0) {
break; //루프를 빠져나감
}
}
System.out.println("sum:" + sum);
* do-while 문
do {
실행문;
} while (조건);
이 코드를
Scanner sc = new Scanner(System.in);
int score = 123; //거짓값을 넣어줘야 while문이 한번이라도 실행
while (score < 0 || score > 100) {
System.out.println("점수(0~100):");
score = sc.nextInt();
}
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");
}
do-while문으로 고치면 ▼
Scanner sc = new Scanner(System.in);
int score = 0;
do {
System.out.println("점수(0~100):");
score = sc.nextInt();
} while (score < 0 || score > 100);
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");
}
3) 정렬
* bubble sort
- 요소 2개씩 비교하여 바로 자리교체
3 1 7 5 2 ==> 1 2 3 5 7
//스왑 (swap)
int a = 10, b = 20, tmp;
tmp = a;
a = b;
b = tmp;
int i, j, tmp;
int[] arr = { 8, 3, 10, 5, 9, 1, 7, 4, 6, 2 };
//한 줄 처리를 n-1번 반복 --- 숫자 하나 씩 뒷 숫자와 비교하며 이동
for (i = 0; i < arr.length - 1; i++) {
//2개씩 비교해서 바꿈
//마지막 값은 이미 정렬된 가장 큰 값이므로 - i 해줌
for (j = 0; j < arr.length - 1 - i;j++) {
if (arr[j] > arr[j + 1]) {
//swap
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
* insert sort
- 맨 앞 숫자는 고정
- 앞 숫자와 뒷 숫자를 비교하여 더 큰 수를 뒤로 밀어 보냄
- bubble sort 보다 자리 이동이 적어서 성능이 더 좋음
//i: 자리를 찾아갈 값의 위치.
//자기보다 큰 값은 뒤로 밀고 앞으로 감.
for (i = 1; i < a.length; i++) {
//자리잡을 값 (i번째 값)보다 큰 값들을 뒤로 한 칸씩 미루기 때문에
//i 번째 값이 지워질 수 있기 때문 tmp에 옮겨놓음.
tmp = a[i];
//j: i번째 값과 비교할 대상을 가리킴
//j는 i바로 앞 칸에서부터 한 칸씩 앞으로 이동
j = i - 1;
//자리 잡을 값(tmp)보다 큰 값들을 만나면 뒤로 한칸씩 이동
while (j >= 0 && tmp < a[j]) {
a[j + 1] = a[j]; //뒤로 미루고
j--; //tmp와 비교할 값을 한 칸씩 앞으로 이동
}
j++;
a[j] = tmp; //자기 자리에 tmp값 삽입
}
4) 기타 제어문
* break 문 -- 루프나 블록을 빠져나감
* continue 문 -- 다음 루프 진행
int i;
for (i = 1; i <= 100; i++) {
if (i % 2 == 0) {
continue;
}
System.out.print(i + "\t");
}
\t : tab
\n : enter
* return 문 -- 현재 메서드 종료
< 피카츄 키우기 게임 >
int menu;
Scanner sc = new Scanner(System.in);
// 1. 밥먹기 2. 잠자기 3. 운동 4. 놀기 5. 종료
boolean flag = true;
int hp = 30, exp = 0, lv = 1; // lv은 exp20마다 1증
// exp 20마다 lv 1 증가
// hp <= 0: 캐릭터 사망. 게임 종료
while (flag) {
System.out.println("1. 밥먹기 2. 잠자기 3. 운동 4. 놀기 5. 종료 6. 상태확인");
// 메뉴 입력받음
menu = sc.nextInt();
switch (menu) {
case 1:
hp += 5;
System.out.println("피카츄가 밥을 먹습니다.");// hp 5증가
break;
case 2:
hp += 10;
System.out.println("피카츄가 잠을 잡니다."); // hp 10증가
break;
case 3:
System.out.println("피카츄가 운동을 합니다."); // hp 8감소 exp 7증가
hp -= 8;
if (hp <= 0) {
System.out.println("피카츄 사망");
flag = false; // while 종료
break;
}
exp += 7;
if (exp >= 20) {
lv++;
exp -= 20;
System.out.println("Level up! lv:" + lv);
}
break;
case 4:
System.out.println("피카츄가 놉니다."); // hp 5 감소, exp 3 증가
hp -= 5;
if (hp <= 0) {
System.out.println("피카츄 사망");
flag = false; // while 종료
break;
}
exp += 3;
if (exp >= 20) {
lv++;
exp -= 20;
System.out.println("Level up! lv:" + lv);
}
break;
case 5:
System.out.println("종료합니다.");
flag = false;
break;
case 6:
System.out.println("피카츄 상태");
System.out.println("hp:" + hp + " exp:" + exp + " lv:" + lv);
break;
}
}