Static이라는 키워드를 사용하여 Static변수와 Static메소드를 만들 수 있는데 다른말로 정적필드와 정적 메소드라고도 하며 이 둘을 합쳐 정적 멤버라고 합니다.(클래스 멤버라고도 합니다.) 정적 필드와 정적 메소드는 객체(인스턴스)에 소속된 멤버가 아니라 클래스에 고정된 멤버입니다. 그렇기에 클래스 로더가 클래스를 로딩해서 Method memory
영역에 적재할때 클래스별로 관리됩니다. 따라서 클래스의 로딩이 끝나는 즉시 바로 사용할 수 있습니다.
Static 키워드를 통해 생성된 정적멤버들은 Heap영역이 아닌 Static영역에 할당됩니다. Static 영역에 할당된 메모리는 모든 객체가 공유하여 메모리를 절약하고 하나의 멤버를 어디서든지 참조할 수 있는 장점을 가지지만 Garbage Collector의 관리 영역 밖에 존재하기에 Static영역에 있는 멤버들은 프로그램의 종료시까지 메모리가 할당된 채로 존재하게 됩니다. 그렇기에 Static을 너무 남발하게 되면 만들고자 하는 시스템 성능에 악영향을 줄 수 있습니다.
인스턴스 변수는 인스턴스가 생성될 때마다 생성되므로 인스턴스마다 각기 다른 값을 가지지만 정적 변수는 모든 인스턴스가 하나의 저장공간을 공유하기에 항상 같은 값을 가진다. static 으로 설정하면 같은 곳의 메모리 주소만을 바라보기 때문에 static 변수의 값을 공유
하게 되는 것이다.
정적 메소드는 클래스가 메모리에 올라갈 때 정적 메소드가 자동적으로 생성됩니다. 그렇기에 정적 메소드는 인스턴스를 생성하지 않아도 호출을 할 수 있습니다. 정적 메소드는 유틸리티 함수
를 만드는데 유용하게 사용됩니다.
※ 스태틱 메소드 안에서는 객체변수 접근이 불가능 하다. 하지만 static 변수의 경우에 한해서 스태틱 메소드(static method)에서 접근이 가능하다.
※ 보통 스태틱 메소드는 유틸리티성 메소드를 작성할 때 많이 사용된다. 예를 들어 "오늘의 날짜 구하기", "숫자에 콤마 추가하기" 등의 메소드를 작성할 때에는 클래스 메소드를 사용하는 것이 유리하다.
다음은 "날짜"를 구하는 Util 클래스의 예이다.
import java.text.SimpleDateFormat;
import java.util.Date;
class Util {
public static String getCurrentDate(String fmt) {
SimpleDateFormat sdf = new SimpleDateFormat(fmt);
return sdf.format(new Date());
}
}
public class Sample {
public static void main(String[] args) {
System.out.println(Util.getCurrentDate("yyyyMMdd")); // 오늘 날짜 출력
}
}
✍🏻 출처: 점프투자바
https://coding-factory.tistory.com/524
https://spongeb0b.tistory.com/100
static imoport문은 JDK1.5부터 추가된 기능이다.
static import문을 사용하면 static멤버를 호출할 때 클래스명을 생략 할 수 있다.
코드가 간결해지고 특정 클래스의 static 멤보를 자주 사용할 때 편리하다.
import static java.lang.Integer.*; // Integer 클래스의 모든 static멤버
import static java.lang.Math.random; //Math.random()만 import. 괄호는 붙이지 않는다.
import static java.lang.System.out; //이렇게 하면 System.out을 out만으로 참조가능
import static java.lang.Math.abs;
import static java.lang.Math.PI; // 정적 메소드 외의 정적 멤버 변수도 static import의 대상이 됩니다.
//static import문 선언 전
System.out.println(Math.random());
System.out.println(Math.PI);
int i = Math.abs(-3);
//static import문 선언 후
out.println(random());
out.println(PI);
int i = abs(-3);
주의해야할 점은 클래스 내에 동일한 이름의 메소드가 있으면 클래스 자신의 메소드가 우선합니다.
마치 현재 클래스의 멤버인 것처럼 사용할 수 있기 때문에 편리하지만 그만큼 혼동을 주기 쉽다.
적절한 사용처 중의 하나는 Stream 객체에 collect() 연산을 사용할 때 Collectors 클래스의 static 메소드를 간결하게 호출하기 위해 static import문을 사용하는 것이다. (Stream은 JDK1.8부터 추가되었다.)
collect()는 수집 방법을 구현한 Collector 객체를 매개변수로 하는데 Collectors 클래스에는 기본적인 static 메소드를 갖고있기 때문에 직접 구현하지 않고도 다양한 종류의 컬렉터를 사용할 수 있다. 이 때 사용할 Collectors의 멤버를 static import문으로 선언해두면 더욱 간편하게 사용할 수 있는 것이다.
✍🏻 출처: https://atoz-develop.tistory.com/entry/JAVA-static-import%EB%AC%B8
https://offbyone.tistory.com/283