TIL 36 | [Java] static 멤버

Yoonsik·2022년 8월 15일
0

JAVA

목록 보기
10/11

static 멤버

static 이란 사전적으로 '정적', '고정된' 이라는 의미를 갖습니다.

즉 static 멤버는 클래스에 고정된 멤버로, static 멤버가 포함된 객체를 생성하기 전에도 사용이 가능한 멤버 (필드와 메소드)를 의미합니다.

static 멤버와 non-static 멤버의 차이점

  • static 멤버

    1) 클래스당 하나만 생성되는 멤버로서, 동일한 클래스의 모든 객체들이 공유한다.

    2) 클래스 로딩 시에 static 멤버가 생성된다.
    - 객체가 생성되기 전에 이미생성
    - 객체가 생기기 전에도 사용 가능
    - 객체가 사라져도 static 멤버는 사라지지 않음 (클래스에 고정되어 있기 때문에)
    - static 멤버는 프로그램이 종료될 때 사라짐

    3) static 멤버는 클래스당 하나만 생성된다.
    - 객체 내부가 아닌 별도의 공간에 생성된다.
    - 클래스 멤버라고도 부른다.

  • non-static 멤버

    1) non-static 멤버는 객체 내에 각각 공간을 유지한다. (공유되지 않음)

    2) 객체 생성 시에 non-static 멤버가 생성된다.
    - 객체가 생길 때 멤버도 생성
    - 객체 생성 후 멤버 사용 가능
    - 객체가 사라지면 멤버도 사라짐
    - 인스턴스 멤버라고도 부른다.


static 멤버와 non-static 멤버의 선언

💻 Ex)

class StaticSample {
	// non-static 멤버
    int n;
    void g() {
    ...
    }
    
    // static 멤버
    static int m;
    static void f() {
    ...
    }
}

static 멤버를 이용한 예시 코드

💻 StaticSample 클래스

package StaticExample;

public class StaticSample {
	// non-static 멤버
	public int n;
	public void g() {
		m = 20;
	}
	public void h() {
		m = 30;
	}
	
	// static 멤버
	public static int m;
	public static void f() {
		m = 5;
	}
}

💻 Ex 01)

package StaticExample;

public class Ex01 {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		1. StaticSample s1, s2;
		2. s1 =  new StaticSample(); // s1 객체 생성
		3. s1.n = 5; // s1 의 인스턴스 멤버 n의 값을 5로 지정
		4. s1.g(); // s1의 클래스 멤버 m의 값을 20으로 지정
		5. s1.m = 50; // s1의 클래스 멤버 m의 값을 50으로 지정
		6. 
		7. s2 = new StaticSample(); // s2 객체 생성
		8. s2.n = 8; // s2의 인스턴스 멤버 n의 값을 8로 지정
		9. s2.h(); // s2의 클래스 멤버 m의 값을 30으로 지정  |  m = 50 -> 30  |  static멤버(클래스 멤버)는 동일한 클래스 내의 모든 객체들에 의해  공유되기 때문에 s1객체가 50으로 지정한 static멤버 m을 같은 클래스의 s2객체가 30으로 변경하는 것이 가능하다.
		10. s2.f(); // s1, s2에 의해 공유되고 있는 static 멤버변수 m이 5로 변경됨
		11. 
		12. System.out.println(s1.m);
	}
}

Line1 | StaticSample 클래스가 사용되는 (로딩되는) 이 시점에 static 멤버가 생성된다.

Line2 | s1 객체를 생성한다.

Line3 | s1의 인스턴스 멤버 n의 값을 5로 지정한다.

Line4 | s1의 클래스 멤버 m의 값을 메소드 g()(인스턴스 멤버) 를 이용하여 20으로 지정한다.

Line5 | s1의 클래스 멤버 m의 값을 50으로 지정한다.


현재 클래스 멤버 m의 값 : 50


Line7 | StaticSample 클래스의 또다른 객체 s2를 생성한다.

Line8 | s2의 인스턴스 멤버 n의 값을 8로 지정한다.

Line9 | s2의 클래스 멤버 m의 값을 메소드 h()(인스턴스 멤버) 를 이용하여 30으로 지정한다.

이때 클래스 멤버 m의 값은 50 에서 30으로 변경된다.

static멤버(클래스 멤버)는 동일한 클래스 내의 모든 객체들에 의해 공유되기 때문에 s1객체가 50으로 지정한 static멤버 m을 같은 클래스의 s2객체가 30으로 변경하는 것이 가능하다.

Line10 | s1, s2에 의해 공유되고 있는 static 멤버변수 m이 5로 변경된다.

Line12 | 결과값은 5


클래스 멤버 m의 값은 50 -> 30 -> 5 순으로 변경됨


💻 Ex 02)

package StaticExample;

public class Ex02 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		1. StaticSample.m = 10; // static 멤버 m의 값을 10으로 지정
		2. 
		3. StaticSample s1;
		4. s1 = new StaticSample();
		5. 
		6. System.out.println(s1.m);
		7. 
		8. // s1.f();
		9. StaticSample.f();
		10. 
		11. System.out.println(s1.m);
	}
}

Line1 | 클래스가 사용되는 (로딩되는) 이 시점부터 클래스 멤버가 생성된다.

또, static멤버는 크래스당 하나만 존재하기 때문에 다음과 같이 클래스 이름으로 바로 접근이 가능하다 StaticSample.m = 10

한 클래스의 객체들에게 공유되는 반복되거나 공통되는 데이터들을 이 static을 이용하여 처리할 수 있다.

profile
꾸준함의 힘

0개의 댓글