2009-10-12 3 views
15

자바에서는 단일 클래스뿐만 아니라 전체 클래스 세트 (패키지)도 가져올 수 있습니다. 일례로서Java에서 클래스 가져 오기와 패키지 가져 오기간에 차이가 있습니까?

import java.util.* 

코드의 길이 이외

import java.util.ArrayList; 
import java.util.Date; 
import java.util.Enumeration; 
import java.util.HashSet; 
import java.util.Hashtable; 
import java.util.List; 
import java.util.Iterator; 
import java.util.Map; 

포함 어떠한 방식으로 각각의 방법을 사용하여 임의의 특정 이점이있다? 메모리 할당? 공연?

+0

나는 이것에 관해 막 물어 봤다. 감사! –

답변

26

두 성능 모두 또는 메모리 할당 이점이 없습니다. 둘 다 동일한 바이트 코드로 컴파일됩니다.

import 문은 소스 코드가 참조하는 클래스를 찾을 위치를 컴파일러에 알리는 것입니다.

그러나 클래스별로 가져 오기하는 경우 장점이 있습니다. 2 개의 패키지에 같은 이름의 클래스가있는 경우, 어느 클래스가 참조되고 있는지에 관해서는 충돌이있을 것입니다.

이러한 예로는 java.awt.List 클래스와 java.util.List 클래스가 있습니다.

java.awt.Paneljava.util.List을 사용한다고 가정 해 보겠습니다.소스 패키지를 가져 오는 경우 다음과 같이

import java.awt.*; 
import java.util.*; 

을 그런 다음 List 클래스에 참조가 ambigious 될 것입니다 :

List list; // Which "List" is this from? java.util? java.awt? 

을하지만, 하나는 명시 적으로 수입하는 경우, 결과가 될 것입니다 :

import java.awt.Panel; 
import java.util.List; 

List list; // No ambiguity here -- it refers to java.util.List. 
+1

좋은 지적. 그런 다음 컴파일러는 List로 코드를 컴파일하는 동안 컴파일 오류를보고합니까? –

+0

예, 컴파일러는'List'라는 이름이 모호하다는 오류를 알려줍니다. – Jesper

+1

N.B. 여전히 전체 패키지를 가져온 다음 개별 클래스의 가져 오기를 무시할 수 있습니다. 즉, java.awt. *를 import 한 다음 java.util.List를 import 할 수 있습니다. –

2

응용 프로그램의 메모리 할당이나 성능에는 전혀 차이가 없습니다. import 문은 프로그램에서 런타임에 전혀 영향을 미치지 않습니다. 그것들은 컴파일러에게 (어느 패키지로) 클래스를 찾을지를 컴파일러에게 알려주는 지시문 일뿐입니다.

그러나 와일드 카드 구문을 사용하지 않고 항상 특정 가져 오기를 사용하는 것이 가장 좋습니다. 이렇게하면 프로그램의 라이브러리 버전과의 호환성 문제를 피할 수 있습니다.

프로그램에서 라이브러리의 버전 1.0을 사용 중이고 import somelibrary.*;을 사용한다고 가정합니다. 프로그램에 X이라는 클래스가 있다고 가정합니다. 이제 1.1 버전의 라이브러리가 나왔고 사용하고 싶습니다. 우연히 라이브러리 버전 1.1에 X이라는 새 클래스가 있다고 가정합니다.

와일드 카드 구문을 사용하는 경우 갑자기 라이브러리에서 X을 가져 오게됩니다. 컴파일러는 이미 프로그램에 클래스 X이 있기 때문에 오류가 발생하며 컴파일러는 XX을 라이브러리에서 구별 할 수 없습니다.

라이브러리에서 실제로 필요한 클래스 만 가져 오는 경우이 라이브러리의 버전 1.1에서 X을 자동으로 가져 오지 않으므로이 문제가 발생하지 않습니다.

6

사용하도록 선택한 가져 오기는 클래스 이름을 확인할 때만 컴파일시간에 차이가 있습니다.

그래서 단점은 가독성에 적용됩니다.

당신이 실제로 사용하고있는 것을 누군가 볼 수 있기 때문에 필요한 최소한의 정보 만 가져 오는 것이 좋습니다. 즉, IDE가 아마 이것을 처리하고 그것은 논점입니다.

2

클래스가 충돌 할 가능성이 없으므로 명시 적 가져 오기를 수행하는 것이 컴파일 시간에 더 안전합니다. 예 :

import java.sql.*; 
import java.util.*; 

은 (어떤 패키지에서?) Date 클래스를 사용하려고하면 문제가 발생합니다.

하지만 그 외에는 성능이나 메모리 측면이 없습니다. 그것은 순전히 컴파일 타임의 문제입니다.

2

'*'을 사용하여 가져 오는 이점은 코드 줄이 적고 입력하는 횟수가 적다는 것입니다. IDE 대신 "벙어리 (dumb)"텍스트 편집기로 코딩 할 경우 타원을 사용하여 반입을 숨기고 반자동 반입을 추가 할 수있는 것보다 더 중요합니다. 사용 가져

단점은 '*':

  • 당신은 가끔 클래스 이름 충돌을 수입 얻을; 예 : 다른 패키지의 클래스에 대해 일부 클래스 이름이 사용되고 둘 다 가져올 때.
  • 가져 오기를 보면 클래스의 명시 적 종속성을 볼 수 없습니다. 하지만 IDE가 종속성을 다른 방식으로 보여 줄 수 있다면 중요하지 않습니다.
0

괜찮은 IDE라도 가져 오기 명령문을 넣을 수 있습니다. 이것이 당신에게 문제가된다면 더 나은 IDE를 얻으십시오.

IntelliJ 않습니다; Eclipse도 마찬가지입니다. NetBeans를 직접 사용하지는 않지만 그럴 것이라고 확신합니다.

관련 문제