김영한님 자바 강의 중급1편 듣는 중. 자바에서 제공하는 날짜와 시간 관련 라이브러리를 공부하면서 사용자로부터 연, 월 정보를 입력 받아 달력을 출력하는 프로그램을 만들어 실습해보았다.
우선 문제만 보고 스스로 코드를 짜보았고, 이후에 내가 작성한 코드와 강사님이 작성한 코드를 비교해 보는 방식으로 공부를 했다. 달력을 출력하라는 과제목표는 달성했지만, 날짜 처리, 출력 형식, 반복문 사용 방식에서 차이가 있었다.
내가 작성한 코드
package test;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
import java.util.Scanner;
public class TestCalendarPrinter {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("년도를 입력하세요: ");
int year = scanner.nextInt();
System.out.print("월을 입력하세요: ");
int month = scanner.nextInt();
printCalener(year, month);
}
private static void printCalener(int year, int month){
LocalDate firstDate = LocalDate.of(year, month, 1);
DayOfWeek startDayOfWeek = firstDate.getDayOfWeek();
int lastDay = firstDate.with(TemporalAdjusters.lastDayOfMonth()).getDayOfMonth();
int firstDayValue = startDayOfWeek.getValue();
System.out.println("Su Mo Tu We Th Fr Sa");
for (int i = 0; i < firstDayValue; i++) {
System.out.print(" ");
}
for (int day = 1; day <= lastDay; day++) {
System.out.print(" " + day);
if ((day + firstDayValue) % 7 == 0) {
System.out.println();
}
}
}
}
강사님이 작성한 코드
package test;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.util.Scanner;
public class TestCalendarPrinter {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("년도를 입력하세요: ");
int year = scanner.nextInt();
System.out.print("월을 입력하세요: ");
int month = scanner.nextInt();
printCalener(year, month);
}
private static void printCalener(int year, int month){
LocalDate firstDayOfMonth = LocalDate.of(year, month, 1);
LocalDate firstDayOfNextMonth = firstDayOfMonth.plusMonths(1);
int offsetWeekDays = firstDayOfMonth.getDayOfWeek().getValue() % 7;
System.out.println("Su Mo Tu We Th Fr Sa");
for (int i = 0; i < offsetWeekDays; i++) {
System.out.print(" ");
}
LocalDate dayIterator = firstDayOfMonth;
while (dayIterator.isBefore(firstDayOfNextMonth)) {
System.out.printf("%2d ", dayIterator.getDayOfMonth());
if (dayIterator.getDayOfWeek() == DayOfWeek.SATURDAY) {
System.out.println();
}
dayIterator = dayIterator.plusDays(1);
}
}
}
Takeaways
숫자 정렬
내 코드:
System.out.print(" " + day);
- 앞에 공백을 추가하지만, 이렇게 하면 숫자 정렬이 어긋날 가능성이 있다.
강사님 코드:
System.out.printf("%2d ", dayIterator.getDayOfMonth());
- printf("%2d ")을 사용하면 두 자리 정렬을 보장한다. 달력 한 칸이 총 세자리를 차지하도록 해두었는데 두 자리는 숫자, 한 자리는 공백으로 통일할 수 있다.
- 이렇게 하면 위의 방식과 달리 단일 자리 숫자도 깔끔하게 정렬된다.
날짜 출력 방식 (dayIterator 사용 차이)
내 코드:
for (int day = 1; day <= lastDay; day++) {
System.out.print(" " + day);
if ((day + firstDayValue) % 7 == 0) {
System.out.println();
}
}
- 날짜를 int 변수로 단순하게 증가시키면서 반복문을 실행하도록 코드를 짰다.
- 이 경우 많은 기능을 가지고 있는 LocalDate 객체를 사용하지 않아 날짜 처리 기능이 제한된다.
강사님 코드:
LocalDate dayIterator = firstDayOfMonth;
while (dayIterator.isBefore(firstDayOfNextMonth)) {
System.out.printf("%2d ", dayIterator.getDayOfMonth());
if (dayIterator.getDayOfWeek() == DayOfWeek.SATURDAY) {
System.out.println();
}
dayIterator = dayIterator.plusDays(1);
}
- LocalDate 객체를 사용하여 날짜를 직접 관리하고 간단히 .plusDays(1)으로 증가시킬 수 있다.
- dayIterator.getDayOfWeek()를 활용해 요일을 직접 비교 가능하다.
- 다른 누군가 코드를 보았을 때 더 직관적이고 명확하게 의도를 파악할 수 있는 방식인 것 같다.
'Language > Java' 카테고리의 다른 글
[Kotlin] 코틀린 문법 총정리 (feat. 자바) (0) | 2025.04.03 |
---|---|
[Java] 김영한의 실전 자바 기본편 완강 (0) | 2025.03.13 |