import문, static import문
import문
- import문을 사용하는 이유는, 클래스를 사용할 때 패키지이름을 생략할 수 있다.
- 컴파일러에게 클래스가 속한 패키지를 알려준다.
원래는, Data클래스를 다루려면 java.util패키지 이름을 써줘야 한다.
그러나, Import문을 이용하면 패키지 이름을 생략할 수 있다.
Import문을 넣어주었다.
Date클래스가 java.util 패키지에서 가져온 것이라는 것을 알려주는 것이다.
import를 사용하면 패키지이름인 java.util 를 생략할 수 있다.
import문의 역할은, 컴파일러에게 클래스가 어디 패키지에 속한 것인지를 알려준다.
같은 이름의 클래스가 여러 패키지에 있을 수 있고, 이 클래스가 어느 패키지에 있는지 전부 찾아봐야 해서
그러한 비효율성을 방지하고자, 원래는 패키지이름을 클래스 앞에 붙여주는 것인데,
import문을 써주면, 컴파일러가 Date클래스를 만났을 때,
"아! 이 Date 클래스는 java.util 패키지에 있구나" 라는 것을 알 수가 있다.
아무래도 import를 사용하는편이 훨씬 편하다.
그런데 왜 지금까지 String클래스같은 경우에는 왜 패키지 이름을 안붙였을까?
- java.lang패키지의 클래스는 import하지 않고도 사용할 수 있다.
java.lang 패키지는 자바언어의 가장 기본 패키지이다.
핵심 클래스들을 java.lang패키지에 넣어 놓았기 때문에 여기 안에 있는 클래스들은 import 하지 않고도 사용할 수 있다.
ex) String, object, System, Thread 등...
원래는 이렇게 import문이 있어야 하는데,
String이나 System클래스는 자바의 가장 기본패키지인 java.lang패키지에 있기 때문에 import가 생략가능하다.
import문의 선언
- import문을 선언하는 방법은 다음과 같다.
패키지 이름과 클래스명을 적거나, 패키지명과 *을 적으면 된다.
*은 해당 패키지에 속한 모든 클래스를 의미한다.
- import문은 패키지문과 클래스선언의 사이에 선언한다.
이렇게 패키지 선언을 먼저하고, import문, 클래스 정의 순으로 작성해야 한다.
- import문은 컴파일 시에 처리되므로 프로그램의 성능에 영향없음.
이렇게 import문을 3문장 쓰는 것과, 오른쪽 문장은 동일한 기능을 한다.
*은 java.util패키지의 모든 클래스를 의미한다.
그래서 import문 여러개 쓸 필요없이 이렇게 한줄로 써도 된다.
근데, 이것을 *찍으면 프로그램의 성능이 떨어지지 않을까 걱정할 수도 있겠지만,
import문은 컴파일러를 위한 문장이다.
따라서 컴파일 시에 처리되므로 프로그램의 성능에 영향은 없다. (컴파일러시에는 시간이 좀더 걸릴 수 도 있으나 차이가 거의 없다.)
왼쪽처럼 쓰면, 실제로 사용하는 클래스만 적기 때문에 정확히 프로그램에서 어떤 클래스를 사용하는지 알 수 있다는 장점이 있고,
오른쪽 처럼 쓰면 어떤 클래스를 사용하는지 알 수 없다는 단점이 있다.
편한 쪽을 선택해서 사용하면 된다.
보통, 프로그램을 개발할 때는 오른쪽 처럼 쓰고,
라이브러리 같은 api를 개발하는 사람들은 왼쪽처럼 작성하는 경우가 많다.
- 다음의 두 코드는 서로 의미가 다르다.
"java.util패키지와 java.text패키지를 둘다 import하고 싶어서 두개대신에 *을 이용해서 Import java.*;이렇게 쓰면 되지않겠냐?"
라고 질문을 할 수 도 있는데, 이렇게 해선 안된다.
*은 "모든 클래스"를 의미한다.
즉, import java.*;의 의미는 java패키지의 모든 클래스를 의미한다. (패키지는 포함안됨)
- 이름이 같은 클래스가 속한 두 패키지를 import할 때는 클래스 앞에 패키지명을 붙여줘야 한다.
가끔, 클래스 이름은 동일한데, 패키지가 다른 경우가 있다.
그런 경우에 *을 찍으면, Data클래스가 sql패키지에 있는건지, util패키지에 있는건지 알 수가 없다.
그래서 그럴 때는 클래스 앞에 패키지 이름을 직접 적어줘야 한다.
static import문
- static멤버를 사용할 때 클래스 이름을 생략할 수 있게 해준다.
이렇게 import sattic문을 써주면,
원래는 Math.random()인데,
Math.ramdom()을 static import문으로 import static java.lang.Math.random; 으로 써주면,
Math를 생략할 수 있다.
System.out도 static import로 등록해 놓으면, System을 생략하고 out만 쓸 수 있다.
System.out의 out은 static변수이다. 15장에서 자세히 다룰 것이다.
첫번째 문장을 보면, Integer클래스에 있는 모든 static멤버(static변수, static 메서드) 를 사용할 때, 앞에 Integer클래스 이름을 붙여야 하는데, 생략할 수 있게 해준다.
예제를 보면,
System.out을 static import문으로 등록을 해놓았고,
마찬가지로 static import문으로 Math클래스의 모든 static멤버를 클래스 이름 없이 사용할 수 있게 해놓았다.
원래는 System.out.println(Math.random());이렇게 작성해야 하는데 System과 Mathㄹㄹ 생략하고 작성할 수 있다.
PI도 Math클래스에 있는 static상수인데, 클래스이름을 생략하고 PI로 사용할 수 있다.
static import를 쓰는 이유는, 나중에 가면 갈수록 코드가 길어지면, 클래스 이름도 거추장스럽다.
클래스이름이 없으면 어떤 클래스의 static멤버를 쓰는건지 불편한 점도 있긴 하지만,
특히 14장 가면 이해하겠지만, 클래스이름을 붙히면 코드가 너무 길어진다.
그래서 코드를 짧게 할 수 있게 하려고 static import문이 추가되었다.
그래도 클래스 이름이 있으며 명확히 알아보기 좋으니, 왠만하면 static import문을 쓰지 말고, 꼭 필요할 때 사용하자.
'JAVA' 카테고리의 다른 글
접근 제어자 (0) | 2022.04.01 |
---|---|
제어자, static, final, abstract (0) | 2022.04.01 |
패키지, 클래스 패스 (0) | 2022.03.31 |
참조변수 super, 생성자 super() (0) | 2022.03.31 |
오버라이딩 (overriding) (0) | 2022.03.30 |
댓글
이 글 공유하기
다른 글
-
접근 제어자
접근 제어자
2022.04.01 -
제어자, static, final, abstract
제어자, static, final, abstract
2022.04.01 -
패키지, 클래스 패스
패키지, 클래스 패스
2022.03.31 -
참조변수 super, 생성자 super()
참조변수 super, 생성자 super()
2022.03.31