이론/Java
Java static
공부하려구요
2025. 7. 6. 14:23
728x90
반응형
1. static 변수 예시 (공유됨)
class Counter {
static int count = 0;
Counter() {
count++;
}
}
public class Main {
public static void main(String[] args) {
new Counter(); // count = 1
new Counter(); // count = 2
new Counter(); // count = 3
System.out.println("총 객체 수: " + Counter.count); // 👉 3 (공유됨)
}
}
2. non-static 변수 예시 (객체마다 따로 존재)
class Counter {
int count = 0;
Counter() {
count++;
System.out.println("현재 객체의 count: " + count);
}
}
public class Main {
public static void main(String[] args) {
Counter c1 = new Counter(); // 👉 1
Counter c2 = new Counter(); // 👉 1
Counter c3 = new Counter(); // 👉 1
System.out.println("c1.count = " + c1.count); // 1
System.out.println("c2.count = " + c2.count); // 1
System.out.println("c3.count = " + c3.count); // 1
}
}
차이 요약
메모리 위치 | 클래스(static 영역, 1개만 존재) | 객체마다 따로 존재 (heap 영역) |
생성 시점 | 클래스 로딩 시 | 객체 생성 시 |
접근 방법 | 클래스명.변수 | 객체명.변수 |
공유 여부 | 모든 객체가 같은 변수 공유 | 객체마다 각각 별도 변수 |
사용 예시 | Counter.count, Math.sqrt() | Scanner sc = new Scanner(...) |
대표적인 용도 | 상수, 공용 설정, 전체 상태 관리 등 | 개별 사용자 정보, 객체 속성 저장 등 |
메서드 비교
static 메서드 (객체 없이 사용 가능)
class Util {
public static int doubleIt(int x) {
return x * 2;
}
}
Util.doubleIt(5); // 👉 결과: 10
non-static 메서드 (객체 있어야 사용 가능)
class Util {
public int doubleIt(int x) {
return x * 2;
}
}
Util u = new Util();
u.doubleIt(5); // 👉 결과: 10
static 사용 시 주의할 점
주의사항설명
static 메서드 안에서는 this 사용 ❌ | static은 객체가 없기 때문 |
static 변수는 값이 공유되므로 상태 관리 주의 | 여러 객체에서 동시에 접근 가능 |
객체마다 값이 달라야 할 경우엔 절대 static 쓰면 안 됨 | 예: 사용자 이름, 점수 등 |
두 가지 클래스 비교
class A {
static int x = 0;
int y = 0;
}
A a1 = new A();
A a2 = new A();
a1.x++; // static이므로 모든 인스턴스에 반영됨
a1.y++; // 인스턴스별 변수이므로 a2에는 영향 없음
System.out.println(a2.x); // 1 (공유됨)
System.out.println(a2.y); // 0 (개별적임)
728x90
반응형