java에 대해 공부하고 사용해가는 과정에서 static이 왜 쓰이는지에 대한 의문을 가지고 있었으나
이에 대해 정리한 적이 없어 정리해보려한다.
🔹 static 키워드란?
자바에서 static 키워드는 클래스 레벨에서 공유되는 멤버(변수, 메서드, 블록, 내부 클래스)를 정의할 때 사용됩니다.
즉, static이 붙은 변수나 메서드는 객체를 생성하지 않고 클래스 자체에서 직접 접근 가능하며, 모든 인스턴스가 공유합니다.
🔹 static을 사용하는 이유
- 객체를 생성하지 않고 사용 가능 → 클래스 이름으로 직접 접근 가능
- 모든 객체가 공유하는 변수/메서드로 활용 가능 → 메모리 절약
- 공통적인 기능을 제공하는 메서드에서 유용함 → 유틸리티 메서드 (예: Math.random())
- 클래스 내부에서 상수 값 정의 시 사용 → static final
🔹 static을 사용하면 얻을 수 있는 장점
✅ 1. 객체를 생성하지 않고 사용 가능
- static 멤버는 클래스가 로드될 때 메모리에 할당되므로 객체를 생성하지 않아도 접근 가능합니다.
예제 (객체 없이 사용)
class MyClass {
static String staticVar = "나는 static 변수!";
}
public class Main {
public static void main(String[] args) {
System.out.println(MyClass.staticVar); // 객체 없이 접근 가능
}
}
🔹 출력 결과
나는 static 변수!
✅ 객체를 만들지 않고도 MyClass.staticVar로 직접 접근할 수 있습니다.
✅ 2. 모든 객체가 공유 (메모리 절약)
- static 변수는 모든 인스턴스가 공유하기 때문에, 메모리 낭비를 줄일 수 있습니다.
예제 (객체끼리 공유됨)
class Counter {
static int count = 0; // 모든 객체가 공유하는 변수
Counter() {
count++; // 객체가 생성될 때마다 증가
}
void showCount() {
System.out.println("현재 count: " + count);
}
}
public class Main {
public static void main(String[] args) {
Counter c1 = new Counter();
Counter c2 = new Counter();
Counter c3 = new Counter();
c1.showCount(); // 출력: 현재 count: 3
c2.showCount(); // 출력: 현재 count: 3
c3.showCount(); // 출력: 현재 count: 3
}
}
🔹 출력 결과
현재 count: 3 현재 count: 3 현재 count: 3
✅ static 변수는 모든 인스턴스가 공유하므로, c1, c2, c3가 각자 다른 객체라도 count 값이 유지됩니다.
✅ static이 없었다면, count 값은 각 객체에서 1로 초기화되었을 것입니다.
✅ 3. 공통적인 기능을 제공하는 메서드에서 유용 (유틸리티 메서드)
- static 메서드는 객체 없이 호출 가능하기 때문에, **유틸리티 메서드(Helper Method)**를 만들 때 유용합니다.
예제 (Math 클래스의 static 메서드)
public class Main {
public static void main(String[] args) {
double randomValue = Math.random(); // Math 객체 생성 없이 사용 가능
System.out.println("랜덤 값: " + randomValue);
}
}
✅ Math.random()은 static 메서드이기 때문에 객체 없이 바로 사용 가능합니다.
✅ 4. 상수를 정의할 때 사용 (static final)
- 클래스에서 변하지 않는 공유할 상수를 정의할 때 static final을 사용합니다.
예제 (상수 정의)
class Constants {
static final double PI = 3.14159;
static final String APP_NAME = "My Application";
}
public class Main {
public static void main(String[] args) {
System.out.println("원주율: " + Constants.PI);
System.out.println("앱 이름: " + Constants.APP_NAME);
}
}
🔹 출력 결과
makefile
복사편집
원주율: 3.14159 앱 이름: My Application
✅ static final을 사용하면 모든 인스턴스가 같은 상수를 공유하면서, 변경할 수 없도록 설정할 수 있습니다.
🔹 static 키워드를 사용할 수 있는 대상
사용 대상설명
static 변수 | 모든 객체가 공유하는 변수 |
static 메서드 | 객체 없이 호출할 수 있는 메서드 |
static 블록 | 클래스가 로드될 때 한 번 실행되는 블록 |
static 내부 클래스 | 클래스 내부에 선언된 정적 클래스 |
🔹 static 사용 시 주의점
- static 메서드에서는 this를 사용할 수 없다.
- static 메서드는 인스턴스가 아니라 클래스 자체에 속해 있기 때문입니다.
java복사편집class Example { int num = 10; static void staticMethod() { System.out.println(this.num); // ❌ 오류 발생 (static에서 this 사용 불가) } } - static 메서드에서는 non-static 변수에 접근할 수 없다.
- static은 인스턴스 없이 존재하기 때문에, 객체의 인스턴스 변수에 접근할 수 없습니다.
java복사편집class Example { int num = 10; static void staticMethod() { System.out.println(num); // ❌ 오류 발생 (인스턴스 변수 접근 불가) } } -
java복사편집class Example { int num = 10; static void staticMethod() { Example obj = new Example(); System.out.println(obj.num); // ✅ 객체 생성 후 접근 가능 } }
🔹 static vs instance 차이 비교
비교 항목static (정적)instance (인스턴스)
메모리 영역 | 메서드 영역(Method Area) | 힙 영역(Heap Area) |
사용 방식 | 클래스명으로 직접 호출 | 객체를 생성해야 호출 가능 |
객체와의 관계 | 객체와 무관하게 존재 | 객체를 생성해야 존재 |
공유 여부 | 모든 객체가 공유 | 객체별로 따로 존재 |
this 사용 | ❌ 사용 불가 | ✅ 사용 가능 |
'JAVA > JAVA 개인 공부' 카테고리의 다른 글
Java의 Future, 그리고 CompletableFuture이 무엇인지, 왜쓰는지 (1) | 2025.06.26 |
---|---|
interface 메서드의 람다형 구현 및 interface내 메서드의 종류 (0) | 2025.02.23 |