1. static 정의
1) static 이란?
클래스의 인스턴스를 만들지 않고도 접근할 수 있는 멤버를 정의할 때 사용하는 키워드로, static은 해당 멤버가 클래스에 속하고 있음을 나타낸다. 이는 모든 인스턴스가 해당 멤버를 공유한다는 의미이다. 다른 말로 하면, static 멤버는 클래스 레벨의 멤버로서, 클래스가 로딩될 때 메모리에 할당되어 프로그램이 종료될 때까지 유지된다.
간단히 말해, static으로 정의된 변수나 메서드는 객체 생성과 관계없이 사용할 수 있으며, 해당 클래스의 모든 인스턴스가 공유한다. 이는 클래스 내부에서 유틸리티 메서드를 만들거나, 상수를 선언할 때 유용하게 활용된다. 하지만, static 멤버는 인스턴스 멤버에 비해 메모리 사용과 관리에 있어서 조심해야 한다.
2) static 은 왜 사용할까?
- 공유 가능한 상태 제공 : static 멤버들은 클래스 수준에서 공유되며, 클래스의 모든 인스턴스들이 동일한 값을 공유한다. 이것은 객체 간에 데이터를 공유하고 상호 작용하는데 유용하다.
- 메모리 효율성 : static 멤버들은 프로그램이 실행될 때 메모리에 한 번만 할당되며, 해당 클래스의 모든 인스턴스들이 이를 공유한다. 이로써 메모리 사용량을 줄이고, 성능을 향상시킨다.
- 인스턴스화 없이 접근 가능 : static 멤버들은 클래스 이름을 통해 직접 접근할 수 있으므로, 해당 클래스를 인스턴스화하지 않고도 사용할 수 있다. 코드의 간결성과 효율성을 높여준다.
public class classA {
public static void main(String[] args) {
System.out.println(classB.numB); // 7
}
}
public class classB {
public static int numB = 7;
}
▶ classB의 numB 변수는 static으로 classA에서 classB의 객체를 생성하지 않고서도 변수에 접근이 가능
3) static 사용 시 주의점
(1) 메모리 문제
static 멤버는 프로그램이 실행될 때 클래스가 로드될 때부터 존재하며 프로그램이 종료될 때까지 유지. 해당 클래스의 작업이 끝나더라도 static 변수가 점유하고 있는 메모리는 회수되지 않는다.
(2) static 메서드 내에서는 인스턴스멤버 변수나 인스턴스 메서드 직접 사용 불가
그 이유는 첫째 정적 메서드는 클래스가 로드될 때 메모리에 할당되는데 이 때 특정 객체의 인스턴스가 존재하지 않을 수 있어 인스턴스 변수나 인스턴스 메서드를 직접 참조할 수 없다. 둘째 인스턴스 메서드는 특정 객체의 상태나 데이터에 접근하기 위해 this를 사용한다. this는 해당 메서드가 호출된 객체를 가리킨다. 하지만 정적 메서드는 특정 객체의 상태나 데이터에 의존하지 않는다. 그래서 this를 사용하여 해당 객체의 참조를 사용할 수 없다. 쉽게 말해 정적 메서드는 클래스 수준에서 관리되기 때문에 특정 객체의 상태나 데이터에 접근할 수 없다.
public class MyClass {
private int instanceVar; // 인스턴스 변수
// 생성자: 인스턴스 변수 초기화
public MyClass(int value) {
this.instanceVar = value;
}
// 인스턴스 메서드: 인스턴스 변수에 접근하여 값을 반환
public int getInstanceVar() {
return this.instanceVar;
}
// 정적(static) 메서드: 인스턴스 변수에 접근할 수 없음
public static void staticMethod() {
// 컴파일 오류: 정적 메서드에서는 인스턴스 변수에 직접 접근할 수 없음
// return this.instanceVar;
}
public static void main(String[] args) {
// MyClass 객체 생성
MyClass obj = new MyClass(10);
// 인스턴스 메서드 호출: 해당 객체의 상태에 접근하여 값을 반환
System.out.println("Instance Variable: " + obj.getInstanceVar());
// 정적 메서드 호출: 해당 객체의 상태에 접근할 수 없음
// MyClass.staticMethod();
}
}
2. static 종류
1) 정적 변수 (Static Variables)
상수나 공통으로 사용되는 값을 저장하기 위해 활용
public static void main(String[] args) {
// 정적 변수 사용
System.out.println("Static variable value: " + StaticExample.staticVariable); // Static variable value: 10
}
2) 정적 메서드 (Static Methods)
객체의 생성과는 관련이 없는 특정 기능, 공통 기능을 제공할 때 사용
class StaticExample {
// 정적 메서드
public static void staticMethod() {
System.out.println("Hello, World!"); // Hello, World!
}
}
3) 정적 블록 (Static Blocks)
클래스의 초기화 작업을 수행하기 위해 사용 (클래스가 로드될 때 단 한 번 실행)
class StaticExample {
// 정적 블록
static {
System.out.println("Class Example is being loaded."); // Class Example is being loaded.
}
}
※ 참고 문헌
https://unabated.tistory.com/1041
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!