본문 바로가기

Programming/Java

[Java] static 키워드 유무에 따른 변수 값의 변화

반응형

static 키워드가 있는 변수는 클래스 변수

 
static 키워드로 생성된 변수는 해당 변수가 있는 클래스 로드 중에 초기화되며,
애플리케이션 실행 내내 메모리에 머물러 있다. 따라서 초기화 과정 없이 해당 변수, 메소드에 접근할 수 있다.
 
static 키워드가 있는 변수를 클래스 변수라고 부른다.

 

아래 코드는 더하기(add) 기능을 수행하는 Calculator 클래스를 정의한 것이다. 클래스 내부에 static 키워드의 int 타입의 result 변수를 선언했다. 선언한 static 변수를 add 메소드 결과값으로 리턴하도록 코드를 구성했다.

 

public class Calculator {
    public static int result = 0;

    public int add(int num1, int num2) {
        result = num1 + num2;
        return result;
    }
}

 

그리고 위에서 정의한 메소드 실행 시 아래와 같이 서로 다른 이름을 가진 두 개의 Calculator 클래스 인스턴스 calculator1, calculator2를 생성하고, Calculator 클래스의 static 변수의 값이 어떻게 변하는지 확인했다.

 

public class Main {
    public static void main(String[] args) {

        Calculator calculator1 = new Calculator();
        calculator1.add(2, 2);
        
        System.out.println(calculator1.result);

        Calculator calculator2 = new Calculator();
        calculator2.add(3, 3);
        
        System.out.println(calculator2.result);
        System.out.println(calculator1.result);
        
    }
}
결과)
System.out.println(calculator1.result); / 4
System.out.println(calculator2.result); / 6
System.out.println(calculator1.result); / 6

 

가장 상위에 위치한 calculator1.add(2, 2); 의 결과인 4가 result 변수에 담겼다.

이후 calculator2.add(3, 3); 의 결과인 6이 result 변수에 담겼다.

결과적으로 static 변수 result의 값은 6이다.

이를 통해 static 키워드를 가진 변수는 인스턴스의 생성 개수에 상관없이 공통으로 하나만 사용된다는 것을 알 수 있다.

 

non-static(static 키워드가 없음)

 
non-static(static 키워드 없이 생성된) 변수는 새로운 객체(인스턴스)를 생성할 때마다 초기화된다.
static 키워드가 없는 변수를 인스턴스 변수라고 부른다.

 

위에서 예시로 작성된 Calculator 클래스의 static 변수를 non-static 변수로 변경하면 결과는 아래와 같다.

 

Calculator 클래스에 non-static 변수가 있다면.
public static int result = 0;

결과)
System.out.println(calculator1.result); / 4
System.out.println(calculator2.result); / 6
System.out.println(calculator1.result); / 4

 

non-static 변수는 인스턴스를 새로 생성 할 때마다 변수가 새롭게 초기화된다. 변수 하나로 공용으로 사용하지 않는다.

 

초반에 언급했듯이 static 키워드의 변수나 메소드는 초기화 과정 없이(인스턴스를 생성하지 않아도) 클래스 이름으로 바로 접근 할 수 있다.

 

public class Main {
    public static void main(String[] args) {

        Calculator calculator1 = new Calculator();
        calculator1.add(2, 2);
        
        System.out.println(Calculator.result);

        Calculator calculator2 = new Calculator();
        calculator2.add(3, 3);
        
        System.out.println(Calculator.result); // 클래스 이름(Calculator)로 바로 접근
        System.out.println(Calculator.result); // 클래스 이름(Calculator)로 바로 접근
    }
}

 

반응형

'Programming > Java' 카테고리의 다른 글

[Java] Spring Pool  (0) 2021.12.11
[Java] 자바 스트림(stream)  (0) 2021.11.30
[Java] Enum 클래스  (0) 2021.11.18
[Java] StringBuilder 클래스  (0) 2021.10.01
[Java] 2차원 배열의 행(row) 길이와 열(column) 길이  (0) 2021.09.25