지네릭스, 열거형
지네릭스
다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입 체크를 해주는 기능
객체의 타입 안정성을 높이고 형변환의 번거로움이 줄어듬
Ex) class Box <T>
Box <T> - 지네릭 클래스
T - 타입 변수 또는 타입 매개변수
Box - 원시 타입
지네릭 클래스의 객체를 생성할 때 참조변수에 지정해준 지네릭 타입과 생성자에 지정해준 지네틱 타입은 일치해야함. 서로 상속관계에 있는 자식, 부모 클래스여도 불가능함
그러나 지네릭 타입이 아닌 클래스의 타입 간에 다형성을 적용하는 것은 가능, 이 경우도 지네릭 타입은 일치해야함
또한 지네릭 타입이 부모 클래스인 지네릭 클래스를 생성하고 이 지네릭 클래스에 지네릭 타입의 자식 클래스의 객체를 저장하는 것은 가능, 대신 지네릭 클래스의 저장된 객체를 꺼낼 때 형변환이 필요.
지네릭 타입에 'extends'를 사용하면 특정 타입의 자손들만 대입할 수 있게 제한할 수 있음
한 종류의 타입만 담을 수 있지만 지네릭 타입으로 정해진 클래스들의 자식 클래스만 더 담을 수 있다는 제한 추가
클래스가 아닌 인터페이스를 구현해야한다는 제약이 필요해도 implements가 아닌 extends를 사용
지네릭 타입에 다형성을 적용할 방법, 와일드 카드
<? extends T> - 와일드 카드의 상한 제한, T와 그 자식들만 가능
<? super T> - 와일드 카드의 하한 제한, T와 그 부모들만 가능
<?> - 제한 없음, 모든 타입이 가능 <? extends Object>와 동일
메서드의 선언부에 지네릭 타입이 선언된 메서드 - 지네릭 메서드
지네릭 타입의 선언위치는 반환타입 바로 앞
메서드에 선언된 지네릭 타입은 지역 변수를 선언한 것과 유사, 이 타입 매개변수는 메서드 내에서만 지역적으로 사용될 것이므로 메서드가 static이건 아니건 상관이 없음
열거형
여러 상수를 선언해야할 때 편리하게 선언할 수 있는 방법
enum 열거형 이름 { 상수명1 , 상수명2 ... }
값을 따로 지정해주지 않아도 자동적으로 0부터 시작하는 정수값이 할당
열거형을 이용해서 상수를 정의한 경우는 값을 비교하기 전에 타입을 먼저 비교하므로 값이 같더라도 타입이 다르면 컴파일 에러가 발생
열거형 상수 간의 비교에는 '=='를 사용할 수 있음. 그러나 < , >와 같은 비교연산자는 사용할 수 없고 compareTo( ) 가 사용 가능
열거형의 상수의 값은 사용하지 않는 것이 좋음, 이 값은 내부적인 용도로만 사용되기 위한 것
열거형 상수의 값이 불규칙적인 경우에는 열거형 상수의 이름 옆에 원하는 값을 괄호 ( )와 함께 적음
enum 열거형 이름 { 상수명1(지정하고 싶은 열거형 멤버의 값), 상수명2(")...}
지정된 값을 저장할 수 있는 인스턴스 변수와 생성자를 새로 추가해주어야 함
주의할 점은 먼저 열거형 상수를 모두 정의한 다음에 다른 멤버들을 추가해야하고, 열거형 상수의 마지막에 세미콜론 ;을 붙여야 함