2025-09-02 컬랙션 프레임워크, 날짜와 시간

Ckd gus·2026년 2월 2일

컬렉션 프레임워크 복습 + 오늘 새로 배운 내용 정리

지난번에 다뤘던 컬렉션 프레임워크에서 오늘 새로 배운 부분과, 다시 상기시키면 좋을 것 같은 내용을 정리해보겠다.


제네릭(Generic)

제네릭(Generic) 은 클래스/메서드 내부에서 사용할 데이터 타입을 외부에서 지정할 수 있게 해주는 기법이다.
<>(꺾쇠괄호) 안에 타입을 적는다.

예를 들어,

코드를 입력하세요

위처럼 String으로 지정하면, 해당 리스트에는 문자열만 저장할 수 있다.

타입 파라미터(Type Parameter)

제네릭을 이용한 클래스나 메서드를 설계할 때 사용하는 타입 변수다. (보통 T, E, K, V 등을 많이 씀)

다음은 제네릭을 적용한 클래스를 정의한 예시다.
클래스명 옆에 <I> 를 붙이고, 클래스 내부에서 I를 타입처럼 사용한다.

코드를 입력하세요

I는 “뭐가 들어올지 아직 모름”이라는 뜻의 타입 변수다.
예를 들어 GenericBox<Pen> 으로 생성하면 코드에서 I가 전부 Pen으로 치환된다고 보면 된다.

인스턴스화 예시

코드를 입력하세요

이런 식으로 타입을 안전하게 고정해서 사용할 수 있다.


Comparable vs Comparator

둘 다 객체의 정렬 기준(순서)을 정의하기 위한 인터페이스다.

  • Comparable: 객체 자기 자신이 기본 정렬 기준을 가진다. (compareTo)
  • Comparator: 객체 외부에서 정렬 기준을 따로 정의한다. (compare)

Comparable

Comparable을 사용하려면 클래스에 implements Comparable<타입> 를 붙이고, compareTo() 를 오버라이딩해야 한다.

코드를 입력하세요

compareTo()의 반환값 의미

compareTo는 정렬 순서를 판단하기 위해 음수 / 0 / 양수를 반환한다.

  • 음수: this가 앞으로
  • 0: 순서 유지
  • 양수: this가 뒤로

그리고 보통 아래처럼 정렬한다.

코드를 입력하세요

출력 결과를 보면 나이 기준 오름차순 정렬이 잘 되는 것을 확인할 수 있다.

개선 포인트: return this.age - other.age; 는 값이 커지면 오버플로우 가능성이 있으니, 실무에서는 Integer.compare(this.age, other.age)를 더 권장한다.


Comparator

Comparator는 “외부에서” 정렬 기준을 정할 수 있다.
그래서 같은 객체라도 상황에 따라 나이순, 이름순 등 다양하게 정렬할 수 있다.

(주의) 기존 코드의 오류 수정

네가 적은 코드에 몇 가지 오타/타입 오류가 있었다.

  • CompartorExam → 보통 ComparatorExam (철자 수정 권장)
  • compare() 구현에서 return o1.age; 는 비교 로직이 아니라 잘못된 반환
  • Comparator<Person> byName → Comparator<CompartorExam> 로 타입이 맞아야 함
  • Arrays.asList(...) 는 고정 크기라 sort 가능하지만, 경우에 따라 new ArrayList<>(...) 가 안전함

수정한 형태로 정리하면 아래처럼 쓰는 게 일반적이다.

코드를 입력하세요

Date 클래스

Date는 현재 시간을 얻을 수 있는 클래스 중 하나로, new Date()로 생성한다.

코드를 입력하세요

하지만 Date는 설계상의 문제(월이 0부터 시작 등)와 여러 불편함 때문에 최근에는 권장되지 않는다.

추가로 네 코드에서 포맷 패턴도 실수가 있었다.
yyyy-mm-dd에서 mm은 분(minute) 이고, 월(month)은 MM 이다.
즉 yyyy-MM-dd가 맞다.


Calendar

Calendar는 추상 클래스라 new로 생성할 수 없고, Calendar.getInstance()로 인스턴스를 얻는다.
내부적으로는 기본 구현체(보통 GregorianCalendar)를 반환한다.

이 방식은 구현체를 나중에 바꾸더라도 기존 코드 수정이 최소화되도록 확장성을 열어둔 설계다.

달력을 출력하는 예시는 다음 흐름으로 작성할 수 있다.

코드를 입력하세요

최신 날짜/시간 API: java.time

Date/Calendar 대신 Java 8+의 java.time 패키지 사용을 권장한다.

  • LocalDate: 날짜(연/월/일)
  • LocalTime: 시간(시/분/초/나노초)
  • LocalDateTime: 날짜 + 시간

현재 날짜/시간 출력 예시:

코드를 입력하세요

원하는 날짜/시간을 특정해서 저장하는 예시:

코드를 입력하세요

느낀점

미니 프로젝트가 끝나고 첫 수업이라 그런지 뭔가 어색했던 것 같다.

아기사자반은 어제부터 시작해서 오늘이 2일차인데, 아직 초반 부분은 수월하게 지나가고 있다.

깃허브 사용법이 미숙한 것 같아서, 아기사자반에서 해결한 문제들을 GitHub에 push하면서 GitHub와 좀 더 친해져야 할 것 같다.

profile
백엔드 공부중입니다.

0개의 댓글