오늘 배운 것
01. 조건문 if
02. switch (다중 선택문)
01. 조건문 if
:실습 10개
실습 033
지역 변수는 초기화가 필수이므로 else로 할당하거나, 초기 기본값을 미리 작성한다.
임의의 정수를 사용자 입력 받고 홀수, 짝수, 0 판별해서 출력한다.
- if ~ elif ~ else 구문을 사용한다.
- 입출력은 BufferedReader , printf() 를 사용한다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Test033{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("임의의 정수 입력: ");
int n = Integer.parseInt(br.readLine());
String result; // 초기화 안 하려면 else를 꼭 사용.
if (n == 0) // 0 판별 조건이 가장 먼저.(어떤 수로 나누든 몫과 나머지가 0이므로)
result = "0";
else if(n % 2 == 0)
result = "짝수";
else if(n % 2 != 0)
result = "홀수"; //여기서 else로 끝내도 되지만
else
result = "판별 불가"; // 정확한 예외처리
System.out.printf(">> %d은(는) %s입니다.\n",n ,result);
}
}
실습 034
임의의 정수를 사용자 입력받아 다음 판별 결과 출력
- 2의 배수 / 3의 배수 / 2와 3의 배수 / 2와 3의 배수 아님
// ...상략
if (n % 2 == 0 && n % 3 == 0)
result = "2와 3의 배수";
else if(n % 2 == 0)
result = "2의 배수";
else if(n % 3 == 0)
result = "3의 배수";
else // 이렇게 끝내지 않고 정확한 로직으로 예외처리하려면
result = "2와 3의 배수 아님";
System.out.printf("%d → %s\n" ,n , result);
/*------- 지금 산술적으로는 이렇게 안 해도 되지만
실무에서 다양한 상황으로 비유했을 때, 안전한 방식. (권장)
else if(n % 2 != 0 && n % 3 !=0)
result = n + "2와 3의 배수 아님";
else
result = "처리 불가.";
---------------------------------------------------------*/
실습 035
윤년/평년 판별 (중략)
이전 실습에서는 한 줄로 작성해서 불리언 변수로 담았던 조건을 분리해서 작성했다.
if(year % 400 == 0)
strResult = "윤년";
else if(year % 4 == 0 && year % 100 != 0)
strResult = "윤년";
else
strResult = "평년";
System.out.printf("%d → %s\n", year, strResult);
실습 036
+ 초기화를 -999로 했었는데 지금 보니 else 구문에서
오류메세지 호출과 함께 초기화하면 더 좋겠다는 생각이 든다.(23.2.22)
두 정수와 연산자를 사용자 입력받고, 연산 결과 출력.
- 편의상 정수 기반으로 처리.
- hint. 연산자를 담는 변수는 char로 한다.
//상략
/*----------- 방법 ① 연산자를 char로 처리 -------------*/
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int num1, num2, result = -999; // 초기화
char op;
System.out.print("- 첫 번째 정수 입력: ");
num1 = Integer.parseInt(br.readLine());
System.out.print("- 두 번째 정수 입력: ");
num2 = Integer.parseInt(br.readLine());
System.out.print("- 연산자 입력 [+ - * /]: ");
op = (char)System.in.read(); // readLine으로 받아오면 형변환 불가.
if(op == '+') // 실행문이 단일 문장이면 블레이스 생략 가능.
result = num1 + num2;
else if(op == '-')
result = num1 - num2;
else if(op == '*')
result = num1 * num2;
else if(op == '/')
result = num1 / num2;
else
System.out.println("오류: 정확한 값을 입력하세요!");
System.out.printf("%d %c %d = %d\n", num1, op, num2, result) ;
/* ------- 방법 ② (아스키 코드) + - * / == 43, 45, 42, 47 ------*/
/*
if(op == 43)
result = num1 + num2;
else if(op == 45)
result = num1 - num2;
else if(op == 42)
result = num1 * num2;
else if(op == 47)
result = num1 / num2;
else
System.out.println("오류: 정확한 값을 입력하세요!");
*/
실습 037
임의의 정수 3개를 입력받고, 작은 수부터 큰 수 순서대로 출력.
(sort 개념 없이 단순하게 구현한 swap)
//상략
int tmp = 0;
if(n1 > n2) {// n1이 n2보다 크면 자리바꿈
tmp = n2; // 뒤의 값 임시변수에 담기
n2 = n1; //앞의 수를 뒤로 밀고
n1 = tmp; //임시 저장했던 뒤의 갚을 앞에 넣기.
}
if(n1 > n3){// n1이 n3보다 크면 바꿈 (n1의 최소값 보장)
tmp = n3;
n3 = n1;
n1 = tmp;
}
if(n2 > n3){// 나머지 값(n2,n3) 비교.
tmp = n3;
n3 = n2;
n2 = tmp;
}else {
System.out.println("오류!");
}
System.out.printf(">> 처리 결과: %d, %d, %d\n", n1, n2, n3);
실습 038
누적합은 보통 0으로 초기화한다. 초기화는 왜 하는가?
: 기준 값에 계속 더하는 연산이므로 디폴트 값이 있어야한다.
//상략
Scanner sc = new Scanner(System.in);
System.out.print("임의의 정수 5개 입력(공백 구분): ");
int a;
int oddTot = 0;
int evenTot = 0;
for (int i = 0; i < 5; i++ ){
a = sc.nextInt();
if(a % 2 ==0)
evenTot += a;
else
oddTot += a;
}
System.out.printf(">> 짝수의 합은 %d 이고, 홀수의 합은 %d 입니다.\n\n", evenTot, oddTot);
실습 039 (과제)
아스키코드를 활용한 알파벳 입력, 판별, 예외처리.
char a = (char)System.in.read();
read() : 입력 스트림에서 1바이트만 가져온 후, 4바이트 int 타입으로 리턴
//임의의 알파벳 한 문자를 입력받고, 모음인 경우에만 결과 출력.
//대소문자 모두 인식해야 하고, 알파벳 외의 문자가 입력되면 오류를 안내한다.
//...중략
char a = (char)System.in.read(); // int(아스키코드) → char로 강제 형 변환
boolean isVow = (a == 'A'||a == 'E'||a =='I'||a == 'O'||a == 'U')||(a == 'a'||a == 'e'||a =='i'||a == 'o'||a == 'u');
boolean isCons = (65 <= a)&&(a <= 90)||( 97 <= a)&&(a <= 122); // 모음 판별, 자음 판별을 불리언 값으로 담기.
// 연산 및 처리(조건문)
if(isVow)// 모음 판별 변수가 true라면
System.out.println("모음입니다.");
else if (isCons)// 자음 판별 변수가 false라면
System.out.print("");
else // 알파벳이 아니라면
System.out.println("입력 값 오류입니다.");
실습 040 (과제)
아스키코드를 활용한 알파벳 입력, 판별, 예외처리.
read() : 입력 스트림에서 1바이트만 가져온 후, 4바이트 int 타입으로 리턴
char a = (char)System.in.read();
//int타입으로 읽어오기 때문에 char로 명시적 형 변환.
* 대소문자 범위 : (65 ~ 90), (97 ~ 122)
* 소문자 - 대문자 : 32
//상략
// ① 주요 변수
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("알파벳 한 글자를 입력하세요: ");
char a = (char)System.in.read(); // 아스키코드(int)를 형변환
// ② 연산 및 처리(조건문)
if((65 <= a)&&(a <= 90))// 대문자인 경우
System.out.printf("%c → %c\n", a, a + 32);
else if ((97 <= a)&&(a <= 122))// 소문자인 경우
System.out.printf("%c → %c\n", a, a - 32);
else// 알파벳이 아닌 경우
System.out.println("입력 값 오류입니다.");
(출력 결과)
/* -----------[ 출력 결과 ]-------------
알파벳 한 글자를 입력하세요: a
a → A
계속하려면 아무 키나 누르십시오 . . .
알파벳 한 글자를 입력하세요: B
B → b
계속하려면 아무 키나 누르십시오 . . .
알파벳 한 글자를 입력하세요: 3
입력 값 오류입니다.
계속하려면 아무 키나 누르십시오 . . .
--------------------------------------*/
02. switch (다중 선택문)
○ 특징 및 문법
: switch() 괄호 안에 값을 받아 분기 처리한다.
: 수식과 case는 상수이며, 기본적으로 byte, short, int, long 형만 사용 가능하다.
단 jdk 1.7 이후로 char 타입과 String 도 가능해졌다.( final로 정의해야한다.)
(주의! 기업에서는 함부로 버전 업데이트를 하지 않아서 구버전을 사용하는 경우가 많음.)
조건에 맞는 case 부터 실행하고, break가 없으면 조건이 맞지 않아도 다음 케이스를 계속 수행한다.
: case문 뒤에 break; 가 없는 경우 다음 case를 이어서 수행한다. (기본 모델)
: break;가 있다면 해당 지점에서 중지한 후, switch문을 빠져나간다. (일반 모델)
○ 형식 및 구조
switch(수식)
{
case 상수1 : 문장1; [break;]
case 상수2 : 문장2; [break;]
...
[default : 문장 n+1; [break;]] //생략 가능
}
실습 041
이름, 국영수 점수를 입력받고 평균과 등급을 연산한 후 출력.
디폴트 구문 생략을 위해 등급을 F로 초기화 후 설계.
case는 여러개를 병렬로 작성할 수 있다.
public class Test041{
public static void main(String[] args) throws IOException{
String name; // 이름
int kor, eng, mat, tot; // 국,영,수,총점
int avg; // 평균 (편의상 int)
char grade = 'F'; // 등급 (초기화)
// ... 입력 부분 생략
tot = kor + eng + mat;
avg = tot / 3;
switch(avg/10)
{
case 10 : case 9 : grade = 'A'; break;
case 8 : grade = 'B'; break;
case 7 : grade = 'C'; break;
case 6 : grade = 'D'; break;
}
System.out.printf("\n>> 이름:%s, 국영수 점수: %d, %d, %d.\n", name, kor,eng,mat);
System.out.printf(">> 총점: %d, 평균: %d, 등급: %c \n", tot, avg, grade);
}
}
실습 042
1~3 사이의 정수를 사용자 입력 받고, 값 만큼 별 찍기.
① switch 일반 모델
break를 통해 입력값과 일치하는 case만 실행 후 종료한다.
switch(n)
{ case 1 : System.out.println("★"); break;
case 2 : System.out.println("★★"); break;
case 3 : System.out.println("★★★"); break;
default :System.out.println("오류!");
}
② switch 문 기본모델 ( break; 한 번만 사용)
조건에 맞는 case부터 시작해서 break를 만날 때까지 진행하므로 역순으로 번호를 매긴다.
최상단에 default를 작성하면 break가 필요없지만, 잘못된 값이 입력된 경우 하단 모든 조건이 전부 실행된다.
따라서 디폴트 구문은 어디에 위치해도 상관 없지만, 통상 최하단에 작성한다.
switch(n)
{
case 3 : System.out.print("★");
case 2 : System.out.print("★");
case 1 : System.out.print("★\n"); break;
default : System.out.println("오류!");
}
위 코드는 정상 동작하지만,
switch(n)
{
default : System.out.println("오류!");
case 3 : System.out.print("★");
case 2 : System.out.print("★");
case 1 : System.out.print("★\n"); break;
}
이렇게 디폴트 구문이 맨 앞이면, 잘못된 값을 받았을 때 break를
만날 때까지 실행하므로 모든 case가 실행된다.
// 실행 결과
1~3 사이의 정수 한 개 입력 :4
오류!
★★★
실습 043
두 정수와 연산자를 사용자 입력받고, 연산 결과 출력.
// 상략,하략
int n1, n2, result = 0;
정수 2개와 연산 결과를 담을 변수 선언
① case를 아스키 값으로 처리하는 방식
System.out.print("연산자 입력 [+ - * /]: ");
int op = System.in.read();
switch(op)
{
case 43 : result = n1 + n2; break;
case 45 : result = n1 - n2; break;
case 42 : result = n1 * n2; break;
case 47 : result = n1 / n2; break;
default : System.out.println("오류 발생!"); return;
}
System.out.printf("%d %c %d = %d\n", n1, op, n2, result);
* return 이 가지는 의미
① 값 반환 후 → ② 속해있는 메소드 종료
(여기서는 main메소드의 종료 == 프로그램 종료)
② case를 char로 설정하는 방식
char op = (char)System.in.read();
switch(op)
{
case '+' : result = n1 + n2; break;
case '-' : result = n1 - n2; break;
case '*' : result = n1 * n2; break;
case '/' : result = n1 / n2; break;
default : System.out.println("오류 발생!"); return;
}
오늘 느낀 점
if문은 비교적 익숙하지만 switch문은 실제로 사용해본 적이 없어서 새롭고 재밌었다.
대신 문법을 아직 못 외워서 쓸 때마다 찾아봐야한다.
if, switch를 서로 바꿔쓰는 연습을 많이 하고,
디폴트 구문 생략과 초기화, 위치에 따른 특성을 잘 기억해둬야겠다.
'정리 노트 > 쌍용 KDT_(자바 Spring)' 카테고리의 다른 글
23.02.08(수): 반복문 (while, do-while, for) + 다중 for문 (0) | 2023.02.27 |
---|---|
23.02.07(화): 반복문 while / prefix, postfix(증감연산자) (0) | 2023.02.25 |
23.02.03(금): 조건 연산자, 윤년/평년, 조건문 if (4) | 2023.02.16 |
23.02.02(목): 기본 입출력, 연산자(비트,논리,삼항...), 특수 문자 영문 이름 (2) | 2023.02.13 |
23.02.01(수): BufferedReader, read(), skip(), 이름 표기법 (0) | 2023.02.12 |