티스토리 뷰

▶자바 static의 의미와 사용법

이번 글에서는 자바에서의 static 키워드에 대해 알아보려고 합니다 :)

 

🔎 static(정적) ?


static은 고정된이란 의미를 가지고 있습니다.

따라서 static 키워드를 앞에 붙여주게 되면 고정된 멤버가 되어 객체별로 관리 되는 것이 아니라 클래스 별로 관리가 되게 됩니다.

 

→ 💡 static 키워드가 붙은 멤버는 해당 클래스의 필드를 할당받은 객체들은 모두 공유

→ 정적 멤버는 객체로 접근X 클래스 접근O

 

📌 클래스(Class)에서

필드는 클래스를 구성하는 요소 중 하나로 클래스 내부의 변수와 메소드들을 입니다.

필드나 메소드를 생성할 때 인스턴스로 생성할 것인지(만들어지는 객체에서 따로따로 관리)

아니면 정적으로 생성할 것인지(만들어지는 객체에서 모두 공유하도록)

로 판단기준을 세우면 됩니다.

 

📌 static 멤버 선언 - 앞에 static 붙이기

static int num;
public static void static_method(){}

 

📌 static 필드 사용 예시

static 키워드가 붙었을 때의 차이를 보기 위해

필드 내부에 인스턴스 변수와 클래스 변수 각각을 선언해 주었습니다.

 

이제부터 data 변수는 인스턴스 별로 관리가 되며

static이 붙은 data_s 변수는 클래스 자체에서 관리되며 모든 인스턴스는 이를 공유하고 있습니다. 

class Data {
	int data = 10; // 인스턴스 변수
	static int data_s = 10; // 클래스 변수
	// ---> 모든 객체들이 공유해야 할 때 static 필드를 선언함
	
	void increase() {
		System.out.println(++data);
	}
	
	void increase_s() {
		System.out.println(++data_s);
	}
}

인스턴스 2개를 생성해 주었습니다.

public class StaticTest{
    public static void main(String[] args) {
        Data data1 = new Data();
        Data data2 = new Data();
    }
}

다시 위로 올라가 Data라는 클래스를 보면 data라는 변수는 인스턴스 변수이고 data_s는 클래스 변수입니다.

따라서 data변수는 인스턴스끼리 공유X, data_s변수는 인스턴스끼리 공유O 하고 있습니다.

 

정적 멤버를 클래스로 접근하여(Data.data_s) 값을 바꿔주었더니

모든 객체들의 클래스 변수의 값도 모두 바뀐 것을 확인할 수 있었습니다.

Data.data_s = 20;

System.out.println(data1.data_s); // 20
System.out.println(data2.data_s); // 20

반면에 그냥 선언을 한 인스턴스 변수는 인스턴스별로 관리가 되기 떄문에

값을 공유하지 않습니다.

data1.data = 20;

System.out.println(data1.data); // 20
System.out.println(data2.data); // 10

 

계속해서 언급하고 있는 "정적 멤버는 클래스가 관리"에 대해 더 잘 이해해보기 위해 아래와 같은 코드를 작성했습니다.

지금 Data 클래스의 필드를 메모리에 할당하여 그 주소를 가지고 있는 data 객체입니다.

중간에 주소를 한번 바꿔주었습니다.

즉 새 필드를 부여 받았다는 의미와 같은데요.

 

하지만 정적 멤버는 클래스 자체에서 관리하기 때문에 주소를 바꾸더라도 정적 멤버는 클래스에서 관리하고 있는 값을 가지고 오는 것이기 때문에 새로운 인스턴스에 대해 값이 다시 초기화 되거나 하지 않습니다.

Data data = new Data();

data.increase_s();
data.increase_s();
data.increase_s();
data.increase_s();
data.increase_s();

data = new Data(); // 주소 바꿈

data.increase_s();
data.increase_s();
data.increase_s();
data.increase_s();
data.increase_s();

출력 결과

반면에 인스턴스 변수에 대해서도 동일하게 적용해 보겠습니다.

이때는 인스턴스 별로 관리되기 때문에 중간에 새로운 필드를 메모리에 올리게 되면 새로운 주소값을 부여 받으면서 모든 값은 초기값을 갖게 됩니다.

Data data = new Data();

data.increase();
data.increase();
data.increase();
data.increase();

data = new Data(); // 주소 바꿈

data.increase(); // 값 다시 초기화 됨
data.increase();
data.increase();
data.increase();
data.increase();
data.increase();

출력 결과

728x90
LIST
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함