- 이번 시간에 신기한 걸 하나 배운다.
바로 화면으로부터 사용자에게 입력값을 받는 기능 !
★ System.in
키보드에서 사용자로부터 키 입력을 받기 위해서는 System.in을 사용한다.
Scanner하면 따라오는 말이니까 통으로 눈에 익혀놓으면 좋다!
※ 입력을 받고 까먹어버리면 의미가 없으니 다음엔 기억이 자연스럽게 필수로 따라온다.
- Scanner scan = new Scanner(System.in);
이렇게 scan이라는 이름을 가진 입력값을 받는 기능을 만들어주었다.
★ 자주 쓰는 4가지
- String str = scan.next(); : 입력받은 문자열 값(변수: scan)을
문자열 타입(변수:str)으로 기억하여 반환한다.- int num = scan.nextInt(); : 입력받은 정수 값(변수: scan)을
정수형 타입(변수:num)으로 기억하여 반환한다.- double dnum = scan.nextDouble(); : 입력받은 실수 값(변수: scan)을
실수형 타입(변수:dnum)으로 기억하여 반환한다.- String num2 = scan.nextLine(); : 입력받은 한 줄 전체 값(변수: scan)을
문자열 타입(변수:dnum)으로 기억하여 반환한다. ('\n'포함 되어 있다.)
☆ 자주 안쓰는 나머지
- byte btr = scan.nextByte(); : 입력받은 byte 값(변수: scan)을
byte 타입(변수:btr)으로 기억하여 반환한다.- short shr = scan.nextShort(); : 입력받은 short 값(변수: scan)을
short 타입(변수:shr)으로 기억하여 반환한다.- long lng = scan.nextLong(); : 입력받은 long 값(변수: scan)을
long 타입(변수:lng)으로 기억하여 반환한다.- float flo = scan.nextFloat(); : 입력받은 float 값(변수: scan)을
float 타입(변수:flo)으로 기억하여 반환한다.
★ String input = scan.nextLine();
ㄴnextLine()은 한 줄 전체를 받기에 편리함으로 가장 많이 쓰이는 Scanner이다.
★ int num = Interger.parseInt(input);
ㄴ만약 input에 저장된 값이 숫자라면 input에 저장된 숫자로 된 문자열을 정수로 변환한다.
- packge 선언부 : 클래스를 종류별로 묶어서 관리하기 위한 선언으로
디렉토리(폴더)의 의미로 이해하면 된다. 주로 관련있는 클래스끼리
묶어서 관리하기 위한 용도로 사용된다.
- import 선언부 : 내가 만든 클래스에 필요한 자바클래스를 가져다가
사용하기 위한 선언으로 JDK에서 제공하는 클래스를 사용할 수 있다.
(개발자들이 라이브러리에 이미 만들어놓은 기능을 불러와서 쓰는 것)
- class 선언부 : 자바프로그램은 클래스 단위로 구성되므로 기본적으로
필요한 부분으로 클래스는 항상 영문 대문자로 시작하고 파일의 확장자는
.java로 지정하게 된다.
또한 public으로 선언된 클래스와 파일명은 반드시 일치해야 한다.
오늘의 날짜와 시간을 Date클래스를 통해 가져온다.
- Date toDayofDate = new Date();
System.out.println("오늘 날짜:" + toDayofDate);
SimpleDateFormat 클래스를 이용하여 우리가 주로 사용하는
날짜포멧인 년-월-일 시:분:초 형태로 변환한 후 출력한다.
- SimpleDateFormat wetime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
< HH : 대문자 24시간 기준, hh : 소문자 12시간 기준 >
- 문자열 반환형 toDaywetime 변수에
위에서 만들어준 변수 wetime의 날짜 포맷 형식을 넣는다.
String toDaywetime = wetime.format(toDayofDate);
System.out.println("변형된 날짜:" + toDaywetime);
- 어제 날짜 구하기 (컨트롤+쉬프트+O) - 자동 임포트 필요
Calendar yes = Calendar.getInstance(); // 객체 생성: 달력 yes
yes.add(Calendar.DATE, -1); // 오늘로부터 -1한 값을 yes에 저장
String wow = wetime.format(yes.getTime()); // wow String으로 저장
System.out.println("어제: " + wow); // 출력하기
- 지난달 날짜 구하기 (컨트롤+쉬프트+O) - 자동 임포트 필요
Calendar monz = Calendar.getInstance(); // 객체 생성: 달력 monz
monz.add(Calendar.MONTH, -1); // 이번 달로부터 -1한 값을 monz에 저장
String wow1 = wetime.format(monz.getTime()); // wow1 String으로 저장
System.out.println("지난 달: " + wow1); // 출력하기
- 1년전 날짜 구하기 (컨트롤+쉬프트+O) - 자동 임포트 필요
Calendar yea = Calendar.getInstance(); // 객체 생성: 달력 yea
yea.add(Calendar.YEAR, -1); // 이번 년도로부터 -1한 값을 yea에 저장
String wow2 = wetime.format(yea.getTime()); // wow2 String으로 저장
System.out.println("전년도: " + wow2); // 출력하기
Calendar cal = Calendar.getInstance(); //cal이라는 달력 객체 생성
System.out.println(cal); //cal을 출력하면
//### ▷ 엄청나게 긴 달력에 대한 정보가 출력된다.
//### java.util.GregorianCalendar[time=1687012935398..]
Calendar oday = Calendar.getInstance(); // 객체 생성: 달력 oday
oday.add(Calendar.DATE, +1000); // 오늘로부터 -1000한 값
String chunil = okDate.format(oday.getTime()); // chunil String으로 저장
Calendar yday = Calendar.getInstance();
yday.add(Calendar.YEAR, -10); // 이번년도에서 -10 한 값
String sib = okDate.format(yday.getTime()); // sib String으로 저장
int year = cal.get(Calendar.YEAR); // 올해를 year 변수에 넣음
int month = cal.get(Calendar.MONTH) + 1; // 이번 달을 month 변수에 넣음
int date = cal.get(Calendar.DATE); // 오늘을 date 변수에 넣음
int dayweek = cal.get(Calendar.DAY_OF_WEEK); // 요일을 dayweek 변수에 넣음
int hour = cal.get(Calendar.HOUR); // 시간을 hour 변수에 넣음
int minute = cal.get(Calendar.MINUTE); // 분을 minute 변수에 넣음
int second = cal.get(Calendar.SECOND); // 초을 second 변수에 넣음
System.out.println(year+ "+" + month+ "+"
+ date+ "+" + dayweek+ "+" + hour+ "+" + minute+ "+" + second);
// 전체를 +로 구분 지어서 출력함
▶▷ 결과 출력😮
※ 오류가 난다면?
▶ 대소문자 구분하니까 혹시나 소문자로 썼는지 아니면 뒤에 ;가 없는지 확인
- nextline을 통해 사용자로부터 입력값을 받는다.
<구정>을 입력하면 "구정은 음력 1월 1일입니다."가 나오게 하고
<천일>을 입력하면 년-월-일-시-분-초 12시간 형식으로 오늘에서 +1000일 후가 나오게 하며
<10년>을 입력하면 년-월-일-시-분-초 12시간 형식으로 언제든 10년전 날짜가 나온다.
<웃긴더하기>를 입력하면 년,월,일,요일,시간,분,초를 모두 더한 값을 정수로 나오게
출력하게 되는 프로그램 만들기
Scanner sc = new Scanner(System.in); // 스캐너 객체 생성
String wow = sc.nextLine(); // 입력한 한 줄을 wow 참조값에 저장
Date toDate = new Date(); // 날짜 객체 생성
SimpleDateFormat okDate = new SimpleDateFormat("yyyy년 MM월 dd일 hh시 mm분 ss초");
//년도-월-일-시-분-초 형식으로 변환하여 okDate 저장
Calendar cal = Calendar.getInstance(); //cal이라는 달력 객체 생성
int year = cal.get(Calendar.YEAR); // 올해를 year 변수에 넣음
int month = cal.get(Calendar.MONTH) + 1; // 이번 달을 month 변수에 넣음
int date = cal.get(Calendar.DATE); // 오늘을 date 변수에 넣음
int dayweek = cal.get(Calendar.DAY_OF_WEEK); // 요일을 dayweek 변수에 넣음
int hour = cal.get(Calendar.HOUR); // 시간을 hour 변수에 넣음
int minute = cal.get(Calendar.MINUTE); // 분을 minute 변수에 넣음
int second = cal.get(Calendar.SECOND); // 초을 second 변수에 넣음
if(wow.equals("구정"))
System.out.println("구정은 음력 1월 1일입니다.");
if(wow.equals("천일"))
System.out.println("1000일 후: " + chunil);
if(wow.equals("10년"))
System.out.println("10년 전: " + sib);
if(wow.equals("웃긴더하기"))
System.out.println(year+month+date+dayweek+hour+minute+second);
}
}
▶ '구정'을 입력하면?
▶ '천일'을 입력하면?
▶ '10년'을 입력하면?
▶ '웃긴더하기'를 입력하면?
→ 변수로 저장을 했기에 그 때 그 때 값이 다른 값이 나온다.
정말 프로그래밍이라는게 매력적이지 않은가?
★ 여기서 배우지 않은 것이 있는데 바로 조건문(if)이다.
엄~청 중요하기에 미리 예습으로 말을 하자면..
형식은 if(조건1) { 실행 } 이다.
if 안의 조건1의 내용을 만족(true)하면 실행하고 만족하지 않으면 실행되지 않는다.
여기서 의문이 드는 사람도 있을 것이다.
단순명료하게 (wow == "구정")만 하면 되지
왜 equals이라는 생소한 단어를 추가해서 썼을까?
'구정' 입력시 아무것도 출력되지 않는다.
왜 그럴까? 답은 간단하다.
★ 같을 수가 없어 false이기에 아무것도 출력되지 않은 것이다.
wow라는 변수는 Scanner에서 입력한 값을 대입(넣는다)한다.
wow라는 변수 안에 값을 그저 넣을 뿐이지
wow라는 변수 그 자체는 될 수 없는 것이다.
wow라는 액체를 담을 수 있는 통(공간)이 있다.
이 통에 오렌지쥬스를 담으면 오렌지쥬스와 wow가 같아 지는가??
이렇게 생각해보면 쉽게 답이 나올 것이다.
▶ 결론은 equals() 라는 메소드를 써서
wow라는 물을 담을 수 있는 통(공간) 안에 있는 내용물을 비교하는 것이다.
equals() 메소드는 객체끼리의 내용물을 비교할 수 있게 하는 함수이다.
# 마무리
날짜는 엄청나게 유용한 정보이다.
날짜를 통해 몇 초 몇 분에만 열리는 프로그램을 만들 수도 있고
프로그램에 '타이밍'이라는 엄청난 기능를 추가할 수도 있는 것이다.
달력을 만드는 건 쉬운 것이 아니다.
이 외에 우리가 아직 배우지 않은 반복문, 조건문을 통해
윤달, 음력도 계산하고 공휴일, 법정공휴일도 출력할 수 있는 프로그램을 만들 수 있다.
하지만 쉽지 않은 계산이 될 것이다.
이번 기회에 각 직종의 달력 만드시는 분께 칭찬과 격려를 보내 보는 것이 어떤가?😃