static에 대하여
java에서 static 키워드는 메모리에 할당되어 application이 종료가 되었을 때 지워진다.
아래는 메모리 영역이다.
해당 메모리 영역을 보면 static영역이 있고 힙 영역이 있다.
static영역은 사용자가 만든 Class가 들어가고, 힙 영역은 new 연산을 통해 생성한 객체가 들어간다.
(힙 영역은 GC(Garbage Collector)가 수시로 관리 한다. 하지만 static영역은 관리하지 않는다.)
static영역을 자주 사용하면 GC가 관리 하지 않기에 과부하를 일으킬 수 있다.
static 함수
static 메소드는 new연산이나 객체 생성 없이 호출이 가능하다. 해서 많은 사용자들이 많이 호출되는 유틸 관련한 메서드에 static을 부여한다.
public static int max(Integer... i) {
return Arrays.stream(i).mapToInt(x -> x).max().orElseThrow(NoSuchElementException::new);
}
해당은 여러개의 int 값 중 max 값을 구하는 유틸 메서드이다. 해당 메서드 같은? 여러 번 사용할 거 같은 메서드에 static를 부여을 많이 한다.
static 메소드에는 static으로 선언하지 않는 메서드나 변수를 사용하지 못한다.
메모리 영역을 생각 해보면 간단하다 static 영역에는 application이 시작 될 때 static선언한 것들이 static영역에 할당된다. 하지만 static 선언하지 않는 것은 메모리에 할당되어 있지 않기 때문에 사용하지 못한다
예를 들어 new연산으로 객체를 생성 하는것들은 new 연산을 했을 때만 들어가기에 static영역에서 해당 객체를 메모리 영역에서 찾지 못해 오류가 난다.
그래서 static메소드에서 접근하기 위한 변수나 함수는 static으로 선언되어야 한다.
(Java에서 제공 하는 static 메서드로는 대표적인 Math 메서드가 있다 등등...)
static 변수
static 변수는 클래스 변수이다. 해서 static 변수는 객체를 생성하지 않고도 접근이 가능하다.
static 변수 static함수와 마찬가지로 application이 끝날 때 까지 메모리에 고정되어 할당된다.
public class CommonUtil {
public static final String DEV_NAME = "itjava";
}
public class mainClass }
public void test() {
System.out.println(CommonUtil.DEV_NAME);
}
}
어떠한 코드에 개발자 이름에 대해 적어야 한다. 개발자가 나고 고정되는 값이라면 해당 예처럼 static 변수로 할당해
사용할 수 있다.
만약 static 변수를 사용하지 않고 만든다면
public void test() {
String devName = "itjava";
System.out.println(devName);
}
위처럼 작성해야 할 것이다. 이렇게 되면 test라는 메서드가 호출될 때마다 devName가 메모리가 할당이 되는데 그러면 메모리 적으로 비효율이라서 해당 값이 고정되어 있고, 자주 호출하는 값이면 static 변수로 따로 빼서 관리하는 것이
메모리적으로 효율이 좋다.
관련 글 |
저의 글을 읽어 주셔서 감사합니다. 오늘도 즐거운 하루 보내세요.
저의 글이 조금이나마 도움이 되셨다면 로그인이 필요 없는 공감♥ 한번 꾸욱 눌러주세요 하하~