Rootable의 개발일기
Java의 static 키워드 본문
❓ static 이란?
모든 인스턴스에서 공유되는 static 변수
자바에서 static 키워드는 클래스 레벨의 변수나 메서드, 블록을 정의할 때 사용된다. 이는 인스턴스 생성 없이도 접근 가능하며, 모든 인스턴스에서 공유된다. static 변수는 클래스가 로드될 때 Method 영역에 할당되기 때문에 프로그램 시작부터 종료까지 메모리에 유지된다. 이러한 특성으로 인해 모든 인스턴스가 공유하여 사용할 수 있는 변수가 필요할 때 유용하다.
🔎 static 변수
static 변수는 클래스 레벨에서 선언되며, 모든 인스턴스에 의해 공유된다. 그래서 특정 데이터를 모든 인스턴스가 공유해야 할 때 유용하다.
다음은 static 변수 사용 예시다.
public class Calculator {
public static int value; //default 0
public void add() {
value++;
}
public void subtract() {
value--;
}
}
🔎 static 메서드
정적인 값(상태를 가지지 않는 값)에 대한 연산에 유용
static 메서드는 인스턴스 생성 없이 클래스 이름을 통해 직접 호출할 수 있다. 주로 유틸리티 함수나 인스턴스의 상태에 의존하지 않는 연산을 수행할 때 유용하다. 왜냐하면 static 메서드는 클래스의 다른 static 메서드나 변수만 접근할 수 있고, 인스턴스 멤버에 접근할 수 없기 때문이다. 즉, 정적인 값만 다룬다는 것이다.
잠시 Java의 인스턴스 멤버를 살펴보자.
인스턴스 멤버는 new 연산자를 통해 객체를 생성한 후 사용할 수 있는 값으로 객체 없이는 사용할 수 없다. 인스턴스 필드는 Heap 영역에 객체마다 따로 존재하고, 인스턴스 메서드는 Method 영역에 저장되어 같은 클래스의 인스턴스끼리 공유한다. 여기서 알 수 있는 점은 인스턴스 멤버는 객체 단위로 메모리를 할당받고, 그 객체의 변수나 메서드를 공유한다.
객체에 묶여 있는 인스턴스 멤버는 상태가 있는 데이터를 다루고, 클래스에 묶여 있는 static 메서드는 상태가 없는 데이터를 다룬다.
public class MyCalculator {
public static int add(int x, int y) {
return x + y;
}
public int subtract(int x, int y) {
return x - y;
}
}
MyCalculator.add(3, 4); //static method => 클래스명으로 사용 o
MyCalculator.subtract(5, 3); //not static method => 객체 생성 후 사용해야 함
🔎 static 블록
static 블록은 클래스가 처음 로드될 때 한 번만 실행되는 코드 블록이다. 그래서 프로그램 시작 시 필요한 리소스를 준비하는 초기화 작업에 적합하다. 주로 static 변수의 초기화에 사용된다.
static class Machine {
static String type = "Init";
static {
System.out.println("Operating Test");
type = "Testing";
}
}
💥 static 키워드의 남용 주의
🚨 메모리 낭비
자바에서 static 키워드는 동일한 값을 유지하기 때문에 인스턴스처럼 복사본을 유지할 필요가 없으므로 메모리 사용을 최적화할 수 있고 속도가 빠르다. 하지만 static 변수가 남용되면 오히려 프로그램 퍼포먼스에 부정적인 영향을 줄 수 있다.
static 변수가 저장되는 곳은 Method 영역이다. 해당 영역은 명시적 NULL을 선언하지 않는 한 프로그램 종료까지 메모리에 생존한다. 그래서 프로그램 생명주기 동안 메모리에 상주하므로, 불필요한 static 사용은 프로그램 성능 저하로 이어질 수 있다.
🚨 객체지향 원칙 위반
static은 객체지향적이지 못하다.
객체지향 프로그래밍 원칙에 따르면, 한 객체가 지니고 있는 데이터들은 외부에서 함부로 접근하여 수정할 수 없도록 해야 한다. 하지만 static은 따로 객체를 생성하지 않고 클래스를 통해 직접 데이터를 불러오기 때문에 각 객체의 데이터들이 캡슐화되어야 한다는 객체지향 프로그래밍의 원칙을 위반한다.
🚨 재사용성
static 메서드는 Interface를 구현하는 데 사용될 수 없다. 따라서, 재사용성을 높여주는 객체지향적 설계에 방해될 수 있다.
References:
https://velog.io/@gudonghee2000/static-vs-%EC%8B%B1%EA%B8%80%ED%86%A4-%ED%8C%A8%ED%84%B4
https://bambookim.tistory.com/17
https://velog.io/@yyy96/static
'Java' 카테고리의 다른 글
람다식과 함수형 인터페이스 (0) | 2024.05.22 |
---|---|
상속과 합성 (0) | 2024.05.13 |
Map (2) | 2024.05.11 |
Set (0) | 2024.05.11 |
LIFO 구조와 ArrayDeque (0) | 2024.05.11 |