본문 바로가기
Category/JAVA

[JAVA] Static 이란?

by developer__Y 2023. 10. 10.
Static 이란?

Static이란 제어자의 하나로, '클래스의' 또는 '공통적인'이라는 의미를 가지고있다.

static은 멤버변수나 메소드에 사용할수있는데 '클래스에 소속된' 변수 또는 메소드 라고 할수있다.

이는 인스턴스 변수 또는 메소드의 반대되는 개념으로 코드를 통해 이해해보자.

class StaticEx {
    public static int a = 10;
    public int b = 10;

    public static void add() {
        System.out.println(a);
        System.out.println(b); //에러 발생!
    }
    public void add2(){
        System.out.println(a);
        System.out.println(b);
            }
}

StaticEx라는 클래스를 작성하고, static 변수인 a 와 non-static 변수인 b를 선언한뒤, 

a와 b를 각각 출력하는 static 메소드와 non-static메소드를 작성하면,

 'Non-static 필드 b는 static context에 참조될수없다'라는 오류메세지가 나온다.

 

이를통해 non-static 변수인 b는 static 메소드에서 사용될수 없다 (= 인스턴스 변수는 클래스메소드에 접근할수없다)

그러나, non-static 메소드는 static 변수를 사용할수있다! (=인스턴스메소드는 클래스 변수에 접근할수있다)

라는것을 알수있다.

 

왜냐하면,

인스턴스 변수(non-static)는 인스턴스(객체)가 생성되는 시점에 만들어 진다.

그런데, 클래스 변수는 클래스가 메모리에 생성될 시점에 이미 자동적으로 생성되어 존재하므로 클래스 메소드가 인스턴스 변수를 호출하는 시점에 인스턴스가 존재 하지않을수도 있기 때문이다.

 

 

이번에는, main 메소드에서 클래스에 직접 메소드를 실행, 인스턴스를 생성하여 메소드를 실행해보자.

 

public class codingtest3 {
    public static void main(String[] args) {
        StaticEx.add();
        //StaticEx.add2();
        StaticEx S1 = new StaticEx();
        StaticEx S2 = new StaticEx();
        S1.add();
        S1.a= 20;
        S1.add();
        S2.add();
    }
}

 

해당 코드의 실행결과는 10,10,20,20 이다.

 

세번째줄 : StaticEx.add(); 를 통해 main 메소드에서 직접 클래스의 메소드를 호출하는 것이 가능하다는 것을 알수있다.

네번째줄(주석) : add2 메소드는 non-static 메소드이므로 main 메소드에서 직접 클래스의 메소드를 호출할수없다.

 

또한 S1, S2라는 인스턴스를 생성하니 non-static 메소드, static 메소드가 모두 실행이 되고있고,

static int a= 10;의 값을 공유한다는 사실을 알수있다.

그리고, S1인스턴스를 통해 static int a 값을 변경해도, S2인스턴스의 static int a값또한 변경 된다(=공통적인 변수, 클래스의 멤버변수이기 때문!)

 

실제로 각각의 상황에 따른 결과를 통해 static의 특성을 요약하면,

- 인스턴스 변수(non-static)는 인스턴스(객체)가 생성되는 시점에 만들어 진다.

- 클래스 변수는 클래스가 메모리에 생성될 시점에 이미 자동적으로 생성되어 존재한다.

- 따라서, 클래스를 설계할때 모든 인스턴스에 공통적으로 사용하는 것에 static을 사용하는 것이 적절하다.

 

해당 실습을 통해 static의 개념을 어렴풋이 느낄수있었다.