-
[JAVA] static import에 대하여 ( +IntelliJ에서 사용하기)프로그래밍 언어/JAVA 2022. 9. 29. 19:07
📑 static이란?
자바 클래스의 static 메서드는 클래스에 대한 인스턴스의 생성 없이 메서드를 사용할 수 있다. 그럼 static은 언제 붙이는 걸까?? 아래 4가지 개념이 있다.
1. 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 붙인다.
: 생성된 각 인스턴스는 서로 독립적이기 때문에 각 인스턴스 변수(iv)는 서로 다른 값을 유지한다. 그러나 모든 인스턴스에서 같은 값이 유지되어야 하는 변수는 static을 붙여 클래스 변수로 정의해야 한다.
2. 클래스 변수(static 변수)는 인스턴스를 생성하지 않아도 사용할 수 있다.
: static이 붙은 변수(클래스 변수)는 클래스가 메모리에 올라갈 때 이미 자동적으로 생성되기 때문이다.
3. 클래스 메서드(static)는 인스턴스 변수를 사용할 수 없다.
: 인스턴스변수는 인스턴스가 반드시 존재해야만 사용할 수 있는데, 클래스메서드(static 이 붙은 메서드)는 인스턴스 생성 없이 호출 가능하므로 클래스 메서드가 호출되었을 때 인스턴스가 존재하지 않을 수 있다. 그래서 클래스 메서드에서 인스턴스변수의 사용을 금지한다.
4. 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.
: 메서드 호출시간이 짧아지므로 성능이 향상된다.
📑 static import
예를 들어 절대값을 구하는 java.lang.Math 클래스의 abs() 메서드는 아래와 같이 클래스명.메서드로 사용한다.
int i = Math.abs(-3);
JDK 1.5부터는 이런 정적(static) 메서드를 더욱 쉽게 사용하기 위해 static import를 지원한다.
import static java.lang.Math.abs;
int i = abs(-3);정적 메서드 import static을 사용해서 import한 후에 클래스명 없이 abs(); 처럼 바로 사용할 수 있다.
만약 클래스 내 모든 정적 메서드를 import 하려면 아래와 같이 사용이 가능하다.
import static java.lang.Math.*;
하지만 일반적으로 import 에 * 을 사용하는 것은 권장 되지 않다. why? 가독성이 떨어질 뿐더라 네임스페이스 오염의 문제가 발생할 수도 있기 때문이다.
😃따라서 static import는 정말 자주 사용하는 클래스, 이름만 봐도 어디에 속할 수 있는 정적 멤버를 사용하는데만 쓰도록 한다.
📑 IntelliJ static import 받기
@Test @DisplayName("VIP는 10%할인이 적용되어야 한다.") void vip_o(){ //given Member member = new Member(1L, "memberVIP", Grade.VIP); //when int discount = rateDiscountPolicy.discount(member, 20000); //then assertThat(discount).isEqualTo(2000); }
JUNIT5를 이용해 테스트 코드를 작성한 메서드이다. 만약 static import를 받지 않았더라면 아래와 같이 작성해야 되지만, 보통 Assertions는 static import를 받아 생략해서 작성한다.
Assertions.assertThat(discount).isEqualTo(2000);
윈도우 기준 alt + enter를 눌렀을 때 다음과 같이 add on-demand static import for ~~~ 이런 문구가 나타나야 되는데 나타나질 않는 것이다,,, 직접 improt 부분 수정하려고 해도 자동 import 설정해두니까 쉽지 않고,, 또 기능 껐다 키는 방법 말구 다른 좋은 방법이 있을텐데 알아보다 해답을 찾았다.!!
💚 바로 settings에 static import 검색 후 add on-demand static import 기능을 켜주면 되는 것! 덕분에 앞으로 편리하게 사용할 수 있겠다.
반응형'프로그래밍 언어 > JAVA' 카테고리의 다른 글
[JAVA ] 직렬화(Serialization)와 역직렬화(Deserialization) (0) 2022.10.11 [JAVA JUnit] assertThat의 isSameAs와 isEqaulTo 비교 분석 (1) 2022.10.01 [Java Junit] AssertJ 메서드 사용법 알아보기 (0) 2022.09.27 [ch14 람다식] 작성법 예제, 함수형 인터페이스(Functional Interface) (0) 2022.09.27 [JAVA] JVM이란? 자바 가성 머신 실행과정, 구조 알아보기 (0) 2022.09.19