쌍용 강북 교육센터 국비학원 Day 19일차
Properties
Properties 는 HashMap의 구버전인 Hashtable을 상속받아 구현한 것으로, Hashtable 은 키와 값(Object, Object)의 형태로 저장하는데 비해서 Properties 는 (String 키, String 밸류값)의 형태로 저장하는 단순화된 컬렉션 클래스이다.
키는 고유해야 한다. 즉, 중복을 허락하지 않는다. 중복된 값을 넣으면 마지막에 넣은 값으로 덮어씌운다.
주로 어플리케이션의 환경설정과 관련된 속성 (property)을 저장하는데 사용되며, 데이터를 파일로 부터 읽고 쓰는 편리한 기능을 제공한다.
와일드카드 <?>
제네릭이 등장했지만 오히려 실용성이 떨어지는 상황들이 생기면서, 모든 타입을 대신할 수 있는 와일드카드 타입(<?>)을 추가하였다. 와일드카드는 정해지지 않은 unknown type이기 때문에 Collection<?>로 선언함으로써 모든 타입에 대해 호출이 가능해졌다. 그래서 제네릭의 활용성을 높일 수 있게 되었는데, 여기서 중요한 것은 와일드카드가 any type이 아닌 unknown type이라는 점이다.
그런데 와일드카드는 unknown type이므로 Integer, String 또는 개발자가 추가한 클래스까지 될 수 있기 때문에 범위가 무제한이다. 와일드카드의 경우 넘겨주는 파라미터가 unknown 타입의 자식이여야 하는데, 정해지지 않았으므로 어떠한 타입을 대표하는지 알 수 없어서 자식 여부를 검사할 수 없는 것이다.
반면에 get으로 값을 꺼내는 작업은 와일드카드로 선언되어 있어도 문제가 없다. 왜냐하면 값을 꺼낸 결과가 unknown 타입이여도 우리는 해당 타입이 어떤 타입의 자식인지 확인이 필요하지 않으며, 심지어 적어도 Object의 타입임을 보장할 수 있기 때문이다. 결국 이러한 상황이 생기는 것은 결국 와일드카드가 any 타입이 아닌 unknown 타입이기 때문이다.
한정적으로 와일드카드를 사용하면 특정 타입을 기준으로 상한 범위와 하한 범위를 지정함으로써 호출 범위를 확장 또는 제한할 수 있다. 또한 하나의 참조 변수로 대입된 타입이 다른 객체를 참조 가능하며, 메소드의 매개변수에도 와일드 카드를 사용할 수 있다.
와일드 카드의 상한, 하한 제한
<? extends T> - 와일드카드의 상한 제한, T와 그 자손(하위) 들만 가능
<? super T> - 와일드카드의 하한 제한, T와 그 조상(상위) 들만 가능
<?> - 제한없음. 모든 타입이가능. <? extends Object> 와 동일
Enum (열거형)
public static final (인터페이스 선언된 변수)의 속성은 문제점이 있다. 두 가지 문제점이 있는데 하나는 변수를 네임할때는 switch 문에서 사용할 수 없고 또 하나는 선언이 너무 복잡하다는 것이다. 그래서 사용하는 것이 enum 이다.
사용자가 어떠한 값을 나타날때 그 값이 String 타입만 되면 어떤 것이든지 문자열이기만 하면 들어올 수 있기 때문에 자바는 오류가 아니지만 사용자 측면에서는 원하지 않는 값이 사용되어 오류가 발생할 수 있다.
이러한 경우 "서로 연관된 상수들의 집합" 의미하는 enum (열거형) 이라는 타입을 사용하여 해결할 수 있다.
쉽게말해 enum으로 열거된 단어를 정의하고 그 단어만 사용할 수 있게 다른 String (문자열)타입 또한 받지 않는 것이다.
( " " 큰 따음표도 받지 못하고 enum에 정의된 글자 그대로만 사용할 수 있다)
enum의 특성
enum은 생성자를 가질 수 있고, enum의 생성자는 접근 제어자 private만을 허용한다.
열거형은 연관된 값들을 저장한다. 또 그 값들이 변경되지 않도록 보장한다. 뿐만 아니라 열거형 자체가 (추상) 클래스이기 때문에 열거형 내부에 생성자, 필드, 메소드를 가질 수 있어서 단순히 상수가 아니라 더 많은 역할을 할 수 있다.
또한 인스턴스 생성과 상속을 방지하고 키워드 enum을 사용하기 때문에 구현의 의도가 열거임을 알 수 있다.