○ 실습
사용자로부터 년, 월, 일을 입력 받아 해당 날짜의 요일을 출력하는 프로그램을 구현한다.
단, 달력 클래스(Calender)는 사용하지 않는다.
또한, 클래스의 개념을 활용하여 작성할 수 있도록 한다.
(→ WeekDay 클래스 설계)
그리고 배열의 개념도 적용시켜 작성할 수 있도록 한다.
접근제어지시자의 개념도 확인하여 작성할 수 있도록 한다.
최종적으로...
WeekDay 클래스 설계를 통해 Test099 클래스의 main() 메소드가 정상적으로 프로그램 실행될 수 있도록 한다.
실행 예)
년 월 일 입력(공백 구분) : 2023 9 7
>> 2023년 9월 7일 → 목요일
// 계속하려면 아무 키나 누르세요...
※ Hint
- 1년 1월 1일은 월요일
- 1년은 365일이 아니다
* 2월의 마지막 날짜가 29일 → 윤년
* 2월의 마지막 날짜가 28일 → 평년
- 윤년의 판별 조건 : 년도가 4의 배수이면서 100의 배수가 아니거나, 400의 배수이면 윤년, 그 이외의 년도는 평년
import java.util.Scanner;
class WeekDay
{
// 주요 변수 선언 → 속성
private int y, m, d; //-- 사용자가 입력한 연, 월, 일을 담아낼 변수
// 메소드 정의 → 기능 : 연, 월, 일 입력받기
public void input()
{
Scanner sc = new Scanner(System.in);
System.out.print("년 월 일 입력(공백 구분) : "); //-- 2024 3 19
y = sc.nextInt(); //-- 2024
m = sc.nextInt(); //-- 3
d = sc.nextInt(); //-- 19
}
// 메소드 정의 → 기능 : 요일 산출하기
//public void week()
//public int week()
public String week()
{
// 각 월의 마지막 날짜(각 월의 최대값)를 배열 형태로 구성
int[] months = {31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 날 수를 종합할 변수
int nalsu;
// 요일 확인 변수
int w;
// 요일 타이틀을 배열형태로 구성
String[] weekNames = {"일", "월", "화", "수", "목", "금", "토"};
// 윤년에 따른 2월의 날 수 계산
// 입력 년도가 윤년이라면... 2월의 마지막 날짜를 29일로 설정
// 입력 년도가 평년이라면... 2월의 마지막 날자를 28일로 설정
if (y%4==0 && y!=100 || y%400==0) //-- 입력 년도가 윤년이라면...
{
// 2월의 마지막 날짜를 29일로 설정
months[1] = 29;
}
else //-- 입력 년도가 윤년이 아니라면... 즉, 평년이라면...
{
// 2월의 마지막 날짜를 28일로 설정
months[1] = 28;
}
// ex) 2024 3 19 → 1.1.1 ~ 2023.12.31
// ① 1년 1월 1일부터 입력받은 년도의 이전년도 12월 31일 까지의 날 수 계산
// -------------
// y
// ------------------------
// y-1
nalsu = (y-1)*365 + (y-1)/4 - (y-1)/100 + (y-1)/400;
// ---------
// 1년기본주기 --------
// 4년마다+1 ---------
// 100년마다+1(X)
// ---------
// 400년마다+1
// 확인(테스트)
//System.out.println("날 수 : " + nalsu);
//-->> 년 월 일 입력(공백 구분) : 2024 3 19
// 날 수 : 738885
// ------
// 1년 1월 1일 ~ 2023년 12월 31일 까지의 날 수
// ② 입력받은 월의 이전 월 까지의 날 수 계산 후
// 이 결과를 1번의 결과에 더하는 연산
// ex) 2024 3 19 → 2024.1.1 ~ 20234.2.29
for (int i=0; i<(m-1); i++)
nalsu += months[i];
// 확인(테스트)
//System.out.println("날 수 : " + nalsu);
//--==>> 년 월 일 입력(공백 구분) : 2024 3 19
// 날 수 : 738945
// ------
// 73885 + 31 + 29 = 738945
// 1년 1월 1일 ~ 2024년 2월 29일 까지의 날 수
// ③ 입력받은 일의 날짜만큼 날 수 계산 후
// 이 결과를 2번의 결과에 더하는 연산
// ex) 2024 3 19 → + 19
nalsu += d; //-- nalsu를 d 만큼 증가
// 확인(테스트)
//System.out.println("날 수 : " + nalsu);
// --==>> 년 월 일 입력(공백 구분) : 2024 3 19
// 날 수 : 738964
// ------
// 738945 + 19 = 738964
//--==>> 1. 1. 1 ~ 20234.3.19 총~~~~ 날짜수
//---------------------------------------------------------여기까지 수행하면 날 수 연산 끝~!!!
// 무슨 요일인지 확인하기 위한 연산
w = nalsu % 7; //-- 전체 날 수 % 7 == 0 → 일요일
// 전체 날 수 % 7 == 1 → 월요일
// 전체 날 수 % 7 == 2 → 화요일
// :
// 테스트(확인)
//System.out.println("w : " + w);
//--==>> 년 월 일 입력(공백 구분) : 2024 3 19
// w : 2
// -- → 전체날수 % 7 == 2 → 화요일
//return w;
return weekNames[w];
}
// 메소드 정의 → 기능 : 결과 출력하기
public void print(String day)
{
System.out.printf(">> %d년 %d월 %d일 → %s요일\n",y,m,d,day);
}
}
public class Test099
{
public static void main(String[] args)
{
/*
ob.setWeek();
ob.changeMonth();
ob.changeYear();
ob.calDay();
ob.getWeek(ob.calWeek());*/
// WeekDay 클래스 기반 인스턴스 생성
WeekDay wd = new WeekDay();
// 입력 메소드 호출
wd.input();
// 요일 산출 메소드 호출
String result = wd.week();
// 최종 결과 출력 메소드 호출
wd.print(result);
}
}
○ 실습
사용자로부터 년, 월, 일을 입력 받아 해당 날짜의 요일을 출력하는 프로그램을 구현한다.
단, 달력 클래스(Calender)는 사용하지 않는다.
또한, 클래스의 개념을 활용하여 작성할 수 있도록 한다.
(→ WeekDay 클래스 설계)
그리고 배열의 개념도 적용시켜 작성할 수 있도록 한다.
접근제어지시자의 개념도 확인하여 작성할 수 있도록 한다.
최종적으로...
WeekDay 클래스 설계를 통해 Test099 클래스의 main() 메소드가 정상적으로 프로그램 실행될 수 있도록 한다.
실행 예)
년 월 일 입력(공백 구분) : 2023 9 7
>> 2023년 9월 7일 → 목요일
// 계속하려면 아무 키나 누르세요...
※ Hint
- 1년 1월 1일은 월요일
- 1년은 365일이 아니다
* 2월의 마지막 날짜가 29일 → 윤년
* 2월의 마지막 날짜가 28일 → 평년
- 윤년의 판별 조건 : 년도가 4의 배수이면서 100의 배수가 아니거나, 400의 배수이면 윤년, 그 이외의 년도는 평년
import java.util.Scanner; class WeekDay { // 주요 변수 선언 → 속성 private int y, m, d; //-- 사용자가 입력한 연, 월, 일을 담아낼 변수 // 메소드 정의 → 기능 : 연, 월, 일 입력받기 public void input() { Scanner sc = new Scanner(System.in); System.out.print("년 월 일 입력(공백 구분) : "); //-- 2024 3 19 y = sc.nextInt(); //-- 2024 m = sc.nextInt(); //-- 3 d = sc.nextInt(); //-- 19 } // 메소드 정의 → 기능 : 요일 산출하기 //public void week() //public int week() public String week() { // 각 월의 마지막 날짜(각 월의 최대값)를 배열 형태로 구성 int[] months = {31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // 날 수를 종합할 변수 int nalsu; // 요일 확인 변수 int w; // 요일 타이틀을 배열형태로 구성 String[] weekNames = {"일", "월", "화", "수", "목", "금", "토"}; // 윤년에 따른 2월의 날 수 계산 // 입력 년도가 윤년이라면... 2월의 마지막 날짜를 29일로 설정 // 입력 년도가 평년이라면... 2월의 마지막 날자를 28일로 설정 if (y%4==0 && y!=100 || y%400==0) //-- 입력 년도가 윤년이라면... { // 2월의 마지막 날짜를 29일로 설정 months[1] = 29; } else //-- 입력 년도가 윤년이 아니라면... 즉, 평년이라면... { // 2월의 마지막 날짜를 28일로 설정 months[1] = 28; } // ex) 2024 3 19 → 1.1.1 ~ 2023.12.31 // ① 1년 1월 1일부터 입력받은 년도의 이전년도 12월 31일 까지의 날 수 계산 // ------------- // y // ------------------------ // y-1 nalsu = (y-1)*365 + (y-1)/4 - (y-1)/100 + (y-1)/400; // --------- // 1년기본주기 -------- // 4년마다+1 --------- // 100년마다+1(X) // --------- // 400년마다+1 // 확인(테스트) //System.out.println("날 수 : " + nalsu); //-->> 년 월 일 입력(공백 구분) : 2024 3 19 // 날 수 : 738885 // ------ // 1년 1월 1일 ~ 2023년 12월 31일 까지의 날 수 // ② 입력받은 월의 이전 월 까지의 날 수 계산 후 // 이 결과를 1번의 결과에 더하는 연산 // ex) 2024 3 19 → 2024.1.1 ~ 20234.2.29 for (int i=0; i<(m-1); i++) nalsu += months[i]; // 확인(테스트) //System.out.println("날 수 : " + nalsu); //--==>> 년 월 일 입력(공백 구분) : 2024 3 19 // 날 수 : 738945 // ------ // 73885 + 31 + 29 = 738945 // 1년 1월 1일 ~ 2024년 2월 29일 까지의 날 수 // ③ 입력받은 일의 날짜만큼 날 수 계산 후 // 이 결과를 2번의 결과에 더하는 연산 // ex) 2024 3 19 → + 19 nalsu += d; //-- nalsu를 d 만큼 증가 // 확인(테스트) //System.out.println("날 수 : " + nalsu); // --==>> 년 월 일 입력(공백 구분) : 2024 3 19 // 날 수 : 738964 // ------ // 738945 + 19 = 738964 //--==>> 1. 1. 1 ~ 20234.3.19 총~~~~ 날짜수 //---------------------------------------------------------여기까지 수행하면 날 수 연산 끝~!!! // 무슨 요일인지 확인하기 위한 연산 w = nalsu % 7; //-- 전체 날 수 % 7 == 0 → 일요일 // 전체 날 수 % 7 == 1 → 월요일 // 전체 날 수 % 7 == 2 → 화요일 // : // 테스트(확인) //System.out.println("w : " + w); //--==>> 년 월 일 입력(공백 구분) : 2024 3 19 // w : 2 // -- → 전체날수 % 7 == 2 → 화요일 //return w; return weekNames[w]; } // 메소드 정의 → 기능 : 결과 출력하기 public void print(String day) { System.out.printf(">> %d년 %d월 %d일 → %s요일\n",y,m,d,day); } } public class Test099 { public static void main(String[] args) { /* ob.setWeek(); ob.changeMonth(); ob.changeYear(); ob.calDay(); ob.getWeek(ob.calWeek());*/ // WeekDay 클래스 기반 인스턴스 생성 WeekDay wd = new WeekDay(); // 입력 메소드 호출 wd.input(); // 요일 산출 메소드 호출 String result = wd.week(); // 최종 결과 출력 메소드 호출 wd.print(result); } }