[Java] Static
Static이란?
Java에서 Static이란 키워드는 메모리에 한번 할당되어 프로그램이 종료될 때 해제되는 것을 의미한다.
프로그램이 실행되기 위해서는 프로그램이 메모리에 load 되어야한다. 또한 프로그램에서 사용되는 변수들을 저장할 메모리도 필요하다.
Static에 대해서 알아보기전에 컴퓨터 운영체제가 프로그램의 실행을 위해 제공하는 다양한 메모리 공간 구조에 대해서 먼저 살펴볼 것 이다.
Java의 메모리 영역
자바 프로그램을 실행 하게되면 JVM(Java Virtual Machine)은 OS 로 부터 메모리를 할당 받는다, 할당 받은 메모리를 자바 프로그램에 맞게 여러개의 영역으로 나누어 사용하게 된다.
각 영역은 목적에 맞게 사용되고, 어플리케이션의 성능에 영향을 미친다. 같은 기능을 하는 어플리케이션 일지라도, 메모리 관리에 따라 성능에 차이가 생긴다는 이야기다. 메모리를 관리하지 않고 구성하게 된다면 StackOverFlow 가 발생하여 어플리케이션이 종료될수도 있다는 말이다, 혹은 어플리케이션의 속도가 크게 저하 될수도 있다.
JVM의 메모리는 크게 3가지로 이루어져 있다.
- Heap 영역.
- Stack 영역.
- Static(Method) 영역.
[ Static의 메모리 ]
일반적으로 우리가 만든 Class는 Static 영역에 생성되고, new 연산을 통해 생성한 객체는 Heap영역에 생성됩니다. 객체의 생성시에 할당된 Heap영역의 메모리는 Garbage Collector를 통해 수시로 관리를 받습니다. 하지만 Static 키워드를 통해 Static 영역에 할당된 메모리는 모든 객체가 공유하는 메모리라는 장점을 지니지만, Garbage Collector의 관리 영역 밖에 존재하므로 Static을 자주 사용하면 프로그램의 종료시까지 메모리가 할당된 채로 존재하므로 자주 사용하게 되면 시스템의 퍼포먼스에 악영향을 주게 됩니다.
Static 변수
클래스를 만들고 객체를 생성하면 객체마다 객체 변수를 저장하기 위한 메모리가 별도로 할당된다.
하지만, 클래스내의 변수 값은 어떤 객체이든지 동일한 값이어야 할 때 static을 사용해 메모리 낭비를 줄일 수 있다.
static 키워드를 붙이면 자바는 메모리 할당을 딱 한 번만 하게 되어 메모리를 적게 사용할 수 있다.
만약 클래스 내의 변수값이 변경되지 않기를 바란다면 static 키워드 앞에 final 이라는 키워드를 붙이면 된다.
final 키워드는 한 번 설정되면 그 값을 변경할 수 없다. 만약 변경하려고 하면 오류가 발생한다.
static을 사용하는 또 다른 이유는 값을 공유할 수 있기 때문이다. static으로 설정하면 같은 메모리 주소만을 바라보기 때문에
static 변수의 값을 공유하게 되는 것이다.
[ Static 변수 특징 ]
- Static 변수는 클래스 변수이다.
- 객체를 생성하지 않고도 Static 자원에 접근이 가능하다..
Static 변수와 static 메소드는 static 메모리 영역에 존재하므로 객체가 생성되기 전에 이미 할당되어 있다. 따라서 객체 생성 없이도
바로 접근할 수 있다.
일반적으로 상수들만 모아서 사용하며 상수의 변수명은 대문자와 _를 조합하여 이름짓는다. 또한 상속을 방지하기 위해 final class로 선언을 한다.
Static 메서드
class Counter {
static int count = 0;
Counter() {
count++;
System.out.println(count);
}
public static int getCount() {
return count;
}
}
public class Sample {
public static void main(String[] args) {
Counter c1 = new Counter();
Counter c2 = new Counter();
System.out.println(Counter.getCount()); // 스태틱 메서드는 클래스를 이용하여 호출
}
}
메서드 앞에 static 키워드를 붙이면 Counter.getCount()와 같이 객체 생성 없이도 클래스를 통해 메서드를 직접 호출할 수 있다
스태틱 메서드 안에서는 객체 변수 접근이 불가능하다. 이 예에서는 count 변수가 static 변수이기 때문에 스태틱 메서드에서 접근이 가능하다.
특히 스태틱 메서드는 유틸리티성 메서드를 작성할 때 많이 사용된다. 예를 들어 ‘오늘의 날짜 구하기’, ‘숫자에 콤마 추가하기’ 등의 메서드를 작성할 때 스태틱 메서드를 사용하는 것이 유리하다.
유틸리티성 메서드는 특정 클래스나 인스턴스에 종속되지 않고, 재사용이 가능하고 범용 기능을 제공하는 스태틱 메서드를 말한다. 이 메서드들은 코드의 중복을 줄이고 가독성을 향상시킨다
출처: https://wikidocs.net/228 [점프 투 자바]
출처: https://mangkyu.tistory.com/47 [MangKyu's Diary:티스토리]