반응형

Iterator<E>

  • 클래스를 작성할 때, Object타입 대신 T와 같은 타입 변수를 사용

예전에, Iterator가 일반 클래스일 때는, 다음요소를 읽어오는 next();가 Obejct타입이었다.

이것이 지네릭 클래스로 바뀌면서 타입변수 <E>를 선언하고, Object대신 타입변수 E로 바뀌었다.

그래서, 예전에는 next()메서드의 반환타입이 Object였어서 형변환이 필요했으나,
지네릭 클래스로 바뀌고 난 다음부터는 <E>에 <Student>를 대입하게 되면서 전과 달리
next()의 반환타입이 Student이므로 참조변수의 타입과 일치하므로 형변환을 하지 않아도 된다.

[Ex12_2]


 

HashMap<K, V>

  • 여러 개의 타입 변수가 필요한 경우, 콤마(,)를 구분자로 선언

HashMap은 타입변수가 2개이다 <K, V>
이처럼 타입변수가 여러개인 경우에는 콤마(,)로 구분자로 선언한다. 2개이상도 가능하다.

왜 여러개가 필요할 때가 있냐면,

key와 value는 둘다 Object인데, 이 타입이 항상 같은게 아니다.다를 수 도 있다.
예를 들면 Key는 String이고, Value의 타입은 Student일 수도 있다.
그래서 HashMap에 저장할 때 여러 개의 타입 변수가 필요할 수도 있다.

저장할 때, 타입변수 K에 String, V에 Student를 대입하면 위의 코드가  이렇게 바뀐다.
그러면, 저장할 때, key의 타입은 String, value의 타입은 Student가 된다.

그러면 get() 메서드로 꺼낼 때, get()의 반환타입이 Object여서 형변환이 필요했는데,
이제는 get()의 반환타입이 Student가 된다. 그러면, 저장하려는 참조변수의 타입 Student와 get()의 반환타입이 일치하므로 형변환이 불필요하게 된다.

 

여기서 의문이 생길 수 있다.

"get()과 remove()의 Object는 왜 K로 안쓰고 Object로 남겨두었나요?" 라는 질문에 대한 답변은,
"get, remove 등의 메서드가 구현되어있는 소스코드를 보면, Object를 그대로 사용하기 떄문이다."
즉, 지네릭스가 도입된 이후라도, Object를 사용하는 것을 전부다 타입 변수로 바꾼 것은 아니라는 사실을 확인할 수 있다.

 

[Ex12_2b]

반응형

'JAVA' 카테고리의 다른 글

와일드 카드, 지네릭 메서드  (0) 2022.05.07
제한된 지네릭 클래스, 지네릭스의 제약  (0) 2022.05.04
지네릭스 용어, 지네릭 타입과 다형성  (0) 2022.05.04
타입 변수  (0) 2022.05.04
지네릭스란?  (0) 2022.05.03