오늘 배운 내용
01. 삼항 연산자
02. 윤년과 평년
03. 조건문 if
01. 삼항 연산자
실습 028
정수를 사용자 입력받고, 양수인지 음수인지 0인지 판별 후 출력하는 프로그램.
입력은 BufferedReader 로, 기능은 조건 연산자로 구현한다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Test028{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("임의의 정수 입력: ");
int num = Integer.parseInt(br.readLine());
String strResult;
strResult = (num == 0) ? "0" : ((num > 0) ? " 양수" : "음수") ;
System.out.printf("%d → %s\n\n", num, strResult);
}
}
실습 029 ~ 029_2
임의의 문자를 사용자 입력 받는다.
대문자면 소문자로, 소문자면 대문자로, 알파벳이 아니면 그대로 출력한다.
참고) 문자 'A' -'Z'의 아스키 코드는 (65 ~ 90) , 'a' - 'z' 는 (97 ~ 122)
① 메소드로 변환하는 방식 : .isUpperCase() .toLowerCase() .toUpperCase()
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Test029{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("한 문자 입력: ");
char ch;
ch = (char)System.in.read(); // 앞 한 글자만 가져온다.(형변환)
int temp = (int)ch; // 가져온 값의 아스키 코드 담는 임시 변수
char result;
result = ( 64 < temp && temp < 91) ? ( Character.isUpperCase(ch) ? Character.toLowerCase(ch) : Character.toUpperCase(ch) ): ch;
System.out.printf("%c → %c\n", ch , result);
/*
한 문자 입력: A
A → a
계속하려면 아무 키나 누르십시오 . . .
*/
}
}
② 아스키 코드 값으로 변환하는 방식 (대소문자 차이만큼 빼기)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Test029_1{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("한 문자 입력: ");
int temp = System.in.read(); // 아스키 값을 담고 연산에 사용할 임시 변수.
boolean isAlpha = (65 <= temp && temp <= 90) || (97 <= temp && temp <= 122) ? true : false; // 알파벳 판별 결과 (불리언)
char result; // 최종 결과 값
result = (isAlpha == true) ? ((65 <= temp && temp <= 90) ? (char)(temp + 32) : (char)(temp - 32)) : (char)temp ;
System.out.printf("%c → %c\n", (char)temp , result);
// ★ 강사님 코드
// result = (ch >= 'A' && ch <= 'Z') ? (char)(ch + 32) : ((ch >= 'a' && ch <= 'z') ? (char)(ch - 32) : (ch));
// ------------------------ ---------------- --------------------------------------------------
// ch는 대문자인가? 맞으면 소문자로 틀리면서, 소문자인가? 맞으면 대문자로. 그것도 아니면 원본.
// 아스키가 숫자라서 숫자로만 연산했는데, ch 자체로 비교 및 연산이 가능하다.
}
}
③ 아스키 코드 (대소문자 차이(32) 빼기) + 강사님 코드 참고 리팩토링
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Test029_2{ //최종
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("한 문자 입력: ");
char ch = (char)System.in.read(); // 아스키로 들어오는 값의 원본 char
char result; // 결과 값
result = (ch >= 'A' && ch <= 'Z') ? (char)(ch + 32) : ((ch >= 'a' && ch <= 'z') ? (char)(ch - 32) : (ch));
System.out.printf("%c → %c\n", ch , result);
}
}
02. 윤년과 평년
+) 윤년과 평년은 꼭 알아두자!
회사에서 기본으로 보는 게시판 짜기, 일정관리 등에 꼭 필요한 개념.
2월이 28일까지 있는 해 : 평년
2월이 29일까지 있는 해 : 윤년
1년은 정확하게는 365일이 아니다.
지구가 태양을 돌아 제자리로 돌아오는데 대략 365일이 걸린다.
약간씩 늦어지길래 ..
그래서 4년주기로 하루를 더하자! (366일) 2월을 29일까지 !
>> 이러니 또 빨라지길래..
그럼 100년 주기로는 더하기를 하지 말자. (스킵)
>> 미묘하게 느림
>> 그러다가 400년 마다 한 번 더하자. (여기까지가 윤년과 평년의 규칙.)
실습 030
임의의 '연도'를 사용자 입력 받는다.
윤년인지 평년인지 판별하고 출력하는 프로그램 구현.
조건 : BufferedReader 와 조건 연산자를 활용한다.
2월이 28일까지 있는 해 : 평년 common year
2월이 29일까지 있는 해 : 윤년 leap year
윤년의 판별 조건:
(연도가 4의 배수면서) && (100의 배수가 아니면서) || (400의 배수일 때.)
---------------- 논리 and -------------------- 400의 배수면 무조건 true! 별개로 처리.
평년 : 그 외 모두 평년.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Test030 { // ① 내 코드
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("임의의 연도 입력: ");
int year = Integer.parseInt(br.readLine());
boolean isLeap = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
String strResult; // 결과값
strResult = isLeap ? "윤년" : "평년";
System.out.printf("%d년 → %s\n", year ,strResult);
/*결과
임의의 연도 입력: 2000
2000년 → 평년
계속하려면 아무 키나 누르십시오 . . .
*/
}
}
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Test030_1 { // ② 강사님 코드
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int year;
String strResult;
System.out.print("임의의 연도 입력: ");
year = Integer.parseInt(br.readLine());
strResult = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0) ? "윤년" : "평년";
System.out.printf("%d년 → %s\n", year ,strResult);
}
}
+) 2월 16일. 거의 2주 지나서 다시 보니..요즘은
변수, 연산, 결과 순서대로 클래스를 설계하고 있지만 이 때는 생각 흐름대로 작성했던 게 잘 보인다.
그리고 파이썬으로 알고리즘했던 경험 때문인지 자연스럽게 불리언 변수를 따로 선언 짧게 구성한 점도 눈에 띈다.
며칠만 지나도 내 코드가 새롭게 보여서 신기하고 즐겁다!
03. 조건문 if
제어문은 실행 흐름을 컨트롤하며 조건에 따른 프로그램 분기를 만든다.
if문, 조건 연산자, 복합 if문 (중첩 if) , switch 가 있다.
조건문(==제어문, 분기문) 이라고 한다.
① if (boolean) { ... }
: 조건식은 항상 불리언 값이어야한다. true면 실행, false면 건너뛴다.
② if ~ else
if ~ else if ~ else :
(else내부에 다시 if로 시작하는 중첩 문을 축약한 else if. 수 제한 없이 사용가능)
if문은 종류와 상관없이 무조건 한 블럭만 실행한다.
if부터 else에 이르기까지 상단 조건에 맞지 않을 때 계속 아래로 내려가며 조건을 확인한다.
모든 블럭에 해당하지 않으면 마지막의 else 부분을 실행한다.
③ 조건문에서 중괄호는 (하나의 문장일 때)는 생략가능.
(== 중첩이 아닐때)
// ex. 단일 if, if ~ else, if ~ else if ~ else 모두 한 문장.
if()
System.print();
else if()
System.print();
else
System.print();
+) switch (조건문, 제어문, 분기문) / 가볍게 언급만.
: else처럼 default 키워드도 문법적으로 필수는 아니다.
차이점은 '케이스 위치를 아무데나 둬도 상관 없다' 지만 보통 최하단에 배치한다.
실습 031
이름, 국어점수, 영어점수, 수학점수를 사용자 입력 받고 출력한다.
- 등급은 평균 점수를 기준으로 처리한다.
- 입출력 구현은 BufferedReader , printf() 를 사용한다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Test031{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("당신의 이름은?: ");
String strName = br.readLine();
System.out.print("당신의 국어 점수는?: ");
int nKor = Integer.parseInt(br.readLine());
System.out.print("당신의 영어 점수는?: ");
int nEng = Integer.parseInt(br.readLine());
System.out.print("당신의 수학 점수는?: ");
int nMat = Integer.parseInt(br.readLine());
int nTot = nKor + nEng + nMat;
double fAvg = (nTot / 3.0);// nTot/3 에서 수정.
char cGrade;//(연산 후 담으면 의미 X)우항부터 생각!
if(fAvg >= 90){
cGrade = 'A';
}else if( fAvg >= 80){ //( fAvg >= 80 && fAvg < 90 ) 비효율적.
cGrade = 'B'; //if를 지나서 이미 90미만 조건 포함하고 있음
}else if( fAvg >= 70 ){
cGrade = 'C';
}else if( fAvg >= 60 ){
cGrade = 'D';
}else
cGrade = 'F';
// (조건에 맞는 게 없으면 아무것도 실행하지 않고 스킵, 종료.)
System.out.printf("\n>> 당신의 이름은: %s 입니다.\n", strName);
System.out.printf(">> 국어 점수는 %d,\n>> 영어 점수는 %d,\n>> 수학 점수는 %d,\n", nKor , nEng, nMat);
System.out.printf(">> 총점은 %d이고, 평균은 %.2f 입니다.\n", nTot, fAvg);
System.out.printf(">> 등급은 %c 입니다.\n\n", cGrade);
}
}// end class Test031 ---> 친절한 컨벤션
/* ----------------------------------
>> 당신의 이름은: 우주 입니다.
>> 국어 점수는 90,
>> 영어 점수는 80,
>> 수학 점수는 70,
>> 총점은 240이고, 평균은 80.00 입니다.
>> 등급은 B 입니다.
계속하려면 아무 키나 누르십시오 . . .
------------------------------------*/
// else 구문을 쓰지 않고 double fAvg = 'F' 로 초기화(할당) 하면 오류없이 실행된다.
// 만약 그냥 else 블럭이 없다면 오류.(지역변수는 꼭 초기화 해야한다. 담긴 값이 없으면 안 된다.)
// + 만약 각 분기마다 값 할당이 아니라 출력문만 적는다면 else가 없어도 괜찮다.
실습 032
임의의 정수를 사용자 입력 받아 홀수/짝수 판별 및 출력.
- 단일 if 구문을 사용한다
- 입출력 구현은 BufferedReader , printf() 를 사용한다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Test032{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("- 임의의 정수 입력: ");
int num = Integer.parseInt(br.readLine());
String strResult = "홀수"; // 디폴트 값을 홀수로 초기화
if(num % 2 == 0)
strResult = "짝수";
System.out.printf("\n>> %d은(는) %s 입니다.\n", num, strResult);
}
} /* ----------------------------------
- 임의의 정수 입력: 26
>> 26은(는) 짝수 입니다.
계속하려면 아무 키나 누르십시오 . . .
------------------------------------*/
// if를 2개 사용해서 홀/짝을 나눌 수 있지만 논리적으로 좋지 않음.
// 둘 다 들여다보는 시간 낭비 + 값 간섭, 중복 가능성
// 물론 단일 if를 여러개 써야하는 상황도 있을 수 있지만, (조건 체크 필요 시)
// 논리적으로 하나의 구조라면 분기라는 기능에 맞게 한 문장으로 구성하는 게 좋다.
+) 번외
잘 모르는 코드( 새로 배웠거나, 다른 사람 풀이 등) 공부할 때
보면서 베끼지 말기. 공부 안 됨. 외워서 쳐보고 모를때만 보기.
+ 어차피 연차 찰 수록 코딩 잘 안 하게 됨
(내가 이미 썼던 코드 모아두고 라이브러리처럼 쓰게 됨)
오늘 느낀 점
삼항연산자 문법을 대충 알고는 있었지만 실제로 써 본적은 없었다.
눈으로만 봤을 때는 살짝 복잡해보였는데 생각보다 간단하고 재밌었다.
윤년, 평년에 대해 자세히 배운 것도 좋았다. 그 동안 윤달은 하루 더 있다! 정도만 알고 있었는데
어떻게 정해졌는 지 비하인드가 재밌어서 기억에 잘 남았다.
예전에 앱개발 강의를 들으며 일정 관리 어플을 만들어보고 싶다는 생각을 했었는데
잊고 있었다.. 마침 필요한 개념을 배워서 반가웠다. 잘 기억해뒀다가 적용해보고 싶다.
'정리 노트 > 쌍용 KDT_(자바 Spring)' 카테고리의 다른 글
23.02.07(화): 반복문 while / prefix, postfix(증감연산자) (0) | 2023.02.25 |
---|---|
23.02.06(월): 조건문 if, switch (다중 선택문) (0) | 2023.02.23 |
23.02.02(목): 기본 입출력, 연산자(비트,논리,삼항...), 특수 문자 영문 이름 (2) | 2023.02.13 |
23.02.01(수): BufferedReader, read(), skip(), 이름 표기법 (0) | 2023.02.12 |
23.01.31(화) : 연산자, 변수와 자료형, 상수, 진수와 접두사 (0) | 2023.02.11 |