본문 바로가기
프로그래밍 놀이터/디자인 패턴, 리펙토링

[Effective Java] 제네릭 타입을 애용하자.

by 돼지왕 왕돼지 2016. 11. 29.
반응형

 [Effective Java] 제네릭 타입을 애용하자.


Effective JAVA, E[] elements = (E[]) new Object[ size ], Generic, list, new E[ size ], object, Object[] elements = new Object[ size ], Primitive, scalar, unchecked cast, [Effective Java] 제네릭 타입을 애용하자., 경고, 성능 이슈, 시간, 억제, 영향, 제네릭, 제네릭 타입, 제네릭화, 캐스팅, 캐스팅 방법, 코드, 클라이언트, 클라이언트 코드, 클래스, 클래스 선언부, 타입 매개변수


-
클래스를 제네릭화 하는 방법.


-
1. 클래스 선언부에 하나 이상의 타입 매개변수를 추가.


-
2. 코드 안에 나오는 모든 Object 타입을 그것에 맞는 타입 매개변수로 변경한 후 컴파일.

new E[ size ] 와 같은 부분에서 보통 에러가 난다.

이를 피해가는 방법 1.
E[] elements = (E[]) new Object[ size ]; // 타입 안전하진 않다.

이를 피해가는 방법 2.
Object[] elements = new Object[ size ]; // 사용하는 부분에서 casting 이 필요하다..

scalar 타입보다 배열 타입에 대한 unchecked 캐스트 경고를 억제하는 것이 더 위험하므로, 2번 방법이 더 적합해 보인다.


하지만 저런 식의 E[] array 를 사용하는 곳이 많다면 매번 casting 을 해줘야 하기 때문에 실무에서는 1번 방법을 선택하는 경우가 더 많다.
여튼 상황(코드)에 따라 취사선택은 해야 한다.

new E[] 를 피하기 위해 안쪽에서도 List 를 사용하는 것은 고려해봐야 한다.
Java 언어 자체에서 List 를 primitive 계열로 지원하는 것이 아니기 때문에 성능 이슈가 생길 수 있다.



Summary


클라이언트 코드에서 캐스팅을 해야 하는 타입보다 제네릭 타입이 더 안전하고 쓰기 쉽다.
새로운 타입 설계할 때는 캐스팅 없이 사용 가능한지 검토하고 그렇게 하게 하자. ( -> 제네릭화 )
시간이 닿는 대로 제네릭으로 바꿀 수 있는 부분을 제네릭으로 바꾸자.
그럼 기존 클라이언트 코드에 영향을 주지 않고 그 타입을 더 쉽게 사용할 수 있다.





반응형

댓글