Static이란?
public static void main(String[] args){ ... }
java로 개발하다보면 자주 듣고 보고하는 static 개념정리
Static이란?
static은 '정적인, 고정된' 이라는 뜻을 가지고 있다.
static이 앞에 붙는 변수나 메소드는 어떤 객체에 소속되는 것이 아닌 클래스에 고정되어 있는 변수나 메소드이다.
static int num = 0; // static 변수
public static void staticMethod() { ... } // static 메소드
Static은 아래와 같은 특징을 갖는다.
- 메모리에 고정적으로 할당된다.
- Static영역에 할당되며 프로그램 종료시까지 메모리가 할당된 채로 존재한다.
- Static메소드 내에서는 인스턴스 변수를 사용할 수 없다.
각 내용을 자세히 살펴보자.
1. 메모리에 고정적으로 할당된다.
static은 메모리에 고정적으로 할당되어 전역적으로 쉽게 재사용하는 멤버나 잘 변하지 않는 변수나 메소드를 사용할 때 주로 사용된다. 만들어 놓고 객체 생성을 할 필요 없이 바로 사용할 수 있기 때문에 사용성이 좋다.
2. static영역에 할당되며 프로그램 종료시 까지 메모리가 할당된 채로 존재한다.
Static으로 생성된 정적멤버는 Heap영역이 아닌 Static영역에 할당된다. Static영역에 할당된 메모리는 모든 객체가 공유하여 하나의 멤버를 어디서든 참조할 수 있는 장점이 있지만 GC(Garbage Collector)의 관리 영역 밖에 존재하기 때문에 Static영역에 있는 멤버들은 프로그램 종료시까지 메모리가 할당된 채로 존재한다.
따라서 과도하게 많은 static을 선언할 경우 메모리에 과부하가 올 수 있으며 프로그램이 시작될 때 static 영역의 메모리 크기를 넘어서는 양의 메소드들이 존재한다면 시작과 동시에 에러가 날 수도 있다. 그렇기 때문에 무분별하게 static을 남발하는 일은 없도록 해야한다.
3. static메소드 내에서는 인스턴스 변수를 사용할 수 없다.
static메소드는 프로그램 실행과 동시에 메모리에 올라가기 때문에 인스턴스 변수는 사용할 수 없다. 인스턴스 변수는 객체를 생성해야만 사용가능하기 때문에 객체를 생성하기 전에 먼저 메모리에 올라가는 static 메소드에서는 사용할 수 없는 것이다.
Static은 언제 사용할까
상수 정의
절대 변하지 않는 변수를 상수라고 하는데, 상수는 객체 내에서 매번 일반 변수로 정의하기 보다 한 번 정적 변수로 정의하면 메모리를 아낄 수 있게 된다.
private static final String NAME = "무니";
유틸리티 클래스 정의
유틸리티 클래스는 인스턴스 메소드와 인스턴스 변수를 제공하지 않고, 데이터 처리를 위한 정적 메소드만 존재하는 클래스를 말한다. java에서 Math 클래스를 보면, 상수 외에 인스턴스 변수가 하나도 없고 계산을 위한 정적 메소드만 제공한다.
class MyUtil {
static int plus(int a, int b) {
return a + b;
}
}
public class staticExsample {
public static void main(String[] args) {
MyUtil.plus(1,2);
}
}
Static을 지양해야 하는 이유
위에서 몇가지 위험요소에 대해서 설명했지만 Static을 지양해야하는 이유 몇가지에 대해서 알아보자
- 메모리문제
- 동시성 이슈
- static은 전역에서 접근 가능하기 때문에 별도의 동기화 전략을 수립해야한다.
- 런타임 다형성 불가
- static으로만 이루어진 메소드를 사용하는 객체의 경우 해당 객체를 메모리에 할당해 사용하는 것이 아니고 메소드로 바로 접근해서 호출하기 때문에 다형성 측면에서 부적합하다.
'Programming > Java' 카테고리의 다른 글
[Java] 레코드(Record) - 개념, 특징, 예제 (2) | 2023.12.26 |
---|---|
[Java] String to Date - ParseException 해결 방법 (0) | 2023.06.14 |
[Java] 스트림(Stream) 사용 시 주의사항 (재사용, 지역변수 접근, 무한 스트림) (0) | 2023.03.13 |
[Java] 약수의 개수 구하는 최적의 방법(알고리즘) (0) | 2022.11.20 |
[Java] Map이란? (개념, 활용, 예제 등) (0) | 2022.10.02 |