일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 객체생성
- ASP.NET
- json
- Oracle 10g
- 이벤트 처리
- 페이지 간 게시
- 우편번호검색
- Ajax댓글
- 자바스윙
- Repeater
- 테이블또는 뷰가 존재하지 않습니다.
- JavaScript
- ajax
- JDK1.5
- prototype
- ASP.NET 회원가입
- jsp
- XML
- DataList컨트롤
- prototype.js
- 자동완성기능
- hyperlink 쿼리스트링 바인딩
- Ajax한글 처리문제
- RowCount 폐이징
- 스크립트릿
- ASP.NET Error
- SQL 명령어가 올바르게 종료되지 않았습니다.
- ORA-00942
- ASP.NET 방명록
- 웹표준
- Today
- Total
IT 쟁이
Java : class Foo uses unchecked or unsafe operations. 해결방법 본문
Java : class Foo uses unchecked or unsafe operations. 해결방법
JDK v1.5(JDK 5)에서는 Collections 프레임워크 기반의 제네릭을 기본으로 하는데(사실 그 이전부터 제네릭에 대한 많은 요청이 있었던 것은 사실이다) 이전 버전과의 차이점을 먼저 살펴보자면...
1) JDK v1.5(JDK 5)이전에 컬렉션 생성시 내부에 임의의 값을 줄 경우[1-소스], 특정 타입으로 제한되지 않은 상태에서, 컬렉션에서 아이템을 추출하기 위해 캐스팅 연산이 필요하게 되고[2-소스], 잘못된 타입으로 캐스팅된 경우 런타임 상태에서 예외가 발생하게 된다. 결국 캐스팅된 결과물을 추출하기 이전에 instanceof를 이용하여 확인하게 되는데..[3-소스]
[1-소스]
List myList = new ArrayList(10);
myList.add(new Integer(10));
myList.add("Hello, World");
[2-소스]
Integer myInt = (Integer)myList.iterator().next();
[3-소스]
Iterator listItor = myList.iterator();
Object myObject = listItor.next();
Integer myInt = null;
if (myObject instanceof Integer) { //캐스팅 오류 발생을 방지하기 위해...
myInt = (Integer)myObject;
}
이 경우 제네릭을 이용하면 Collection에서 저장하고자 하는 오브젝트의 타입을 컴파일시 지정할 수 있게 된다. 이렇게 되면 캐스팅이 필요없게 되고(특정타입이 지정되어 그 외 타입은 사용되지 못하니), 컬렉션 생성시 어떠한 타입을 컬렉션에서 사용할지를 알게 된다.
예)
제네릭 미사용
List myList = new ArrayList(10); //어떤 타입인지 명시되지 않고, put/add 당시에만 확인가능.
제네릭 사용
List<Integer> myList = new ArrayList<Integer>(10); //Integer 타입만 가능하게 명시.
[4-소스]
import java.util.*;
public class First {
public static void main(String args[]) {
List<Integer> myList = new ArrayList<Integer>(10);
myList.add(10); //명시 타입과 같음
myList.add("Hello, World"); //명시 타입과 다름 - String임.
}
}
하나의 컬렉션의 엘리먼트로 작업을 하면서 그 컬렉션 내의 엘리먼트의 타입을 명시적으로 선언하지 않은 경우에도 경고를 받는다. 이 경우 위에서 얘기한
Java : class Foo uses unchecked or unsafe operations. 의 워닝이 발생하는데, 결국 JDK v1.5에서는 컬렉션내의 엘리먼트 타입은 생성 당시부터 지정해 줘야 한다고 머리에 담아두면 된다.
물론, 워닝이므로 JDK v1.5 이하로 컴파일하거나 컴파일러 옵션에 -Xlint:unchecked를 붙여줘도 된다.
그러나! 제네릭의 경우 사용도 편리할 뿐더러, 에러 발생의 여지도 줄여주고, 소스의 가독성마저 높여주므로(개발자들이 가멸차게 요구한 이유가 따로 있는게 아니다!) 가급적 사용토록 할 것!