Enum의 메서드 중 ordinal 메서드는 호출한 열거형 상수의 순서값을 반환하는 메서드이다. enum Season { SPRING, // 순서값: 0 SUMMER, // 순서값: 1 FALL, // 순서값: 2 WINTER // 순서값: 3 public static void main(String[] args) { System.out.println(Season.SPRING.ordinal()); // 출력: 0 System.out.println(Season.SUMMER.ordinal()); // 출력: 1 System.out.println(Season.FALL.ordinal()); // 출력: 2 System.out.println(Season.WINTER.ordinal()); // 출력: 3 } } 하지..
열거 타입(Enum) Enum은 일정 개수의 상수 값을 정의한 다음 그 외의 값은 허용하지 않는 타입이다. 특정한 변수가 가질 수 있는 값을 제한하여 타입 세이프티를 보장할 수 있고 싱글톤 패턴을 구현할 때 사용한다. 자바에서 열거 타입을 지원하기 전에는 상수를 한 묶음으로 선언해서 사용했다. 보통 변하지 않는 상수들은 DB에 왔다갔다 값을 가져오지 않고 공통 상수를 만들어서 전역에서 사용하도록 만들었는데 요일이나 월, 사계절, 성별 플래그 등을 예로들 수 있다. // 정수 열거 패턴 public static final int APPLE_FUJI = 0; public static final int APPLE_PIPPIN = 1; public static final int APPLE_GRANNY_SMITH..
타입 안전 이종 컨테이너 : 한 타입의 객체만 담을 수 있는 컨테이너가 아니라 여러 다른 타입(이종)을 담을 수 있는 타입 안전한 컨테이너 타입 토큰 : String.class 또는 Class 타입 안전 이종 컨테이너 구현 방법: 컨테이너가 아니라 "키"를 매개변수화 하라 컨테이너 : 다른 객체를 담을 수 있는 객체. 객체를 담고 관리할 수 있는 Map, Set, Optional 등이 있다. 개발자가 객체를 보다 쉽게 관리하고 처리할 수 있도록 도와주며, 자료구조를 다룰 수 있는 다양한 메서드를 제공한다. 이종 컨테이너 : 서로 다른 타입의 객체를 하나의 컨테이너에 담아 관리할 수 있는 자바 컬렉션. 이종 컨테이너를 사용하면 여러 타입의 객체를 일관된 방법으로 처리할 수 있어 코드의 유연성과 재사용성을 ..
제네릭 가변인수 배열에 값을 저장하는 것은 안전하지 않다. 힙 오염이 발생할 수 있다. (컴파일 경고 발생) 자바7에 추가된 @SafeVarargs 애노테이션을 사용할 수 있다. 제네릭 가변인수 배열의 참조를 밖으로 노출하면 힙 오염을 전달할 수 있다. 예외적으로, @SafeVarargs 애노테이션을 사용할 수 있다. 예외적으로, 배열의 내용의 일부 함수를 호출하는 일반 메서드로 넘기는 것은 안전하다. 아이템28의 조언에 따라 가변인수를 List로 바꾼다면 배열없이 제네릭만 사용하므로 컴파일러가 타입 안정성을 보장할 수 있다. @SafeVarargs 애너테이션을 사용할 필요가 없다. 실수로 안전하다고 판단할 걱정도 없다. 가변인수 파라미터를 받는 메서드를 호출하면 가변인수를 담기 위한 배열이 자동으로 만..
매개변수화 타입을 받는 정정 유틸리티 메서드 한정적 와일드카드 타입을 사용하면 더 유연하게 개선할 수 있다. 제네릭 싱글턴 팩터리 불변객체 하느를 어떤 타입으로든 매개변수화 할 수 있다. 재귀적 타입 한정 자기 자신이 들어간 표현식을 사용하여 타입 매개변수의 허용 범위를 한정한다. 2개의 Set을 합치는 Util 클래스인 Union 클래스에 정적 유틸리티 메서드 union 현재 코드는 로우타입으로 값을 꺼내서 사용할 때 String일 것이라고 예상했으나 실제 Set에는 Integer도 들어가 있어서 런타임시 ClassCastException이 나는 코드이다. 컴파일타임에 이러한 문제를 방지하기 위해 제네릭을 사용한다. 메서드에서는 리턴타입 앞에 사용할 제네릭을 적어준다. Integer를 사용하려고 했더니..
배열은 공변(covariant), 제네릭은 불공변 배열은 실체화(reify) 되지만, 제네릭은 실체화 되지 않는다. (소거) new Generic[배열]은 컴파일 할 수 없다. 배열은 공변(covariant), 제네릭은 불공변 공변 : 같이 변한다. 불공변 : 같이 변하지 않는다. 배열의 공변이란 상속 관계에 있는 배열이 묵시적 형변환이 가능한가? 그렇다는 것이다. Sub 클래스가 Super 클래스를 상속하고 있는 하위 클래스라면 배열 Sub[]는 배열 Super[]의 하위 타입이 된다. 해당 코드를 보자면 Object는 모든 객체의 최상위 클래스로 String 또한 Object의 하위 클래스이다. 그러므로 String 배열은 Object 배열로 담을 수 있다. Refereces 타입의 형변환 같이 부모..
비검사(unchecked) 경고란? 컴파일러가 타입 안정성을 확인하는데 필요한 정보가 충분치 않을 때 발생시키는 경고 할 수 있는 한 모든 비검사 경고를 제거하라. 경고를 제거할 수 없지만 안전하다고 확신한다면 @SuppressWarnings("unchecked") 애노테이션을 달아 경고를 숨기자. @SuppressWarnings 애노테이션은 항상 가능한 한 좁은 범위에 적용하자. @SuppressWarnings("unchecked") 애노테이션을 사용할 때면 그 경고를 무시해도 안전한 이유를 항상 주석으로 남겨야 한다. IDE 툴을 쓰다보면 빨간색으로 경고가 표시되면 컴파일 자체가 안되는 코드를 알려주고 노란색 경고가 표시되면 컴파일과 실행은 되지만 리턴받는 타입이 명확하지 않을 때나 deprecate..
제네릭 용어 정리 로 타입 (raw type): List 제네릭 타입 (generic type): List 매개변수화 타입 (parameterized type): List 정규 타입 매개변수 (formal type parameter): E 실제 타입 매개변수 (actual type parameter): String 한정적 타입 매개변수 (bounded type parameter): List 비한정적 와일드카드 타입 (unbounded wildcard type): Class 한정적 와일드카드 타입 (bounded wildcard type): Class box 를 받고 있다. 이 물음표는 와일드 카드라고 하고 제네릭 타입의 다형성을 적용한 기능이다. '비한정적 와일드카드 타입' 이라 부르고 제한 없이 모든 ..