package k20231207;
import java.util.Iterator;
public class CalendarTest {
// 메소드의 형식, []로 묶는 내용은 생략이 가능하다.
// [접근 권한 지정자] [static] 리턴타입 메소드이름([인수, ...]) { //메소드의 머리
// 메소드가 실행할 문장;
// ...
// [return 값;]
// } // {} 블록을 메소드의 몸통이라고 한다.
// 접근 권한 지정자
// private: 현재 클래스 외부에서 실행할 수 없다.
// protected: 현재 클래스와 현재 클래스를 상속받은 자식 클래스에서만 실행할 수 있다.
// package: 접근 권한 지정자를 생략하면 package 권한으로 간주된다. default로 불린 적이 있다.
// 같은 패키지에서는 public처럼 사용되고 다른 패키지에서는 private 처럼 사용된다
// public: 현재 클래스 내부, 외부 어디에서나 자유롭게 실행할 수 있다.
// static (정적) 으로 선언 메소드는 메소드가 작성된 클래스의 객체를 생성하지 않고 클래스 이름에
// "."을 찍어서 실행할 수 있다. => 자주 사용하는 메소드는 정적 메소드로 만들어 사용하면 편리하다.
// 리턴 타입은 메소드가 실행되고 난 후 결과의 자료형을 적는다.
// 메소드가 실행한 후 결과가 없다면 return 을 생략할 수 있고 return을 생략하면 리턴 타입에는
// "void"라고 적어준다
// 년도를 인수로 넘겨받아 윤년, 평년을 판단해 윤년이면 true, 평년이면 false를 리턴하는 메소드
// 논리값을 기억하는 변수나 리턴하는 메소드의 이름은 "is"로 시작하는 것이 관행이다.
// 윤년 판별 메소드
public static boolean isLeapYear(int year) {
return year % 4 == 0 && year % 100 != 0 || year % 400 == 0 ;
}
// 연,월을 인수로 받아서 그 달의 마지막 날짜를 리턴하는 메소드
public static int lastDay(int year, int month) {
// 각 달의 마지막 날짜를 기억하는 배열을 선언한다.
int[] m = {31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 2월의 마지막 날짜를 확정한다.
m[1] = isLeapYear(year) ? 29 : 28;
// 마지막 날자를 리턴한다.
return m[month - 1];
}
// 연, 월, 일 인수로 받아서 1년 1월 1일부터 지나온 날짜의 합계를 계산해서 리턴하는 메소드
public static int totalDay(int year, int month, int day) {
// 전년도 12월 31일 지난 날짜의 합계를 계산한다.
int sum = (year - 1) * 365 + (year-1)/4 - (year-1)/100 + (year-1)/400;
// 전년도 12월 31일 지난 날짜의 합계에 전달까지 지난 날짜를 계산한다.
for (int i = 1; i<month; i++) {
sum += lastDay(year, i);
}
// 전달까지 지난 날짜의 합계에 이번 달 날짜를 더한다.
return sum + day;
}
// 년, 월, 일을 인수로 넘겨받아 요일을 숫자로 계산해 리턴하는 메소드
// 일요일(0) ... 토요일(6);
public static int weekDay(int year, int month, int day) {
return totalDay(year, month, day) % 7;
}
// JVM은 자바 프로그램이 실행되기 전에 static으로 선언된 메소드나 변수를 메모리에 올려준다.
// 모든 메소드는 메소드가 실행되기 전에 메모리에 적재되어야 한다.
// main() 메소드가 메모리에 적재되어 있지 않으면 프로그램의 시작점인
// main() 메소드를 호출할 수 없으므로 프로그램을 실행할 수 없다.
// 그래서 main() 메소드는 누군가가 호출하기 전에 JVM이 메모리에 적재시킨다.
// 년, 월을 입력하면 그 달 달력이 출력하는 메소드 만들기
public static String calendar(int year, int month) {
System.out.printf(" %4d년 %2d월\n", year, month );
System.out.println("일 월 화 수 목 금 토");
for (int i = 0; i < weekDay(year, month, 1); i++) {
System.out.print("");
}
// 1일 부터 달력을 출력할 달의 마지막 날짜까지 반복하며 달력을 출력한다
for (int i = 1; i<=lastDay(year, month); i++) {


System.out.printf("%2d ", i);
// 출력한 날짜(i)가 토요일이면 줄을 바꾼다.
if (weekDay(year, month, i) == 6) {
System.out.println();
}
}
return "";
}
public static void main(String[] args) {
// System.out.println(isLeapYear(2023));
// System.out.println(lastDay(2024, 2));
// System.out.println(totalDay(2023, 12, 7));
// System.out.println(weekDay(2023, 12, 7)%7);
// System.out.println();
System.out.println(calendar(2023, 1));
}
}
'java&eclipse 코딩 알고리즘 > 20231207' 카테고리의 다른 글
| SaUpNoCheckTest (0) | 2023.12.15 |
|---|---|
| JuminNoCheckTest5 (0) | 2023.12.15 |
| JuminNoCheckTest3 (0) | 2023.12.15 |
| JuminNoCheckTest2 (0) | 2023.12.15 |
| JuminNoCheckTest (0) | 2023.12.15 |