java static의 활용 및 사용법을 이해한다.

Goal

  • non-static 멤버와 static 멤버의 차이를 이해할 수 있다.
  • static 멤버의 사용법을 이해할 수 있다.
  • static의 활용과 static 메서드의 제약 조건을 이해할 수 있다.

static 멤버의 선언

멤버 선언 시 앞에 static이라고 붙인다.

class StaticSample {
  int n; // non-static 필드
  void g() {...} // non-static 메서드

  static int m; // static 필드
  static void f() {...} // static 메서드
}

non-static 멤버 VS static 멤버

non-static 멤버


static 멤버

static 멤버의 사용법

1. 객체.static 멤버

static 멤버도 역시 멤버이기 때문에 일반적인 멤버 사용법과 다를 바 없다.

객체.static 멤버
객체.static 메서드

static 멤버의 생성과 공유

class StaticSample {
  public int n;
  public void g() { m = 20; }
  public void h() { m = 30; }
  public static int m;
  public static void f() { m = 5; }
}
public class Main {
  public static void main(String args[]) {
    StaticSample s1, s2;
    s1 = new StaticSample();
    s1.n = 5;
    s1.g();
    s1.m = 50; // static

    s2 = new StaticSample();
    s2.n = 8;
    s2.h();
    s2.f(); // static
    System.out.println(s1.m); // result: 5
  }
}

2. 클래스명.static 멤버

static 멤버는 클래스당 하나만 있기 때문에 클래스 이름으로 바로 접근할 수 있다.

클래스명.static 멤버

static 멤버의 생성과 공유

class StaticSample {
  위와 동일
}
public class Main {
  public static void main(String args[]) {
    StaticSample.m = 10;

    StaticSample s1;
    s1 = new StaticSample();
    System.out.println(s1.m); // result: 10

    /* static 메서드 사용 */
    s1.f(); // 1. 객체 레퍼런스로 static 멤버 f() 호출
    StaticSample.f(); // 2. 클래스명을 이용하여 static 멤버 f() 호출
  }
}

주의

static의 활용

1. 전역 변수와 전역 함수를 만들 때 활용

2. 공유 멤버를 만들고자 할 때 활용

static으로 선언된 필드나 메서드는 모두 이 클래스의 각 객체들의 공통 멤버가 되며 객체들 사이에서 공유된다.

static 메서드의 제약 조건

1. static 메서드는 오직 static 멤버만 접근할 수 있다.

static 메서드는 객체가 생성되지 않은 상황에서도 사용이 가능하므로 객체에 속한 인스턴스 메소드, 인스턴스 변수 등을 사용할 수 없다.

class StaticMethod {
  int n;
  void f1(int x) { n = x; } // 정상
  void f2(int x) { n = x; } // 정상

  static int m;
  static void s1(int x) { n = x; } // 컴파일 오류. static 메서드는 non-static 필드 사용 불가
  static void s2(int x) { f1(3); } // 컴파일 오류. static 메서드는 non-static 메서드 사용 불가

  static void s3(int x) { m = x; } // 정상. static 메서드는 static 필드 사용 가능
  static void s4(int x) { s3(3); } // 정상. static 메서드는 static 메서드 호출 가능
}

2. static 메서드에서는 this 키워드를 사용할 수 없다.

this는 호출 당시 실행 중인 객체를 가리키는 레퍼런스이다.

class StaticAndThis {
  int n;
  static int m;
  void f1(int x) { this.n = x; } // 정상
  void f2(int x) { this.m = x; } // non-static 메서드에서는 static 멤버 접근 가능
  static void s1(int x) { this.n = x; } // 컴파일 오류. static 메서드는 this 사용 불가
}

References