JAVA 에서 static키워드를 사용한다는 것은 메모리에 한번 할당되어 프로그램이 종료될때 해제되는 것을 의미합니다.
이를 정확히 이해하기 위해 메모리 영역에 대한 이해가 필요합니다.
일반적으로 프로그래머가 만든 class는 static영역에 생성되고, new 연산을 통해 생성된 객체는 heap영역에 생성됩니다. 객체의 생성시에 할당된 heap영역의 메모리는 GC를 통해 수시로 관리를 받는 반면, staic키워드를 통해 static영역에 할당된 메모리는 GC의 관리를 받지 않습니다. 모든 객체가 공유하는 메모리라는 장점을 지니지만, static을 자주 사용하게 된다면 프로그램의 종료시까지 메모리가 할당된채로 남아있기 때문에 사용시 신중한 숙고를 해야합니다.
다음으로 제어자 static에 대해 설명하자면 다음과 같습니다.
정적(static) : '고정된', 정적 멤버는 클래스에 고정된 멤버로 객체를 생성하지 않고 사용할 수 있는 필드와 메소드를 말합니다. 정적 멤버는 객체에 속한 멤버가 아니라 클래스에 소속된 멤버이기 때문에 클래스 멤버라고도 부릅니다.
static 제어자의 대상은 멤버변수와 메서드로 나뉘어집니다.
대상 | 의미 |
멤버 변수 | - 모든 인스턴스에 공통적으로 사용되는 클래스 변수가 됩니다. - 클래스 변수는 인스턴스를 생성하지 않고도 사용가능합니다. - 클래스가 메모리에 로드될 때 바로 생성됩니다. |
메서드 | - 인스턴스를 생성하지 않고도 호출이 가능한 static 메서드가 됩니다. - static 메서드 내에서는 인스턴스 멤버들을 직접 사용할 수 없습니다. |
인스턴스 멤버를 사용하지 않는 메서드는 static을 붙여서 static메서드로 선언하는 것을 고려해보면 좋습니다. 왜냐하면 static 메서드로 하는 것이 인스턴스를 생성하지 않고도 호출이 가능해서 더 편리하고 속도도 더 빠르니 말이죠.
public class StaticStudy {
static int width = 140; // 클래스 변수(static변수)
static int height = 200; // 클래스 변수(static변수)
static{ // 클래스 초기화 블럭, 클래스가 메모리에 로드될때 단 한번만 수행된다. 주로 클래스 변수를 초기화할때 사용
// static 초기화 수행
}
static int max(int a, int b){ //클래스 메서드(static 메서드)
return a > b ? a: b;
}
}
정리하자면
1. 모든 인스턴스에 공통적으로 사용하는 것에 static키워드를 붙입니다.
2. static이 붙은 멤버변수는 인스턴스를 생성하지 않아도 사용할 수 있습니다.
3. static이 붙은 메서드에서는 인스턴스 변수를 사용할 수 없습니다. -> static메서드는 인스턴스 생성없이 호출 가능한 반면, 인스턴스 변수는 인스턴스를 생성해야만 존재할 수 있기 때문에, static메서드를 호출할 때 인스턴스가 생성되어있을 수도 있고 그렇지 않을 수도 있어서 static이 붙은 메서드에서 인스턴스 변수의 사용을 허용하지 않습니다.
4. 메서드 내에서 인스턴스 변수를 사용하지 않는다면 static 제어자를 붙이는 것을 고려합니다. -> 위에 설명한 것처럼 메서드 호출시간이 짧아지기 때문에 효율이 높아집니다.
'Language > Java' 카테고리의 다른 글
SOLID 원칙 (0) | 2021.09.03 |
---|---|
접근 제어자의 종류 (0) | 2021.08.18 |
클래스와 객체 (0) | 2021.07.24 |
인터페이스와 추상클래스 (0) | 2021.07.18 |
오버라이딩과 오버로딩 (0) | 2021.07.11 |