`static`은 클래스 레벨에서 관리되는 요소를 정의할때 사용된다.
`static`의 특징
1. 클래스와 연관됨
- `static` 으로 선언된 요소는 클래스 로드 시 메모리에 올라가며 해당 클래스의 모든 객체가 공유한다.
- 객체에 종속되지 않고 클래스 자체에 종속된다.
2. 객체 생성 없이 사용 가능
- `static` 멤버는 클래스 이름을 통해 직접 호출할 수 있다.
- 예 : `ClassName.staticMember`
3. 메모리 공유
- `static` 변수는 한번만 메모리에 할당되며 모든 객체가 이를 공유한다.
- 인스턴스 변수와 달리 개별 객체마다 복사본이 생성되지 않는다.
`static`의 주요 사용처
1. `static` 변수
- 클래스 전체에서 공유되는 변수
- 프로그램에서 일정한 값을 유지하거나 모든객체가 공통으로 사용하는 데이터를 저장할때 유용
public void Example {
static int count = 0; // 모든 객체가 공유
int instanceVar = 0; // 각 객체마다 고유
}
2. `static` 메서드
- 객체 없이 호출 가능한 메서드
- 인스턴스 변수나 메서드에 접근할 수 없으며 클래스변수(`static` 변수)만 다룰수 있다
public class Example {
static void printMessage() {
System.out.println("Hello, static method!");
}
}
public class Main {
public static void main(String[] args) {
Example.printMessage(); // 객체없이 호출 가능
}
}
3. `static` 블럭
- 클래스가 메모리에 로드될때 한번 실행된다
- 주로 초기화 작업을 수행하거나 복잡한 정적 데이터를 설정할때 사용
public class Example {
static int count;
static {
count = 10; // static 블럭을 통한 초기화
System.out.println("Static block executed!");
}
}
4. `static` 중첩 클래스 (Nested Class)
- 클래스 내부에 선언된 클래스에 `static` 을 붙이면 외부 클래스의 객체 생성 없이 사용 가능
public class Outer {
static class Inner {
static void display() {
System.out.println("Static nested class");
}
}
}
public class Main {
public static void main(String[] args) {
Outer.Inner.display(); // 객체 생성 없이 접근
}
}
`static` 의 동작 방식
- 클래스가 처음 로드될때 `static` 멤버가 메모리(메서드 영역)에 할당 된다.
- 프로그램 종료시 까지 유지되며 한번만 초기화 된다.
주의 사항
1. `static` 메서드는 비정적 멤버에 접근할 수 없다.
- `static` 메서드는 클래스 로드시 메모리에 올라가므로 객체가 생성되기 전에 호출될 수 있다.
- 객체에 종속적인 인스턴스 변수나 메서드에 접근할 수 없다.
public class Example {
int instanceVar = 5;
static void display() {
// System.out.println(instanceVar); // 컴파일 에러!
}
}
2. 메모리 관리 주의
- `static` 변수는 모든 객체가 공유하므로 불필요하게 사용하면 메모리 누수로 이어질 수 있다
3. 객체지향 설계의 제한
- `static` 을 남용하면 객체 지향의 특징인 캡슐화와 다형성을 해칠 수 있다
`static` 활용 예제
public class Counter {
static int count = 0; // 모든 객체가 공유하는 변수
Counter() {
count++; // 객체가 생성될때 마다 증가
}
static void displayCount() {
System.out.println("Count: " + count);
}
public static void main(String[] args) {
Counter c1 = new Counter();
Counter c2 = new Counter();
Counter.displayCount(); // Count: 2
}
}
요약
- `static` 변수 : 클래스 전체에서 공유되는 변수
- `static` 메서드 : 객체없이 호출 가능한 메서드
- `static` 블럭 : 클래스 로드시 한번 실행되는 초기화 블럭
- `static` 중첩 클래스 : 외부 클래스 객체 없이 사용할 수 있는 클래스
`static`은 메모리 효율성을 높이고 클래스 수준에서 공유데이터를 다룰때 유용하다. 그러나 남용하면 객체지향을 해칠수 있으므로 주의해야 한다
출처 : ChatGPT
'BE > Java' 카테고리의 다른 글
[Java] 캐스팅 (형 변환) (0) | 2024.12.01 |
---|---|
[Java] abstract와 interface (0) | 2024.11.30 |
[Java] 접근 제어자 (0) | 2024.11.30 |
[Java] 메모리 계산 (1) | 2024.11.30 |
[Java] 변수 (0) | 2024.11.30 |