본문 바로가기

제로베이스 백엔드 스쿨/미션

미니과제 5번 - 달력 출력 프로그램

미니과제 5번 - 달력 출력 프로그램

 

 

 

콘솔 시행 결과가 위와 같아야함

 

수행 조건

- Scanner 클래스를 사용하기

- java의 Calender class도 사용 + Date나 LocalDate class 사용하기

- 입력값으로는 년도와 월을 지정

- 화면과 같이 3달을 출력해야함

 

 

https://dev-cho.tistory.com/46

 

[LocalDate Class] 날짜(연, 월, 일) 다루기

← 목차로 돌아가기 Java에서 날짜, 시간 제대로 다루기 개요 기존 Date 클래스와 Calendar 클래스는 날짜와 Timezone 관련되어 개발자를 헷갈리게 하는 부분이 많아 쓰는 것을 지양해야 한다. 위에 대

dev-cho.tistory.com

https://hianna.tistory.com/613

 

[Java] Date <-> LocalDate, LocalDateTime 변환하기

Date -> LocalDate, LocalDateTime Date -> Instant -> ZonedDateTime -> LocalDate, LocalDateTime Date -> java.sql.Date, java.sql.Timestamp -> LocalDate, LocalDateTime LocalDate.ofInstant(), LocalDateTime.ofInstant() : Java 9 이상 LocalDateTime -> Date java.

hianna.tistory.com

자바에서 날짜 관련 클래스에 대하여 참고

 

 

방법1. 그냥 System.out.print의 기능을 통하여 콘솔에 출력하기

public class Practice5 {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        System.out.print("달력의 년도를 입력해 주세요.(yyyy): ");
        int year = sc.nextInt();

        System.out.println("달력의 월을 입력해주세요.(mm): ");
        int month = sc.nextInt();

        LocalDate localDate = LocalDate.of(year, month, 1); // 연, 월, 일 지정
        int lastDay = localDate.plusMonths(1).minusDays(1).getDayOfMonth();

        String[] title = {"일", "월", "화", "수", "목", "금", "토"};

        int prefixCount = localDate.getDayOfWeek().getValue();
        int totalCount = 0;

        // 캘린더 출력 부분
        for (int i =0; i < title.length; i++){ // 상단의 요일 출력
            System.out.print(title[i]+ "\t");
        }
        System.out.println(); // 줄바꿈 후에 뒤에 이어쓰기
        
        for (int i = 0; i < prefixCount; i++) {
            System.out.print(" " + "\t");
            totalCount++;
        }
        for (int i = 1; i <= lastDay; i++) {
            System.out.print(i + "\t");
            totalCount++;
            if (totalCount % 7 == 0) {
                System.out.print("\n");
            }
        }
    }
}

 

 

방법2. StringBuilder를 사용하여 append()함수를 사용하고 나서 후에 출력하기

 

https://doitdoik.tistory.com/95#:~:text=StringBuilder%EB%8A%94%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84%20%EB%B3%80%EA%B2%BD,%ED%95%B4%EC%A3%BC%EC%A7%80%20%EC%95%8A%EB%8A%94%20%ED%8A%B9%EC%A7%95%EC%9D%B4%20%EC%9E%88%EB%8B%A4.

 

[JAVA] StringBuilder 사용법. 특징

StringBuilder StringBuilder는 문자열을 변경하거나 이어붙이는 경우 추가 메모리 생성 없이 기존 문자열이 확장. String과 다르게 문자열이 빈번하게 변경될 때 사용하면 성능이 좋다. StringBuilder는 멀티

doitdoik.tistory.com

StringBuilder의 특징 확인

public class Practice5 {

    public static void main(String[] args) {

        StringBuilder sb = new StringBuilder();

        Scanner sc = new Scanner(System.in);

        System.out.print("달력의 년도를 입력해 주세요.(yyyy): ");
        int year = sc.nextInt();

        System.out.println("달력의 월을 입력해주세요.(mm): ");
        int month = sc.nextInt();

        LocalDate localDate = LocalDate.of(year, month, 1); // 연, 월, 일 지정
        int lastDay = localDate.plusMonths(1).minusDays(1).getDayOfMonth();

        String[] title = {"일", "월", "화", "수", "목", "금", "토"};

        int prefixCount = localDate.getDayOfWeek().getValue();
        int totalCount = 0;

        // 캘린더 출력 부분
        for (int i =0; i < title.length; i++){
            sb.append(title[i] + "\t");
        }
        sb.append("\n");

        for (int i = 0; i < prefixCount; i++) {
            sb.append(" " + "\t");
            totalCount++;
        }
        for (int i = 1; i <= lastDay; i++) {
            sb.append(i + "\t");
            totalCount++;
            if (totalCount % 7 == 0) {
                sb.append("\n");
            }
        }
        // StringBuilder 같은 경우에는 출력 부분 필요
        System.out.println(sb.toString());
    }
}

 

 

 

-----------------------

 

 

3개월의 캘린더를 출력하고 싶을 경우

public class Practice5 {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        System.out.print("달력의 년도를 입력해 주세요.(yyyy): ");
        int year = sc.nextInt();

        System.out.println("달력의 월을 입력해주세요.(mm): ");
        int month = sc.nextInt();

        // 캘린더 출력 부분
        int[] num = {-1, 0, 1};
        for (int j = 0; j < 3; j++) {
            month += j;

            LocalDate localDate = LocalDate.of(year, month, 1); // 연, 월, 일 지정
            int lastDay = localDate.plusMonths(1).minusDays(1).getDayOfMonth();

            String[] title = {"일", "월", "화", "수", "목", "금", "토"};

            int prefixCount = localDate.getDayOfWeek().getValue();
            int totalCount = 0;

            System.out.println(String.format("[%04d년 %02d월]", year, month));
            for (int i =0; i < title.length; i++){
                System.out.print(title[i]+ "\t");
            }
            System.out.println();
            for (int i = 0; i < prefixCount; i++) {
                System.out.print(" " + "\t");
                totalCount++;
            }
            for (int i = 1; i <= lastDay; i++) {
                System.out.print(i + "\t");
                totalCount++;
                if (totalCount % 7 == 0) {
                    System.out.print("\n");
                }
            }
            System.out.println();
        }
        System.out.print("\n");
    }
}

 

 

 

-----------------------------

수평으로 3개월치의 달력을 출력하고 싶을 경우

https://velog.io/@zhdiddl/240407

 

[Java] 3개월 달력 출력하기 (LocalDate)

❔ 문제 💭 풀이 작성 코드 📌 우선 사용자에게 연도와 월을 입력받습니다. Main 메소드에서 Scanner를 이용해 사용자에게 연도와 월을 입력받고, createCalendar라는 메소드를 별도로 생성해 달력 정

velog.io

위의 코드 참고하기

한 달 단위로 한다기보다는, 첫번째 줄, 두번째~마지막줄 이런 단위로 쪼개어 작성해야함