[Java] 심화 - 기타클래스(Math, Calendar, Enum)

이지연·2025년 12월 25일

개요

아래의 내용은 java_grammer 레파지토리 C06EtcClass 디렉터리에 저장되어있는 내용을 정리함


Math 클래스

Math 클래스는 수학에서 자주 쓰이는 상수랑 함수들을 미리 구현해놓은 유틸 클래스
모든 메서드가 static이라 객체 생성 없이 바로 Math.메서드()로 호출 가능

random() - 랜덤 숫자 생성

System.out.println("random : " + Math.random()); // 0.0 ~ 1.0 미만 double 반환
// (int)(Math.random() * 100) // 0 ~ 99 범위로 변환

실습 예제 - 로또 번호 7개

for (int i = 0; i < 7; i++) {
    System.out.println("Lotto (" + i + ") : " + (int)(Math.random() * 100));
}

0-99까지 랜덤 숫자 뽑기. 실제 로또는 중복제거+정렬까지 해야하지만 기본 개념 이해용.

주요 메서드 - 숫자처리

메서드기능예제결과
abs(-5)절대값Math.abs(-5)5
ceil(5.7)올림Math.ceil(5.7)6.0
floor(5.7)내림Math.floor(5.7)5.0
round(5.7)반올림Math.round(5.7)6
max(10,20)최대값Math.max(10,20)20
min(10,20)최소값Math.min(10,20)10

거듭제곱/제곱근

System.out.println("pow : " + Math.pow(2,3)); // 8.0 (2³)
System.out.println("sqrt : " + Math.sqrt(25)); // 5.0

Calendar vs LocalDateTime

왜 시간 라이브러리가 필요한가?

회원가입, 게시글 작성 시 서버/DB가 자동으로 시간 기록.
사용자가 "지금" 입력하는 게 아니라 시스템이 현재 시간을 찍어줌.

두 라이브러리 비교

구분Calendar (java.util)LocalDateTime (java.time)
특징추상클래스, static 변수 사용불변객체, 직관적 메서드
문제점가독성/유지보수 안좋음없음 (현대 표준)
사용법Calendar.getInstance()LocalDateTime.now()

Calendar 예제

Calendar cal = Calendar.getInstance();
System.out.println("YEAR: " + cal.get(Calendar.YEAR));     // 2025
System.out.println("MONTH: " + (cal.get(Calendar.MONTH)+1)); // 12 (0부터 시작)
System.out.println("DAY: " + cal.get(Calendar.DAY_OF_MONTH)); // 23

LocalDateTime + 하위 클래스들

LocalDate date = LocalDate.now();        // 2025-12-23
LocalTime time = LocalTime.now();        // 09:48:01
LocalDateTime dt = LocalDateTime.now();  // 2025-12-23T09:48:45

// 날짜/시간 추출
System.out.println(dt.getYear());                    // 2025
System.out.println(dt.get(ChronoField.MONTH_OF_YEAR)); // 12
System.out.println(dt.get(ChronoField.AMPM_OF_DAY));   // 0(오전)/1(오후)

// 특정 날짜 생성
LocalDate birth = LocalDate.of(2000, 11, 12);
LocalDateTime birthTime = LocalDateTime.of(2000, 11, 12, 15, 14, 10);

Enum(열거체)

아래의 상황을 통해 Enum 타입이 왜 필요한가 확인해 봄

문제 상황

학년정보를 String classGrade로 저장하면:

Student s1 = new Student("hong1", "FIRST_GRADE");
Student s2 = new Student("hong2", "first_grade");  // 오타
Student s3 = new Student("hong3", "1학년");        // 한글

데이터 통제 불가. 컴파일러가 아무 에러도 안냄.

중간 개선 - static final

static final String c1 = "FIRST_GRADE";
static final String c2 = "SECOND_GRADE";
// 여전히 Student s3 = new Student("hong3", "1학년"); 가능

여전히 방어가 안됨.

Enum 해결

enum ClassGrade {
    FIRST_GRADE, SECOND_GRADE, THIRD_GRADE
}

class Student {
    private String name;
    private ClassGrade classGrade;  // 타입 체크됨
    
    Student(String name, ClassGrade classGrade) {
        this.name = name;
        this.classGrade = classGrade;  // "1학년" 넣으면 컴파일 에러!
    }
}

Enum 장점

  • 타입 안전성: 무효값 입력시 컴파일 에러
  • 가독성: ClassGrade.FIRST_GRADE로 의도 명확
  • static final처럼 사용: ClassGrade.FIRST_GRADE 값 고정

ChronoField 예시

LocalDateTime.now().get(ChronoField.YEAR);           // 2025
LocalDateTime.now().get(ChronoField.AMPM_OF_DAY);    // 0/1

Enum이 input으로 쓰이는 대표 케이스.

정리

  • Math: static 유틸, 랜덤/수학연산
  • Calendar → LocalDateTime: 시간처리 (현대는 java.time만)
  • Enum: 제한된 값의 타입 안전성 보장

실무에서 데이터 무결성 지키려면 Enum 필수고, 시간은 LocalDateTime만 쓰면 됨!

profile
Eazy하게

0개의 댓글