혼란을 줄이는 것 외에 Java에서 사용하지 않는 가져 오기를 정리해야하는 이유가 있습니까?


99

Java에서 사용하지 않는 import 문을 피해야 할 합당한 이유가 있습니까? 내가 이해하는대로 그것들은 컴파일러를위한 것이므로 사용하지 않는 많은 가져 오기는 컴파일 된 코드에 영향을 미치지 않습니다. 혼란을 줄이고 이름 충돌을 피하기위한 것일까 요?

(이클립스가 사용하지 않은 가져 오기에 대한 경고를 제공하기 때문에 물어 봅니다. 클래스 디자인이 끝날 때까지 가져 오기를 제거하고 싶지 않기 때문에 코드를 개발할 때 다소 짜증이납니다.)

답변:


86

나는 당신이 수입품을 제거하지 않으면 성능 문제 또는 이와 유사한 것들이 가능성이 없다고 생각합니다.

그러나 드물게 목록 인터페이스 가져 오기와 같은 이름 지정 충돌이있을 수 있습니다.

Eclipse에서는 언제든지 바로 가기 (OS에 따라 다름-Win : Ctrl + SHIFT + O및 Mac COMMAND + SHIFT + O:)를 사용하여 가져 오기를 구성 할 수 있습니다. 그런 다음 Eclipse는 가져 오기 섹션을 정리하여 모든 오래된 가져 오기 등을 제거합니다. 가져온 항목이 다시 필요한 경우 eclipse는를 사용하여 명령문을 완료하는 동안 자동으로 추가합니다 Ctrl + SPACE. 따라서 수업에서 사용하지 않는 코드를 보관할 필요가 없습니다.

항상 그렇듯이 사용하지 않는 코드는 코드를 읽고 나중에 필요할 수도 있기 때문에 활성 코드에 무언가를 남기는 동안 당신과 다른 사람들의주의를 산만하게 할 것입니다.


22
실제로 Windows에서는 Ctrl + Shift + O입니다.
Matt Ball

1
리눅스 우물에서 Ctrl + Shift + O. 아마도 BSD에서도 동일합니다.
WhyNotHugo 2011 년

2
가져 오기 구성 작업을 수행하는 또 다른 방법은 ctrl+3(적어도 windwos에서) 클릭 한 다음 imports를 입력하는 것입니다. 분명히 ctrl + shift + O보다 느리지 만 특정 단축키를 기억하지 못하더라도 빠르게 찾을 수있는 방법입니다 (그리고 기억하거나 찾으려는 다른 많은 작업).
epeleg

53

하나는 클래스 경로에서 가져 오기에 의해 참조되는 클래스를 제거하면 목적이없는 어리석은 컴파일러 오류가 발생하지 않는다는 것입니다. 그리고 "사용 된 위치"검색을 수행 할 때 오 탐지가 발생하지 않습니다.

사용하지 않는 가져 오기가 다른 가져 오기와 이름 지정 충돌을 일으켜 불필요하게 완전한 이름을 사용하게되는 경우도 있습니다 (그러나 이것은 본질적으로 매우 구체적입니다).

부록 : 오늘 빌드 서버가 메모리 부족 오류와 함께 컴파일 실패 (테스트 실행도 아님)를 시작했습니다. 그것은 영원히 잘 실행되었고 체크인은 빌드 프로세스에 대한 변경이나 이것을 설명 할 수있는 중요한 추가 사항이 없었습니다. 메모리 설정을 늘리려 고 시도한 후 (64 비트 CentOS에서 64 비트 JVM을 실행합니다!) 클라이언트가 컴파일 할 수있는 위치를 훨씬 넘어서서 체크인을 하나씩 검사했습니다.

개발자가 사용하고 포기한 부적절한 가져 오기가있었습니다 (그들은 클래스를 사용하고 자동으로 가져 와서 실수라고 깨달았습니다). 사용하지 않는 가져 오기는 IDE가 애플리케이션을 분리하도록 구성되어 있지 않지만 빌드 프로세스는 애플리케이션의 전체 별도 계층에서 가져 왔습니다. 그 단일 가져 오기는 너무 많은 클래스를 드래그하여 컴파일러가 클래스 경로에 관련 종속 라이브러리없이 컴파일을 시도하여 메모리 부족 오류를 유발하는 많은 문제를 일으켰습니다. 사용하지 않은 가져 오기로 인한이 문제를 해결하는 데 1 시간이 걸렸습니다.


4
@Yishai, Eclipse를 사용하는 경우 저장할 때마다 소스 코드를 정규화 할 수있는 Save Actions를 살펴보십시오.
Thorbjørn Ravn Andersen

2
@EJP는 결과 바이트 코드에 영향을주지 않지만 컴파일러는 생성해야하는 바이트 코드를 이해하기 위해이를 해결해야합니다.
Yishai

3
@EJP, 전체 부록은 컴파일 시간에 대해 이야기하고 있습니다 ( "빌드 서버가 컴파일 실패를 시작했습니다").
Yishai

1
가져 오기만으로이 모든 일이 어떻게 발생할 수 있는지 아직도 이해가 안 되나요?
Thorbjørn Ravn Andersen

1
@Yishai 미안하지만 나는 그것을 믿지 않는다. 당신은 이것을 잘못 진단했습니다. 클래스가 실제로 사용되지 않는 한 가져 오기는 그러한 효과가 없어야합니다. import 문은 해당 클래스가 어떤 패키지에 있는지 컴파일러에 알리는 것뿐입니다. 컴파일러는 해당 클래스에 대한 유형 정보가 필요할 때만 암시 적으로 컴파일을 시도합니다.
Marquis of Lorne

9

순수한 관점에서 모든 종속성은 제품에 대한 "제약"이므로 나중에 유지 관리 문제를 일으킬 수 있습니다.

예를 들어, 프로그램에서 com.XYZObjectPool 클래스를 사용하고 나중에 사용하지 않기로 결정하고 가져 오기를 제거하지 않는다고 가정합니다. 다른 누군가가 이제 org.WVYObjectPool을 인스턴스화하고 ObjectPool을 참조하기를 원하면, 캐스팅 문제 나 호출 문제가있을 때까지 경고를받지 않습니다.

그건 그렇고, 이것은 비현실적인 시나리오가 아닙니다. Eclipse가 가져 오려는 X의 특정 버전을 묻고 여러 패키지 중에서 하나를 선택할 때마다 가져 오기가 있었다면 알지 못한 채 잘못된 선택을했을 수있는 시나리오입니다.

어느 쪽이든 Eclipse에 이러한 항목을 정리하도록 요청할 수 있습니다.


3

경고? Eclipse에 자동으로 정리하도록 요청하십시오. 이것이 IntelliJ가하는 일입니다. 경고 할만큼 똑똑하다면 정리할 수있을만큼 똑똑해야합니다. 그런 잔소리를 멈추고 무언가를하도록 알려주는 Eclipse 설정을 찾는 것이 좋습니다.


4
그게 조치를 저장합니다. 개인적으로 Eclipse는 명시 적으로 요청했을 때만 코드를 변경하는 것이 좋습니다.
Thorbjørn Ravn Andersen

1
@ Thorbjørn : 동의합니다. 특히 수업이 잠시 중단되었지만 곧 다시 추가 될 것으로 예상됩니다.
Donal Fellows

2
@Donal, 글쎄요, 그것이 바로 Ctrl-Space의 용도입니다.
Thorbjørn Ravn Andersen

3

이것은 유지 보수에 유용한 프로그램의 명확성과 관련이 있습니다.

프로그램을 유지해야한다면 한 줄에 단일 클래스를 가져 오는 것이 얼마나 유용한 지 알게 될 것입니다.

다음 시나리오를 고려하십시오.

import company.billing.*;
import company.humanrerources.*;

// other imports 


class SomeClass {
      // hundreds or thousands of lines here... 
    public void veryImportantMethod() {
      Customer customer;
      Employee comployee;
      Department dept. 
      // do something with them
     }
 }

버그를 수정하거나 코드를 유지 관리 할 때 (또는 읽기만 할 때) 사용 된 클래스가 어떤 패키지에 속하는지 독자가 아는 것이 매우 유용합니다. 위에 표시된대로 와일드 카드 가져 오기를 사용하는 것은 이러한 목적에 도움이되지 않습니다.

IDE를 사용하더라도 선언 및 반환으로 마우스를 가져 가거나 건너 뛰고 싶지는 않습니다. 현재 코드가 의존하는 다른 패키지 및 클래스가 무엇인지 기능 측면에서 이해하면 더 쉽습니다.

이것이 개인 프로젝트 나 작은 것을위한 것이라면 그것은 정말로 중요하지 않지만, 다른 개발자가 사용해야하는 (그리고 수년 동안 유지되어야하는) 더 큰 것을 위해서는 반드시 가져야합니다.

어떤 성능 차이도 전혀 없습니다.


3

참고로, 이것은 수입품을 구성하여 실제로 사용하지 않은 수입품을 제거한다고 생각하지 않았기 때문에 나를 잡았습니다.

저장 작업 중에 가져 오기를 자동으로 제거하면 예를 들어 개발 또는 테스트 중에 문제가 발생하고 일부 코드를 주석 처리 할 때 슬픔이 생겼습니다. 저장하면 주석 처리 된 코드 섹션에서 사용한 가져 ​​오기가 제거되었습니다. 변경 사항을 실행 취소 ( Ctrl+ Z) 할 수 있기 때문에 문제가되지 않는 경우도 있지만 다른 변경 사항을 적용했을 수 있으므로 그렇게 간단하지 않은 경우도 있습니다. 또한 코드의 주석 처리를 해제 할 때 (이전에 주석 처리 한 다음 저장하여 해당 코드에 대한 가져 오기를 제거했습니다) 자동으로 필요한 가져 오기를 추측하고 잘못된 가져 오기를 선택하는 문제가있었습니다 (예 : 했다 StringUtils)를 사용하고 클래스 그것은 잘못된 라이브러리에서 같은 이름의 다른 하나를 집어.

가져 오기를 저장 작업으로 사용하는 것보다 수동으로 구성하는 것을 선호합니다.


2

이클립스의 경우 다음을 사용합니다 : 창-> 환경 설정-> 자바-> 편집기-> 작업 저장-> 가져 오기 구성 확인란을 선택하십시오 (형식 지정, 필드 작성 등의 다른 유용한 항목도 많이 있습니다. .). 그래서 내가 내 파일 일식을 저장할 때 나를 위해 unessacry 가져 오기를 제거합니다. 제 생각에는 필요하지 않은 것이 있으면 제거하십시오 (또는 일식으로 제거하십시오).


2

사용하지 않는 import 문을 주석으로 처리 할 수 ​​있으며 경고는 당신을 괴롭히지 않지만 당신이 가진 것을 볼 수 있습니다.


2
@DimaSan 실제로 그렇습니다 : 질문은 내가 클래스 디자인을 완료
V 시리즈

1

성능에 미치는 영향은 없지만 가독성을 위해 깔끔하게 만들 수 있습니다. 사용하지 않는 가져 오기를 제거하는 것은 Eclipse와 IntelliJ IDEA 모두에서 매우 간단합니다.

Windows / Linux-    Ctrl+ Shift+O

맥-                        Cmd+ Shift+O

IntelliJ IDEA 또는 Android Studio

Windows / Linux-    Ctrl+ Alt+O

맥-                        Cmd+ Alt+O


0

몇 년 전 어딘가에서 가져온 모든 클래스가 가져 오기 클래스와 함께 런타임에로드된다는 것을 읽었습니다. 따라서 사용되지 않는, 특히 전체 패키지를 제거하면 메모리 오버 헤드가 줄어 듭니다. 현대 버전의 자바가 그것을 처리한다고 생각하지만 더 이상 이유가 아닐 것입니다.

그건 그렇고, eclipse를 사용하면 Ctrl+ Shift+ O를 사용 하여 가져 오기를 구성 할 수 있지만 Java 파일을 저장할 때마다 이러한 작업을 처리하는 "클리너"를 구성 할 수도 있습니다.


흠 .. 그게 행동이라면 놀랄 것입니다 .. 처음 사용할 때까지 또는 사용자 정의 로더에서 특별히 요청할 때까지 클래스가 초기화되지 않는다는 것을 알고 있습니다 (즉, 정적 초기화 프로그램 호출). 그러나 "로드 됨"에 의해 "메모리로 읽었지만 처리되지 않음"을 의미하는 경우 가능합니다.
Kip

실제로 더 생각해 보면 테스트하기가 상당히 쉬워야합니다. 사용하지 않는 가져 오기로 코드를 컴파일 한 다음 "디 컴파일"도구를 사용하여 사용하지 않는 가져 오기가 아직 있는지 확인합니다. 그렇지 않은 경우 컴파일러에 의해 제거되거나 프로그래머의 편의를 위해 거기에 있습니다.
Kip

4
도대체 어디서 읽었습니까? 그것은 완전하고 완전히 부정확하며 항상 그랬습니다 . 가져 오기를 제외 하고 코드에서 참조하는 모든 클래스 가로드됩니다 .
Marquis of Lorne 2010-08-15

0

나를 위해 컨트롤러 클래스에서 사용되지 않는 클래스 가져 오기는 코드 정리 중에 가져온 클래스를 삭제하고 로컬에서 빌드를 테스트하지 않고 git에서 삭제를 커밋 한 후 Jenkins 빌드에서 컴파일 문제를 생성했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.