레이블이 static import인 게시물을 표시합니다. 모든 게시물 표시
레이블이 static import인 게시물을 표시합니다. 모든 게시물 표시

[Java] Static Import 즉, 정적 import를 왜 하는가?

[Java] Static Import 즉, 정적 import를 왜 하는가?

Static Import

from : http://docs.oracle.com/javase/1.5.0/docs/guide/language/static-import.html

static 멤버에 접근하기 위해서 우리는 Qualify 하게 레퍼런스를 참조해야한다. 이 멤버가 어디에서 왔는지 지정하기 위해서 필요하다.
예를 들면 다음과 같다.
double r = Math.cos(Math.PI * theta);
이를 위해서 사람들은 정적 멤버를 인터페이스에 기술하고, 이 인터페이스를 상속 받는다. 그러나 이것은 좋은 방법이 아니다. 사실 이런 나쁜 방법들에는 그것을 위한 이름이 있다. Constant Interface Antipattern( Effective Java Item 17참조). 이 문제가 되는 것은 다른 클래스의 정적 멤버를 사용하는 클래스는 상세 구현의 일부라는 것이다. 클래스가 인터페이스를 구현할때 이것은 클래스의 public API의 부분이 된다. 구현의 상세는 공개 API에 노출 되어서는 안된다.

static import 생성자는 정적 멤버에 대해서 qualified 하지 않아도 되며, 정적 멤버를 포함하고 있는 타입으로 부터 상속을 받지 않아도 된다. 대신에 프로그램은 멤버를 임포트 할 수 있다.

import static java.lang.Math.PI;
혹은
import static java.lang.Math.*;
를 이용할 수 있다.
그리고 정적 임포트를 통해서 정적 멤버에는 다음과 같이 qualification을 사용하지 않고 이용가능하다.
double r = cos(PI * theta);
정적 import 선언은 일반적인 import와 유사하다.
normal import 선언은 클래스를 package로 부터 임포트한다. 이는 패키지의  qualification없이 사용가능하도록 해준다.

정적 import선언은 클래스로 부터 정적 멤버를 임포트 한다. 이는 클래스의 qualification없이 사용 가능하도록 해준다.

언제 static import를 이용할까? 매우 드물게 (Very sparingly!). 오직 상수의 로컬 복사를 시도하는 경우 혹은 상속을 통해서 어뷰징 하고 있을때 (the Constant Interface Antipattern) 사용한다. 다른  말로 하나 혹은 두개의 클래스에서 정적 멤버를 빈번하게 접근해야할때 이용한다. 만약 static import 기능을 남용하면 코드를 매우 읽기 어렵게 하고, 유지보수 하기 어렵게 한다. namespace를 오염 시켜버리게 된다.
코드를 읽는 독자들은 정적 멤버들이 어디서 왔는지 알지 못하게 될 것이다. 클래스로 부터 정적 멤버 전체를 임포트 하는 것은 읽기를 어렵게 할 수 있다. 만약 하나 혹은 2개의 멤버를 이용하고자 한다면 그것들을 각각 이용하기 바란다.

적절하게만 사용한다면 static import는 당신을 코드를 더 읽기 쉽게 할 수 있으며, 클래스 이름을 중복으로 쓰는 boilerplate한 코드를 제거할 수 있다.

















[IntelliJ] IntelliJ에서 정적 Import 설정하기.

InttlliJ 정적 Import 설정 


테스트 코드를 작성하다보면 정적 import처리에서 애를 먹는다.
주로 등록해서 사용하는 패키지를 나열해본다.

org.hamcrest.Matchers
org.hamcrest.CoreMatchers
org.junit
org.junit.Assert
org.junit.Assume
org.junit.matchers.JUnitMatchers
IntelliJ에서는 어떻게 설정하는지 찾아보자.
참고로 Eclipse에서는 링크 참조.

설정방법 : 

Cmd + , 혹은 상단 메뉴인 IntelliJ IDEA > Preference 를 클릭한다.

검색창에서 "Code Style" 로 검색한다.
그러면 Editor > Code Style 가 검색이 된다. (직접 찾아가도 된다.)

Java를 클릭하고. Package to Use Import with '*' 부분에서 '+' 버튼을 클릭한다.

상기 나열된 패키지를 하나씩 등록한다.
(이때 Static 체크 박스를 체크하면 정적 import가 된다.)

이제 소스에서 자동완성을 클릭하면 원하는 정적 import가 자동으로 삽입된다.


끝 ~




[Java] Eclipse static import 등록하기

Hamcrest나 Assert 등은 자동으로 ctrl + space를 해도 import되지 않는다.
이때 설정을 통해 한번에 필요한 패키지를 등록해두고 사용하면 편리하다.

1. Eclipse 등록하기

Preferences > Java > Editor > Content Assist > Favorites

다음과 같은 내용을 등록한다.
org.hamcrest.Matchers.*
org.hamcrest.CoreMatchers.*
org.junit.*
org.junit.Assert.*
org.junit.Assume.*
org.junit.matchers.JUnitMatchers.*


참고로 등록할때에는 마지막 클래스 까지만 등록한다. 



2. 사용하기 
등록후 assertThat에 커서를 옮기고 ctrl + space를 클릭하면 자동으로 임포트 된다.