언어/JAVA

[JAVA] import와 static import 차이는???

chan10 2021. 2. 28. 15:40

import문은 컴파일 시 컴파일러에게 패키지에 대한 정보를 제공하여 해당 클래스를 찾을 수 있게 도와줍니다.

 

자바에서 기본적으로 제공하는 java.lang패키지가 아닌 외부 클래스 파일이나 라이브러리를 사용할 때 import문을 사용합니다.

 

만약 import문을 사용하지 않을 경우 패키지명.클래스명 형식으로 사용 할 수도 있으나 보기도 좋지 않을 뿐더러 작성하기도 너무 불편합니다.

public class ProjectTest {
    public static void main(String[] args) {
        java.util.Scanner sc = new java.util.Scanner(System.in);
        int i = sc.nextInt();
    }
}

 

import문을 사용 함으로써 패키지명을 생략하여 사용 할 수 있게해줍니다.

import java.util.Scanner;
 
public class ProjectTest {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int i = sc.nextInt();
    }
}

 

여기서 import문에 static을 붙이면 어떤 차이가 있을까요.

큰 차이가 있지는 않지만 아래 예제를 보면서 차이를 찾아 봅니다.

import java.lang.Math.*;    //이해를 돕기 위해 사용
 
public class ProjectTest {
    public static void main(String[] args) {
        
        double math = Math.PI;
        System.out.println(math);
    }
}
import static java.lang.Math.*;
import static java.lang.System.*;
 
public class ProjectTest {
    public static void main(String[] args) {
        
        double math = PI;
        out.println(math);
    }
}

차이가 보이시나요???

클래스명 Math, System 없이 Math, System클래스 안에 정의된 멤버를 사용했습니다.

import에 static을 붙이면 import된 정적 멤버 변수나 정적 메소드를 클래스의 이름 없이도 사용할 수 있습니다.

                                               (static 변수, static 메소드만 사용 가능)

이러한 정적 멤버를 더 간편하게 사용하기 위해 JDK 1.5부터 static impot를 지원하게 되었습니다.

 

static import를 사용함으로써 마치 현재 클래스의 멤버 처럼 사용할 수 있게 편리하며 경우에 따라 코드가 길어질 때 간결하게 함으로써 좀 더 사용 의도를 알아 볼수 있습니다.

 

그러나 남용해서 사용하다 보면 혼동을 줄 수도 있기에 적절히 사용해야 합니다.

 

만약 static import한 클래스들에서 같은 이름의 멤버가 있으면 어떻게 될까요??

import static java.lang.Integer.*;
import static java.lang.Long.*;
 
public class ProjectTest {
    public static void main(String[] args) {
        
        System.out.println(MAX_VALUE);  //에러
        System.out.println(Integer.MAX_VALUE);
        System.out.println(Long.MAX_VALUE);
    }
}

이럴 경우 멤버 이름만 작성하여 사용하려고 하면 컴파일 에러가 발생합니다. 

어느 클래스의 멤버를 접근해야 할 지 애매해지게 되는 것이죠.

해당 멤버 앞에 클래스 명을 붙여 사용 할 수 있습니다.

다만 이러면 static import를 사용하는 이유가 없어지게 되니 참고하시길 바래요