Java/Java

Java 객체지향 프로그래밍 static (class 변수, instance변수)

검은고양이개발자 2023. 1. 15. 15:35
반응형

우리는 객체를 생성할 클래스 내의 필드에 변수들, 그리고 메서드를 지정해 줄 수 있는데

 

그 변수를 어떤식으로 활용하게 만들지를 static이라는 키워드를 통해 정할 수 있습니다.

 

그렇다면 static은 어떤 역할을 하는 키워드일까요?


 

먼저 static은 클래스의 멤버(필드,메서드,이너 클래스)에 사용하는 키워드입니다.

필드에는 클래스의 속성을 나타내는 변수들을 지정하는데 

static을 붙이지 않은 변수인 경우 instance 변수라고 부르고, 그 변수를 사용하기 위해서는 객체를 생성해서 참조변수를 통해 이용해야 합니다(참조변수 이름. 필드변수이름).

 

반면에 static을 붙인 변수 , 즉 class 변수는 객체를 생성하지 않고 바로 (클래스의 이름.필드변수이름)를 통해 이용할 수 있습니다. # class변수인 경우 인스턴스 변수와 같이 참조변수를 통해서도 이용할 수 있습니다. 

 

이러한 특징의 차이는 static 키워드를 붙인 class 변수는 instance 변수와는 다르게 모든 변수의 값을 공유하기 때문인데요. 이 말이 무슨 말이냐면, 만약에 기존 클래스 내에 변수의 값을 100이라고 지정을 했는데 다른 클래스 내에서 변수의 값을 200으로 지정을 하게 되면, 기존 클래스 내의 변수의 값도 200이 된다는 얘기입니다.

public class CordJgMethod {
    public static void main(String[] args) {
        Action action = new Action();
        
        Action.act();
      
        System.out.println(Action.n);  --> 5
        action.n= 100;
        System.out.println(action.n);   --> 100

        Action.act();
    }
}
class Action{
    static int n=5;
    
    static void act(){

        System.out.printf("클래스 변수는 값을 공유해서 기존 클래스 내의 필드변수의 값도 변하는가? %d \n",n);
        react();
    }
// void react()->오류 (static void act 안에 react()는 static이 없는 경우 사용이 불가능)
    static void react(){

        System.out.println("인스턴스 메서드는 사용이 불가능 하다?");
    }
}
//출력
클래스 변수는 값을 공유해서 기존 클래스 내의 필드변수의 값도 변하는가? 5 
인스턴스 메서드는 사용이 불가능 하다?
5
100
클래스 변수는 값을 공유해서 기존 클래스 내의 필드변수의 값도 변하는가? 100 
인스턴스 메서드는 사용이 불가능 하다?

위 코드를 살펴보면 static 을 붙인 필드변수의 값을 Action.n , action.n 을 통해 각각 구할 수 있는 것을 알 수 있고

static을 붙인 메서드 또한 마찬가지로 클래스 명을 통해 직접 호출할 수 있는 것을 알 수 있습니다.

 

클래스 외부에서 필드변수인 n의 값을 변화시켰음에도 불구하고 

클래스 내부의 메서드인 act()를 호출했을 때  n의 값이 변화되어 호출되는 것을 통해

static 변수는 값을 공유한다는 것을 알 수 있습니다.

 

또한, static을 붙인 메서드 안에는 static을 붙이지 않은 instance 변수나 instance 메서드를 사용할 수 없습니다.

이건 본인이 직접 코딩을 통해 따져보는 게 가장 이해하기 쉬울 거라 생각합니다.

 

반응형