이책은 참 고려를 좋아한다. 난 고구려가 더 좋은거 같은데...쏘리

제네릭을 이용해서 자료구조를 만드는게 참 좋다고 했다.
근데 Map이나 Set 같은걸 사용할때 다양한 자료형을 집어넣고 싶다. 하나의 자료구조에 String이나 Thread같은 다양한 클레스를 집어넣고 꺼내려면 어떻게 해야할까?

방법 1. 그냥 무조건 Object 제네릭으로 한다음에 꺼낼떄 instanceof 를 사용해서 타입 확인 하고 캐스팅을 한다.

이렇게 하게되면 꺼낼때마다 타입을 확인해야되기 때문에 switch-case 라거나 if-elseif-else 같은 물고 물리는 조건문이 필요하다.  그래서 귀찬으니까 하지말죠?

방법 2. key를 이용해서 타입을 구분한다.
Key1 은 String 을 넣겠음. Key2는 integer을 넣겠음 이라고 정해두고 Map을 만든다면 별로 키에 따라서 케스팅을 해주면되니까 방법1 보다는 좀더 간단 명료해진다. 근데 집어넣을때 그걸 안지켜주면 어떻게함?
key1을 이용해서 Thread 를 집어넣을지도 모르는데 그걸 어떻게 체크 하느냐? 라는 문제가 발생한다.

여기서는 한가지 좋은 방법을 제시하는데 Class 클레스를 이용하는것이다. Class class 라니 뭔소리냐... 라고 물으신다면 나도 별수 없다. 각 클레스는 그 클레스의 형태(용법, 등등등 )를 기록해둔 Class라는 클레스의 객체를 하나 가지고 있다.
그리고 그 Class 클레스는 제네릭 타입이라서 Class<T> 의 형식으로 항상 사용된다.

String의 Class 클레스는 Class<String> 형이다.

자 그렇다면 이것을 어떻게 사용할것인가? 라는건데
우선 Class 클레스 라는것의 특징을 내가 아는데로  설명을 하자면 Class 클레스(... 시발 몇번을 적어야되는겨)의 객체는 그 것을 포함하는 클레스(Integer이나 String, Object 같은)가 로드 될때 딱 한번 생성된다. -라고 내가 생각함

또한 Class 클레스는 Object 의 하위 클레스이다. 따라서 Object에 있는 기능들을 모두 쓸수 있는데 그중 유용한것은 hashcode 메소드.
따라서 Class를 이용해서 HashMap을 작성할수도 있다.

Map<Class<?>,Object> 같은 Map을 말이다.
또한 내가 만든 어떤 클레스의 hashcode 메소드에다가 return class.hashCode();  라고 해주면 그 클레스의 Class 클레스의 해쉬값을 이용해서 해싱을 하겠다는것니까 해당 클레스의 객체중에 단 하나만 쓰겠다. 라는 의미로도 해석될수 있다.


Map<Class<?>,Object> 을 이용한 코드는 책에 잘 나와있기 때문에 일부분만 적어보도록 하겠다.
public <T> T get(Class<T> c){
	return c.cast(map.get(c));
}
이런 식으로 이용이 가능하다. 위에서 map 라는 녀석은  Map<Class<?>,Object> 의 객체이다.



근데 솔직히 말해서 이걸 어따 써야할지는 나도 말모르겠다. 
Posted by 동적할당
: