Java

static import

지금 느낌 그대로 2020. 12. 26. 03:22

static import 사용하는 이유

 

일반적으로 다른 클래스의 static 멤버에 접근하기 위해서는 이 멤버가 어디에서 왔는지 레퍼런스를 명시해야한다. 

다음 예시를 보자.

 

double a = Math.cos(Math.PI * theta)

 

위의 코드에서 cos과 pi는 Math 클래스로부터 왔음을 나타내고 있다. 

 

여기서 문제는 Math가 반복적으로 등장한다는 점이다. 수식이 짧을 때는 큰 상관이 없겠지만, 수식이 길어지고 Math가 자주 등장한다면 가독성과 생산성이 많이 떨어질 수 밖에 없다.

 

이 반복적으로 등장하는 Math를 줄이려면 다음과 같은 방법들이 있다.

 

  • 인터페이스를 생성해 정적 멤버(여기선 cos과PI)를 인터페이스에 기술하고 이 인터페이스를 상속받는다.

→ 이것은 좋은 방법이 아니다. 이 방법을 Constant interface Antipattern 이라고 부른다. 이렇게 하면 프로그램에 변경이 생겨 정적 멤버(상수 변수)가 불필요해져도 호환성때문에 인터페이스에 영원히 남아있어야 한다. 이외에도 Constant interface Antipattern의 문제는 더 있지만 이번 주제에서는 다루지 않겠다

 

  • static import

→ 클래스를 생성하고, 해당 클래스의 생성자를 private으로 선언한 다음, 해당 멤버를 정적 멤버로 선언하고 static import를 통해서 불러온다. 위의 예시에서 사용되는 Math 클래스는 이미 Java에서 기본적으로 제공하는 클래스이므로 새 클래스를 만들어줄 필요는 없다. static import를 통해서 불러오기만 하면 같은 결과를 얻을 수 있다. 일반적인 import와 사용법은 비슷하지만, 일반적인 import가 클래스를 패키지로부터 불러오는 방식인데 비해, static import는 클래스로부터 정적 멤버를 불러온다는 차이점이 있다.

 

 

static import 언제 사용?

아주 적게! 사용해야 한다. Constant interface Antipattern 의 경우 혹은 상수를 지역 복사하고 싶을때 사용한다.

쉽게 말해, 하나 혹은 두개의 클래스에서 정적 멤버에 빈번하게 접근할 때 이용한다. 위의 예시의 경우에는 수식이 길어져 Math가 너무 빈번하게 등장해 코드의 가독성을 떨어뜨리고 유지보수를 어렵게 하게 된다면 활용해 볼 수도 있다. 

 

static import를 남용하게되면 코드를 보는 다른 사람들은 정적 멤버들이 어디서 왔는지 알기 어렵고, 유지보수를 힘들게 한다. namespace가 더러워 질 것이다. 그래서 클래스로부터 정적 멤버 전체를 임포트 하는 것은 추천되지 않고, 하나 혹은 2개의 멤버를 이용하고자 하면 각각 임포트 해주는 것이 권장된다.

 

 

 

References

uncle-bae.blogspot.com/2016/06/java-static-import-import.html

 

Uncle Bae's Story: [Java] Static Import 즉, 정적 import를 왜 하는가?

xxxxx

uncle-bae.blogspot.com