Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java에서 정적(Static) 변수와 비정적(Non-Static) 변수의 차이점 완벽 정리

변수는 프로그램이 조작할 수 있는 이름이 부여된 저장 공간을 의미합니다. Java에서 모든 변수는 특정 타입을 가지며, 이 타입은 해당 변수가 차지하는 메모리의 크기와 구조, 저장할 수 있는 값의 범위, 그리고 변수에 적용할 수 있는 연산의 종류를 결정합니다.

정적 변수(Static Variable)

정적 변수는 클래스 변수(class variable)라고도 불리며, 클래스의 모든 객체가 공유하는 변수입니다. 객체를 생성하지 않고도 클래스명.변수명 형태로 클래스 이름을 통해 직접 접근할 수 있다는 것이 특징입니다.

비정적 변수(Non-Static Variable)

클래스 내에서 static 키워드로 선언되지 않은 모든 변수를 비정적 변수 또는 인스턴스 변수(instance variable)라고 합니다. 인스턴스 변수는 각 객체마다 독립적으로 존재하며, 객체가 생성될 때 함께 만들어집니다.

아래는 정적 변수와 비정적 변수의 주요 차이점을 정리한 표입니다.

번호구분 기준정적 변수비정적 변수
1접근성static 멤버 함수뿐만 아니라 non-static 멤버 함수에서도 접근할 수 있습니다.static 멤버 함수에서는 접근할 수 없습니다.
2공유 여부전역 변수처럼 동작하며, 클래스의 모든 객체가 하나의 값을 공유합니다.변수가 생성된 인스턴스 객체에만 속하며, 객체별로 독립적인 값을 가집니다.
3메모리 할당차지하는 공간이 적고, 메모리 할당은 단 한 번만 이루어집니다.객체 수에 따라 더 많은 공간을 차지할 수 있으며, 메모리 할당은 런타임에 발생합니다.
4선언 방식static 키워드를 사용하여 선언합니다.특별한 키워드 없이 일반적인 방식으로 선언합니다.

정적 변수 vs 비정적 변수 예제

JavaTester.java

public class JavaTester {
    public int counter = 0;
    public static int staticCounter = 0;
    public JavaTester(){
        counter++;
        staticCounter++;
    }
    public static void main(String args[]) {
        JavaTester tester = new JavaTester();
        JavaTester tester1 = new JavaTester();
        JavaTester tester2 = new JavaTester();
        System.out.println("Counter: " + tester2.counter);
        System.out.println("Static Counter: " + tester2.staticCounter);
    }
}

실행 결과

Counter: 1
Static Counter: 3

위 예제에서 객체를 세 번 생성했을 때, 인스턴스 변수인 counter는 각 객체마다 별도로 존재하기 때문에 마지막 객체인 tester2의 값은 1입니다. 반면 정적 변수인 staticCounter는 모든 객체가 공유하기 때문에 세 번의 생성자 호출이 누적되어 3이 출력됩니다. 이 결과를 통해 두 변수의 메모리 할당과 공유 방식의 차이를 명확히 확인할 수 있습니다.