이론/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
반응형