1. Switch 문
🔅 단 하나의 조건식으로 많은 경우의 수를 처리할 수 있고 표현도 간결
수행 절차
- 조건식을 계산한다.
- 조건식의 결과와 일치하는 case문으로 이동
- 이후의 문장들을 수행
- break 문이나 switch문의 끝을 만나면 switch문 전체를 빠져나감
💡 POINT
- break문을 생락하면 case문 사이의 구분이 없어지므로 다른 break문을 만나거나 switch문 블럭 {} 끝을 만날 때까지 나오는 모든 문장들을 수행
- 제약조건
a. 조건식 결과는 정수 또는 문자열b. case문의 값은 정수 상수만 가능, 중복 X
- if문 처럼 중첩 가능
switch (조건식) {
case 값1 :
// 조건식의 결과가 값1과 같을 경우 수행될 문장들
//...
break;
case 값2 :
// 조건식의 결과가 값2과 같을 경우 수행될 문장들
//...
break;
default :
// 조건식의 결과와 일치하는 case 문이 없을 때 수행될 문장들
//...
break; // 생략가능.
}
조건식이 정수인 경우
public static void main(String[] args) {
// 일년 동안 읽은 책 수에 따라 멘트를 출력합니다.
int book = 5;
switch (book/10) {
case 0 : // 10권 미만
System.out.println("조금 더 노력 하세요!");
break;
case 1 : // 10이상 20권 미만
System.out.println("책 읽는 것을 즐기는 분이시네요!");
break;
case 2 : // 20이상 30권 미만
System.out.println("책을 사랑하는 분이시네요!");
break;
default : // 30권 이상
System.out.println("당신은 다독왕입니다!");
break; // 생략가능
}
}
조건식이 문자열인 경우
public static void main(String[] args) {
String medal = "Silver";
switch(medal) {
case "Gold":
System.out.println("금메달 입니다.");
break;
case "Silver":
System.out.println("은메달 입니다.");
break;
case "Bronze":
System.out.println("동메달 입니다.");
break;
default:
System.out.println("메달이 없습니다.");
break;
}
}
응용 예제
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("월을 입력해 주세요 >>> ");
int month = scanner.nextInt();
int day;
switch(month) {
// case 1: case 3: case 5: case 7: case 8: case 10: case 12:
case 1, 3, 5, 7, 8, 10, 12: // case가 여러가지인 경우 생략 가능.
day = 31;
break;
case 4: case 6: case 9: case 11:
day = 30;
break;
case 2:
day = 28;
break;
default:
day = 0;
System.out.println("존재하지 않는 달 입니다.");
}
System.out.println(month + " 월은 " + day + " 일까지 있습니다.");
scanner.close();
}
public static void main(String[] args) {
/* Java 12부터 개선된 switch 문을 지원 */
Scanner scanner = new Scanner(System.in);
System.out.print("월을 입력해 주세요 >>> ");
int month = scanner.nextInt();
int day;
switch (month) {
case 1, 3, 5, 7, 8, 10, 12 -> day = 31;
case 4, 6, 9, 11 -> day = 30;
case 2 -> day = 28;
default -> {
day = 0;
System.out.println("존재하지 않는 달입니다.");
}
}
System.out.println(month + "월은 " + day + "일까지 있습니다.");
scanner.close();
}
public static void main(String[] args) {
/* 사용자에게 성적을 입력받아
* switch문을 사용해서 학점을 출력하는 코드를 완성하세요.
* 입력은 0 ~ 100까지 입력이 됩니다.
* 기준은 아래와 같습니다.
* A : 90 ~ 100
* B : 80 ~ 89
* C : 70 ~ 79
* D : 60 ~ 69
* F : 0 ~ 59 */
Scanner scanner = new Scanner(System.in);
int grade;
String credit;
System.out.print("성적을 입력하세요 >> ");
grade = scanner.nextInt();
// 'int/int' 결과는 int 이기 때문에 '88/10'은 8.8이 아닌 8이 됨.
switch(grade/10*10) {
case 90,100: // 90 ~ 100
credit = "A";
break;
case 80:
credit = "B";
break;
case 70:
credit = "C";
break;
case 60:
credit = "D";
break;
default :
credit = "F";
break;
}
System.out.println("입력하신 성적은 " + grade + "점이고, 학점은 " + credit + "입니다.");
scanner.close();
}
2. 반복문
💡 어떤 작업이 반복적으로 수행되도록 할 때 사용
💡 종류 ; for문, while문, do-while문
💡 조건식의 결과가 true이면 참, false면 거짓으로 간주
1) for문
✓ 반복 횟수를 알고 있을 때 적합
👾 실수 사용 x 정수만 사용하기 ▶️ 계산이 부정확하기 때문
👾 초기화, 조건식, 증감식 모두 생략 가능
▶️ 조건식이 생략된 경우, 참으로 간주되어 무한 반복문이 된다.
▶️ 대신 블럭{} 안에 if 문을 넣어서 특정 조건을 만족하면 for 문을 빠져 나오게 해야 한다.
for문의 구조
for (초기화; 조건식; 증감식) {
// 조건식이 참일 때 수행될 문장들을 적는다.
}
for문 수행 순서
📍 초기화 ▶️ 조건식 ▶️ 수행될 문장 ▶️ 증감식 ▶️ 조건식 ▶️ 수행될 문장 ▶️ 증감식 ...
public class MyFor_02 {
public static void main(String[] args) {
/* for문의 순서 */
int sum = 0; // 총 합을 담을 변수. 초기화가 꼭 필요.
// for (초기값; 조건식; 증감식)
for (int i = 1; i > 0; i++) { //1부터 10까지의 합
System.out.println("i = " + i + " sum = " + (sum += i));
// 1) 초기값 실행
// 2) 조건식 확인
// 3) 조건식이 참이면 명령문 실행
// 4) 증감식 실행
// 5) 조건식 확인
// 6) 조건식이 참이면 명령문 실행
// 4) 5) 6) 반복
}
// System.out.println(i); // i는 for문에서만 유효
{
int tmp = 12;
System.out.println(tmp);
}
}
}
변수 i에 1을 저장한 다음, 매 반복마다 i의 값을 1씩 증가시킨다.
그러다가 i의 값이 5를 넘으면 조건식 'i <= 5'가 거짓이 되어 반복을 마치게 됨
i의 값이 1부터 5까지 1씩 증가 하니까 모두 5번 반복한다.
A. 초기화
· 반복문에 사용될 변수를 초기화하는 부분이며 처음에 한번만 수행.
· 둘 이상의 변수가 필요할 때 콤마 ',' 를 구분자로 변수를 초기화 (단, 두 변수의 타입은 같아야)
ex. for (int i=1, j=0; i <= 10; i++) {...
B. 조건식
· 조건식의 값이 참이면 반복을 계속하고, 거짓이면 반복을 중단하고 for문을 벗어난다.
C. 증감식
· 반복문을 제어하는 변수의 값을 증가 또는 감소시키는 식.
· 콤마 ',' 를 이용해서 두 문장 이상을 하나로 연결해서 쓸 수 있다.
ex. for (int i =1, j=10; i <= 10; i++, j--) {...
public class MyFor_03 {
public static void main(String[] args) {
/* for문 외부에 변수 선언 할 경우엔 i대신 다른 변수명 사용 */
int sum = 0;
int num;
for(num = 0; sum < 100 ; num++) {
sum += num; // sum = sum + num -> sum을 초기화 하지 않으면 오류가 남.
System.out.println("num : " + num + " / sum : " + sum);
}
System.out.println("num : " + num);
System.out.println("sum : " + sum);
}
}
응용 예제
public class Ex_02_04 {
public static void main(String[] args) {
/* 1부터 100사이의 정수 중에서 3또는 4의 배수의 합을 구하는 코드를 작성 */
int sum = 0;
for (int i = 1; i <= 100; i++) {
if ((i%3==0) || (i%4==0)) {
sum += i;
}
}
System.out.println("3 또는 4의 배수의 합 : " + sum );
}
}
2) 중첩 for문
💡 중첩의 횟수 제한 x.
💡 안쪽 for문의 모든 반복이 끝나고서야 바깥쪽 for문의 다음 반복으로 넘어간다.
별 출력
public class Ex_03_03 {
public static void main(String[] args) {
/* for문을 이용해서 다음과 같이 *를 출력하는 코드를 작성해보세요.
*
**
***
****
*/
for (int i=1; i<=4; i++) {
for (int j=1; j<=i; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
구구단 출력
public class MyFor_11 {
public static void main(String[] args) {
/* 중첩 for문으로 구구단 출력
* for문은 또 다른 for문을 내포할 수 있는데, 이것을 중첩 for문이라고 함.
* 이 경우 바깥쪽 for문이 한 번 실핼할 때마다 중첩된 for문은 지정된 횟수만큼
* 반복해서 돌다가 다시 바깥쪽 for문이 돌아감. */
for(int dan = 2; dan <= 9; dan++) { // 바깥 쪽 for문. 8번 반복
System.out.println("*** " + dan + "단 ***");
for(int times = 1; times <= 9; times++) { // 중첩 for문. 9번 반복
System.out.println(dan + " X " + times + " = " + dan * times);
}
System.out.println(); // -> 각 단이 끝날 때 넣어줌.
}
}
}
주사위 게임
public class Ex_03_01 {
public static void main(String[] args) {
/* 2개의 주사위를 던지는 게임이 있다고 가정하자.
* 중첩 for문을 이용하여 2개의 주사위의 합이 6이 되는 경우를 출력하는 코드 작성.
(1,5) (2,4) (3,3) (4,2) (5,1) */
for (int i = 1; i <= 6; i++) {
for ( int j = 1; j <= 6; j++) {
if (i+j == 6)
System.out.println("(" + i + ", " + j + ")");
// 변수 통상적으로 i 다음에 j 씀.
}
}
}
}
3) float 타입 카운터 변수
✓ for문을 작성할 때 주의할 점은 초기화 식에서 루프 카운터 변수를 선언할 때 부동 소수점을 쓰는 float 타입을 사용 x
➡️ 0.1은 float 타입으로 정확하게 표현할 수 없기 때문에 x에 더해지는 값이 0.1보다 약간 커서, 루프는 9번 실행
➡️ float과 double은 계산이 부정확
✓ 대안으로 정수로 변환 후 계산 결과 값을 실수로 변환 or 자바에서는 정확한 실수 계산을 위해 Decimal 클래스를 제공
public class MyFor_05 {
public static void main(String[] args) {
for (float x = 0.1f; x <= 1.0f; x += 0.1f) {
System.out.println(x);
/* 0.1
* 0.2
* 0.3
* 0.4
* 0.5
* 0.6
* 0.70000005
* 0.8000001
* 0.9000001 */
}
}
}
4) for문 동작 시간 구하기
📍 프로그램의 동작 시간을 구하는 방법은 프로그램 시작 위의 부분에서 시작시간을 구하고, 프로그램이 끝나는 부분에서 종료시간을 구한후 종료시간에서 시작시간을 빼면 프로그램이 동작한 시간을 구할 수 있음
public class MyFor_04 {
public static void main(String[] args) {
long startTime = System.currentTimeMillis(); // 시작시간
for(int i = 0; i < 1000000000; i++) { // 10억번 반복
; // 빈문장 실행
}
long endTime = System.currentTimeMillis(); // 종료시간
System.out.println("시작시간 : " + startTime);
System.out.println("종료시간 : " + endTime);
System.out.println("소요시간 : " + (endTime - startTime));
}
}
(출처 : 학원강의 및 java의 정석 3rd)
'Programming Language > JAVA' 카테고리의 다른 글
[Java] Array | 배열 선언과 생성 · 배열 길이와 인덱스 · 배열 초기화 · 배열 출력 (0) | 2024.08.09 |
---|---|
[Java] while 문 · break문 · continue 문 (0) | 2024.08.09 |
[Java] 비트 연산자 · if 문 (0) | 2024.05.21 |
[JAVA] 연산자 [단항/복합/대입/비교/논리/삼항] 및 우선순위 (0) | 2024.04.05 |
[JAVA] 형변환 casting & 연산자 operator (0) | 2024.04.01 |