관리 메뉴

IT 쟁이

Java : class Foo uses unchecked or unsafe operations. 해결방법 본문

JAVA

Java : class Foo uses unchecked or unsafe operations. 해결방법

클라인STR 2008. 5. 20. 01:13

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를 붙여줘도 된다.

그러나! 제네릭의 경우 사용도 편리할 뿐더러, 에러 발생의 여지도 줄여주고, 소스의 가독성마저 높여주므로(개발자들이 가멸차게 요구한 이유가 따로 있는게 아니다!) 가급적 사용토록 할 것!

Comments