지난번에 다뤘던 컬렉션 프레임워크에서 오늘 새로 배운 부분과, 다시 상기시키면 좋을 것 같은 내용을 정리해보겠다.
제네릭(Generic) 은 클래스/메서드 내부에서 사용할 데이터 타입을 외부에서 지정할 수 있게 해주는 기법이다.
<>(꺾쇠괄호) 안에 타입을 적는다.
예를 들어,
코드를 입력하세요
위처럼 String으로 지정하면, 해당 리스트에는 문자열만 저장할 수 있다.
제네릭을 이용한 클래스나 메서드를 설계할 때 사용하는 타입 변수다. (보통 T, E, K, V 등을 많이 씀)
다음은 제네릭을 적용한 클래스를 정의한 예시다.
클래스명 옆에 <I> 를 붙이고, 클래스 내부에서 I를 타입처럼 사용한다.
코드를 입력하세요
I는 “뭐가 들어올지 아직 모름”이라는 뜻의 타입 변수다.
예를 들어GenericBox<Pen>으로 생성하면 코드에서I가 전부Pen으로 치환된다고 보면 된다.
코드를 입력하세요
이런 식으로 타입을 안전하게 고정해서 사용할 수 있다.
둘 다 객체의 정렬 기준(순서)을 정의하기 위한 인터페이스다.
compareTo)compare)Comparable을 사용하려면 클래스에 implements Comparable<타입> 를 붙이고, compareTo() 를 오버라이딩해야 한다.
코드를 입력하세요
compareTo는 정렬 순서를 판단하기 위해 음수 / 0 / 양수를 반환한다.
this가 앞으로this가 뒤로그리고 보통 아래처럼 정렬한다.
코드를 입력하세요
출력 결과를 보면 나이 기준 오름차순 정렬이 잘 되는 것을 확인할 수 있다.
개선 포인트:
return this.age - other.age;는 값이 커지면 오버플로우 가능성이 있으니, 실무에서는Integer.compare(this.age, other.age)를 더 권장한다.
Comparator는 “외부에서” 정렬 기준을 정할 수 있다.
그래서 같은 객체라도 상황에 따라 나이순, 이름순 등 다양하게 정렬할 수 있다.
네가 적은 코드에 몇 가지 오타/타입 오류가 있었다.
CompartorExam → 보통 ComparatorExam (철자 수정 권장)compare() 구현에서 return o1.age; 는 비교 로직이 아니라 잘못된 반환Comparator<Person> byName → Comparator<CompartorExam> 로 타입이 맞아야 함Arrays.asList(...) 는 고정 크기라 sort 가능하지만, 경우에 따라 new ArrayList<>(...) 가 안전함수정한 형태로 정리하면 아래처럼 쓰는 게 일반적이다.
코드를 입력하세요
Date는 현재 시간을 얻을 수 있는 클래스 중 하나로, new Date()로 생성한다.
코드를 입력하세요
하지만 Date는 설계상의 문제(월이 0부터 시작 등)와 여러 불편함 때문에 최근에는 권장되지 않는다.
추가로 네 코드에서 포맷 패턴도 실수가 있었다.
yyyy-mm-dd에서mm은 분(minute) 이고, 월(month)은 MM 이다.
즉yyyy-MM-dd가 맞다.
Calendar는 추상 클래스라 new로 생성할 수 없고, Calendar.getInstance()로 인스턴스를 얻는다.
내부적으로는 기본 구현체(보통 GregorianCalendar)를 반환한다.
이 방식은 구현체를 나중에 바꾸더라도 기존 코드 수정이 최소화되도록 확장성을 열어둔 설계다.
달력을 출력하는 예시는 다음 흐름으로 작성할 수 있다.
코드를 입력하세요
Date/Calendar 대신 Java 8+의 java.time 패키지 사용을 권장한다.
현재 날짜/시간 출력 예시:
코드를 입력하세요
원하는 날짜/시간을 특정해서 저장하는 예시:
코드를 입력하세요
미니 프로젝트가 끝나고 첫 수업이라 그런지 뭔가 어색했던 것 같다.
아기사자반은 어제부터 시작해서 오늘이 2일차인데, 아직 초반 부분은 수월하게 지나가고 있다.
깃허브 사용법이 미숙한 것 같아서, 아기사자반에서 해결한 문제들을 GitHub에 push하면서 GitHub와 좀 더 친해져야 할 것 같다.