Java/Java 기초

Java13 클래스 생성자 다중 생성

Codezoy 2020. 5. 14. 00:13

Day 클래스 생성


  • 인수를 받지 않는 생성자를 사용해 인스턴스 생성할 때 프로그램 실행시의 날짜로 초기화한다.
  • 인수를 받는 생성자의 값이 잘못된 경우 적절한 값으로 조절한다.
  • 여기에 다음의 메서드를 추가할 것
    특정 연도가 윤년인지 판단하는 클래스 메서드, 연내 경과 일수를 구하는 메서드(1월 1일 기준), 연내 남은 일수를 구하는 메서드, 다른 날짜와 전후관계 구하는 인스턴스 메서드(이전인지, 동일인지, 이후인지), 두 날짜의 전후 관계를 판정하는 클래스 메서드, 날짜를 하루 앞으로 변경하는 메서드, 하루 전의 날짜를 반환하는 메서드, 날짜를 n일 뒤로 변경하는 메서드, 날짜를 n일 뒤로 변경하는 메서드, n일 뒤의 날짜를 반환하는 메서드, 날짜를 n일 앞으로 변환하는 메서드, n일 앞의 날짜를 반환하는 메서드
import java.util.GregorianCalendar;
import java.util.GregorianCalendar.*;

class Day {
    private int year =1; //연
    private int month =1; //월
    private int date =1; //일

    // -- 각 월의 일수 -- //
    private static int[][] mdays = {
            {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, // 평년
            {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}  // 윤년
    }; // mdays

    // -- 클래스 메서드 -- //
    // y년은 윤년인가?
    public static boolean isLeap(int y) {
        return y%4 == 0 && y%100 != 0 || y%400 ==0; 
    }
    // ---- y 년 m월의 일수  ---//
    private static int dayOfMonth(int y, int m) {
        return mdays[isLeap(y)? 1:0][m-1];
    }

    // -- 조정된 m월(1~12 범위 외의 값을 조정 -- //
    private static int adjustedMonth(int m) {
        return m < 1? 1:m >12? 12:m;
    }
    // --- 조정된 y년 m월의 d일(1 ~ 28/29/30/31 범위 외의 값을 조정) ---//
    private static int adjustedDay(int y, int m, int d) {
        if (d<1) return 1;
        int dMax = dayOfMonth(y, m);   // y년 m월의 일수
        return d > dMax? dMax:d ;}

    public static int compare(Day d1, Day d2) {  // 두 날짜의 전후 관계 
        if(d1.year > d2.year ) return 1;  // 연이 다르다
        if(d1.year < d2.year ) return -1;  // 연이 다르다
                                            // 연이 같다.

        if(d1.month < d2.month) return 1;  // 월이 다르다
        if(d1.month > d2.month) return -1;  // 월이 다르다

        return d1.date > d2.date ? 1 : d1.date < d2.date? -1 : 0;  // 일도 같다.

    } //compare


    // -- 생성자 --( 오늘 날짜 ) -- //
    public Day() {
        GregorianCalendar today = new GregorianCalendar();
        this.year = today.get(GregorianCalendar.YEAR);
        this.month = today.get(GregorianCalendar.MONTH) + 1;
        this.date = today.get(GregorianCalendar.DATE);
    }
    public Day(int year) {  // Year년 1월 1일 
        this.year= year;
    }

    public Day(int year, int month) {  // year년 month월 1일 
        this(year);
        this.month = month;
    }

    public Day (int year, int month, int date) {  // year년 month월 date일 
        this(year, month);
        this.date = date;
    }

    public Day(Day d) { // Day 객체를 생성자에 입력 받았을 
        this(d.year, d.month, d.date);
    }

//    인스턴스 메소드
    public int getYear() {  // year 가져오기 
        return this.year;
    }
    public int getMonth() {  // Month 가져오기 
        return this.month;
    }
    public int getDate() {  // date 가져오기 
        return this.date;
    }

    public void setYear(int year) {  // year 설정 
        this.year = year;
        this.date = adjustedDay(year, this.month, this.date);
    }

    public void setMonth(int month) {  // Month 설정 
        this.year = adjustedMonth(month);
        this.date = adjustedDay(this.year, this.month, this.date);
    }

    public void setDate(int date) {  // Date 설정 
        this.date = adjustedDay(year, this.month, date);
    }

    public void set(int year, int month, int date) {
        this.year = year;
        this.month = adjustedMonth(month);
        this.date = adjustedDay(this.year, this.month, date);
    }

    public boolean isLeap() {  //윤년인지 구하는 인스턴스 메소드
        return isLeap(year);  //클래스 메소드 호출 
    }

    public int dayOfWeek() {  // 요일 구하기 
        // 0  1 2  3 4  5 6
        // 일 월 화 수 목 금 토
        int y = year;
        int m = month;
        if(m ==1 || m==2) {
            y--;
            m += 12;
        }
        return (y + y/4 - y/100 + y/400 + (13 * m + 8) / 5 + date)%7;
    }  // dayOfWeek

    public boolean equalTo(Day d) {  // 날짜 d와 비교 
        return year == d.year && month == d.month && date == d.date;
    }

    public String toString() {
        String[] wd = {"일", "월", "화", "수", "목", "금", ""};
        return String.format("%04년 %02월 %02일(%s)", year, month, date, wd[dayOfWeek()]);
    } // toString


    public int dayOfYear() {  // 연내 경과 일수 
        int days = date;
        for(int i=1; i<month; i++)
            days+= dayOfMonth(year, i);
        return days;
    }  //dayOfYear

    public int leftDayOfYear() {  // 연내 잔여 일
        return 365 + (isLeap(year)? 1: 0) - dayOfYear();
    }  //leftDayOfYear

    public int compareToDay(Day d) { // 날짜 d와 전후 관계
        return compare(this, d);
    }  //compareToDay

    public void succeed() {  // 날짜를 하루 뒤로 변경 
        if( date < dayOfMonth(year, month))
            date ++;
        else {
            if( ++month > 12) {
                year++;
                month = 1;
            } // if
            date = 1;
        } // else
        } // succeed

    public Day succeedingDay() {  // 하루 뒤 날짜를 반환 
        Day temp = new Day(this);
        temp.succeed();
        return temp;
    }  // succeedingDay


    public void precede() {  // 날짜를 하루 앞으로 변경 
        if (date>1)
        date--;
        else {
            if( -- month < 1) {
                year--;
                month = 12;
            }  // if
        }  // else
    }  // precede

    public Day precedingDay() {  // 하루 앞 날짜를 반환
        Day temp = new Day(this);
        temp.precede();
        return temp;
    }

    public void succeedDays(int n) {  // 날짜를 n일 뒤로 변경 
        if(n<0)
            precedeDays(-n);
        else if (n>0) {
            date += n;
            while(date > dayOfMonth(year, month)) {
                date -= dayOfMonth(year, month);
                if (++month > 12) {
                    year++;
                    month =1;
                }  // if
            }  // while
        } // else if
    }  // succeedDays

    public Day after(int n) {  // n일 뒤의 날짜를 반환 
        Day temp = new Day(this);
        temp.succeedDays(n);
        return temp;
    }

    public void precedeDays(int n) {  // 날짜를 n일 앞으로 변경 
        if (n<0)
            succeedDays(-n);
        else if (n>0) {
            date -= n;
            while (date <1) {
                if (--month <1) {
                    year--;
                    month = 12;
                } // if
                date += dayOfMonth(year, month);
            }  // while
        }  // else if
    }  // precedeDays

    public Day before(int n) {  // n일 앞의 날짜를 반환 
        Day temp = new Day(this);
        temp.precedeDays(n);
        return temp;
    }
    public String getString() {
        return (String.valueOf(this.getYear())+ "." + String.valueOf(this.getMonth())
        + "." + String.valueOf(this.getDate()));
    }

} //class Day

실행

public static void main(String[] args) {
        // TODO Auto-generated method stub
        Day day = new Day();
        System.out.println(day.dayOfWeek());
        System.out.println(Day.isLeap(2020));
    }

결과

3
true