static_static 변수

2024. 1. 22. 23:53JAVA

static 키워드는 주로 '멤버 변수', '메서드' 에 사용된다.

 

멤버 변수에 static 키워드가 왜 필요한지 알아보자.

 

주문이 들어올 때마다 count를 하나씩 늘려 하루 동안 들어온 주문 수를 세고 싶다.

 

그래서 order 클래스에 멤버변수 int count 를 작성했다. 

public class Order {
    public String content;
    public int count;

    public Order(String content) {
        this.content = content;
        count++;
    }
}

이렇게 작성된 Order 를 실제로 사용 해보니

public class OrderCountMain {
    public static void main(String[] args) {
        Order order1 = new Order("주문1");
        System.out.println("order.count = " + order1.count);

        Order order2 = new Order("주문2");
        System.out.println("order.count = " + order2.count);

        Order order3 = new Order("주문3");
        System.out.println("order.count = " + order3.count);

    }
}

결과값이 1에서 더 이상 증감되지 않았다?
order.count = 1

order.count = 1

order.count = 1

 

왜 일까? 답은 이미 알지만 복기 해보자.

Order 인스턴스를 생성할 때 마다 count 를 늘렸으니 1,2,3 으로 늘어나야 되는 게 아닌가?

그럴듯하지만 옳지 않다.

 

인스턴스는 생성할 때마다 새로운 인스턴스가 생성된다.

그 때 마다 멤버 변수 int count 는 새롭게 만들어지고, 

멤버 변수의 초기값 = 0 이므로

생성될 때 마다 각 인스턴스의 count 는 1값을 갖게 된다.

 

자. 이제 이유와 원리는 알겠다.

그럼 하루 동안 들어온 주문 수를 카운팅 하려면 어떻게 해야 할까?

 

1. Order 클래스에서는 어떻게 안 될 것 같으니 외부에 위탁하자. count 해주는 클래스 작성 ㄱ다!

해보자.

 

public class Counter{
	public int count;
}
public class Order2{
	public String content;
    
    public Order2(String content, Counter counter){
    	this.content = content;
        counter.count++;
    }
}
public class OrderCountMain{
	public static void main(String[] args){
    	Counter counter = new Counter();
        Order2 order1 = new Order("김치찌개", counter);
        System.out.println("김치찌개 카운트" + counter.count);	// 1
        
        Order2 order2 = new Order("부대찌개", counter);
        System.out.println("부대찌개 카운트" + counter.count);	// 2 
       
    }
}

order1, order2 가 하나의 공통된 카운터 인스턴스를 사용.

주문 수를 셀 수 있게 되었다.

 

그.른.데. 그.른.데 ~

뭔가 불편하다.

주문(Order) 수량만 세면 되는데, 굳이 class Counter 를 만들고, 생성해서 가지고 와서,

주문 인스턴스 생성할 때 주소값 전달해주고.. 숫자를 세야 하나?

 

더 쉽게 하는 방법 없을까?

class 내에서 공용 변수를 처리할 수 있게 못하나?

 

이러한 불편함을 해소하기 위해 static 변수가 존재한다.

 

당장 써 보자.

public class Order3{
	public String content;
    public static int count;
    
    public Order3(String content){
    	this.content = content;
        count++;
    }
}

 

public class OrderCountMain{
	public static void main(String[] args){
    	Order3 order1 = new Order("김치찌개");
        System.out.println("김치찌개 카운트" + Order3.count);	// 1
        
        Order3 order2 = new Order("부대찌개");
        System.out.println("부대찌개 카운트" + Order3.count);	// 2 
       
    }
}

따란

static 키워드 하나 넣었다고

class Counter도 안 만들고, 인스턴스도 안 만들고, 차 떼고 포 뗐는데도

count값이 올라가는 것을 확인할 수 있다.

 

어떻게 이렇게 되는걸까?

앞선 내용에서

method 영역(클래스 영역) 안에서 static 변수도 관리 한다고 했다.

일반 멤버변수는 인스턴스를 생성할 때 마다 멤버 변수가 새롭게 만들어지고 초기화 되는 반면,

static 키워드를 사용하여 static 변수로 만들 경우, static 변수를 method 영역에서 관리하게 된다.

 

method 영역은 클래스 영역이라고도 불린다.

method 영역에는 클래스 정보(메서드 등), static 변수, 리터럴 상수 풀 등이 있다고 했다.

 

즉, static 변수에 접근하기 위해서는 해당 static 변수가 저장된 클래스 영역에 접근해야 한다.

따라서 static 변수에 접근할 때에는 클래스명.스태틱변수 로 접근하게 된다.

 

이 얘기를 갑자기 왜 하냐고?

이전 코드에서 보면 count 에 접근할 때 참조변수.count로 접근했는데

갑자기 클래스명.count 로 접근한 모습이 확인 될 것이다.

난 방금 클래스명.static변수명 으로 접근하는 이유를 설명했다.

 

다시 돌아와서,

클래스 정보가 같는 공통 정보(클래스 변수 = static 변수)를 사용하므로, Order3 의 int count 는 하나만 존재한다.

따라서, Order3 의 인스턴스를 생성할 때 마다 count 가 1개씩 계속해서 증가한다.

 

static 변수가 필요한 이유

: 해당 클래스의 인스턴스들이 공유하는 변수를 만들고 사용하기 위해

'인스턴스명.static변수명 이 아닌 '클래스명.static변수명' 인 이유

: static 변수는 method 영역(=클래스 영역)에 저장되는 공통 변수이기 때문

 

글이 좀 장황해졌다.

정리 하는 시간을 좀 가져야 겠다.

'JAVA' 카테고리의 다른 글

static_메서드2  (0) 2024.01.23
static_메서드1  (0) 2024.01.23
자료구조_스택&큐  (0) 2024.01.22
메모리 구조_잡탕  (0) 2024.01.22
접근제어자_default  (0) 2024.01.17