ordinary
[effective_java] item26, item27 본문
Generic이란 ?
다양한 타입의 객체를 컴파일시에 체크하는 기능
- T : Type Variable
- E : Element
- K : Key
- V : Value
제네릭은 개인적으로 실무에서 각 도메인의 dto -> ResponseEntity(를 사용한 커스텀 객체)로 한번 더 묶어줄때 쓰면 좋겠다고 생각했음.별 내용없는것 같은데 책이랑 자료에서는 굉장히 어려운 내용 처럼 보인다...아는만큼 보이는건가.. 실무에서 사용할때의 예시를 많이 기억해두면 좋을 듯 하다.
Item26 : 로(raw) 타입은 사용하지 말라
Item27 : 비검사 경고를 제거하라
Item26 : 로(raw) 타입은 사용하지 말라
- raw type이란?
List names = new ArrayList(); // 이게 raw type!
names.add("스트링1");
names.add("string2");
names.add(Boolean.FALSE); // 이것도 가능함
BUT ?!
for( Object o : names ) {
String str = (String) o;
System.out.println(str); // ClassCastException~!~!
}
String으로 cast를 해주면서 ClassCastException이 발생할 수 있다.
names.add() 한 라인과 (String) cast 한 라인이 멀리 떨어져 있다면 오류 위치를 확인하기 어려울 수 있음
그래서
List<String> names = new ArrayList<String>();
names.add("John");
names.add("Mary");
names.add(Boolean.FALSE); // 여기서 바로 에러남
바로 에러가 잡힐 수 있게끔 <String> Generic을 사용해서 형변환의 안정성과 표현력을 가져가도록 하자.
-> 모르는 타입을 받고 싶어서 List <Object>는 사용하지 말고
1. Set <?>의 비한정적 와일드카드타입을 사용하도록 하거나
2. instanceof 연산자와 같이 사용하자
if(o instanceof Set) { // 여기서 한번 Set만 거르고 들어가기때문에
// 아래에서 Set<?>으로 cast 해줘도 에러가 나지 않는다.
Set<?> s = (Set<?>) o;
}
Item27 : 비검사 경고를 제거하라
- 비검사 경고란?
@SuppressWarnings("unchecked")
을 붙여서 경고를 숨기는 기능이다.
`경고를 숨긴다`는 문장에서 알 수 있듯이 위험 요소의 가능성을 최소화한 뒤 좁은 범위에서 사용할 수 있도록 하라는 얘기이다.
또한 경고를 무시해도 안전한 이유를 주석으로 남겨두어야 한다.