[JAVA.04] 스캐너(Scanner)와 JAVA의 3요소 및 날짜 클래스🐇

Kama_Code·2023년 6월 17일
1

JAVA

목록 보기
9/20
post-thumbnail
post-custom-banner
  • 이번 시간에 신기한 걸 하나 배운다.
    바로 화면으로부터 사용자에게 입력값을 받는 기능 !

<Step.1> 사용자로부터 화면에서 키보드로 입력 Scanner

  • Scanner 객체생성 : 이름은 변수와 마찬가지로 만들어준다.
    Scanner 객체명 = new Scanner(System.in);
    ▶ 객체를 생성했다면 Scanner 기능을 import해야 사용이 가능하다.

(☞゚ヮ゚)☞ : <컨트롤+쉬프트+O> - 자동 불러오기 단축키

★ 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에 저장된 숫자로 된 문자열을 정수로 변환한다.

<Step.2> JAVA의 3요소

  1. packge 선언부 : 클래스를 종류별로 묶어서 관리하기 위한 선언으로
    디렉토리(폴더)의 의미로 이해하면 된다. 주로 관련있는 클래스끼리
    묶어서 관리하기 위한 용도로 사용된다.
  1. import 선언부 : 내가 만든 클래스에 필요한 자바클래스를 가져다가
    사용하기 위한 선언으로 JDK에서 제공하는 클래스를 사용할 수 있다.
    (개발자들이 라이브러리에 이미 만들어놓은 기능을 불러와서 쓰는 것)
  1. class 선언부 : 자바프로그램은 클래스 단위로 구성되므로 기본적으로
    필요한 부분으로 클래스는 항상 영문 대문자로 시작하고 파일의 확장자는
    .java로 지정하게 된다.
    또한 public으로 선언된 클래스와 파일명은 반드시 일치해야 한다.

<Step.3> 날짜 클래스(Calendar class)

오늘의 날짜와 시간을 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);
// 전체를 +로 구분 지어서 출력함

▶▷ 결과 출력😮

※ 오류가 난다면?
▶ 대소문자 구분하니까 혹시나 소문자로 썼는지 아니면 뒤에 ;가 없는지 확인

<Step.4> 발전을 위한 문제풀이 (kama_code 출제)

  • 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이라는 생소한 단어를 추가해서 썼을까?

  • 가설1] wow가 구정이라면 이 조건으로 프린트가 출력되지 않을까?

'구정' 입력시 아무것도 출력되지 않는다.
왜 그럴까? 답은 간단하다.
★ 같을 수가 없어 false이기에 아무것도 출력되지 않은 것이다.

wow라는 변수는 Scanner에서 입력한 값을 대입(넣는다)한다.
wow라는 변수 안에 값을 그저 넣을 뿐이지
wow라는 변수 그 자체는 될 수 없는 것이다.

wow라는 액체를 담을 수 있는 통(공간)이 있다.
이 통에 오렌지쥬스를 담으면 오렌지쥬스와 wow가 같아 지는가??
이렇게 생각해보면 쉽게 답이 나올 것이다.

▶ 결론은 equals() 라는 메소드를 써서
wow라는 물을 담을 수 있는 통(공간) 안에 있는 내용물을 비교하는 것이다.
equals() 메소드는 객체끼리의 내용물을 비교할 수 있게 하는 함수이다.

# 마무리
날짜는 엄청나게 유용한 정보이다.
날짜를 통해 몇 초 몇 분에만 열리는 프로그램을 만들 수도 있고
프로그램에 '타이밍'이라는 엄청난 기능를 추가할 수도 있는 것이다.

달력을 만드는 건 쉬운 것이 아니다.
이 외에 우리가 아직 배우지 않은 반복문, 조건문을 통해
윤달, 음력도 계산하고 공휴일, 법정공휴일도 출력할 수 있는 프로그램을 만들 수 있다.
하지만 쉽지 않은 계산이 될 것이다.

이번 기회에 각 직종의 달력 만드시는 분께 칭찬과 격려를 보내 보는 것이 어떤가?😃

profile
[Java SQL HTML CSS JS Studying] 발전을 꿈꾸며 이상을 실현합니다
post-custom-banner

0개의 댓글