Static-Member
1 Static Member(Class Member)
- Static Member는 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드를 말한다.
- 이들을 각각 static field(class variable), static method(class method)라고 부른다.
- Static Member는 클래스에 고정된 멤버이므로 클래스 로더가 클래스를 로딩해서 메소드 메모리 영역에 적재할 때 클래스 별로 관리된다.
- 따라서 클래스 로딩이 끝나면 바로 사용 가능
언제 사용하나?
- 해당 클래스로 만든 모든 객체에 공통적인 변수를 사용하려고 하는 경우 사용한다.
- 클래스의 모든 인스턴스는 메모리 내 하나의 고정 위치에 있는 클래스 변수를 공유합니다.
- 모든 객체는 클래스 변수의 값을 변경할 수 있고 static field는 클래스의 인스턴스를 만들지 않고도 조작할 수 있습니다.
정리
- 객체마다 가지고 있어야하는 데이터 -> 인스턴스 필드
- 객체마다 가지고 있을 필요성이 없는 공용적인 데이터 -> 정적 필드(Class Variable)
- 인스턴스 필드를 이용해서 실행해야 한다 -> 인스턴스 메소드
- 인스턴스 필드를 이용하지 않는다 -> 정적 메소드(Class Method)
2 Static Field(Class Variable)
- static field를 사용하고 싶다면 필드 선언시
static키워드를 붙인다. - static field는 선언과 동시에 초기값을 주는 것이 보통이다.
예시
public class Bicycle {
private final int id;
private static int numberOfBicycles = 0;
public Bicycle(){
id = ++numberOfBicycles;
}
public int getId() {
return id;
}
public static int getNumberOfBicycles() {
return numberOfBicycles;
}
}
테스트
- static field는 클래스 이름 자체로 접근 가능하다.
- 또한 객체 참조로도 static field에 접근 가능하다
@Test
void staticField(){
// when
Bicycle bicycle1 = new Bicycle();
Bicycle bicycle2 = new Bicycle();
// then
assertThat(bicycle1.getId()).isEqualTo(1);
assertThat(bicycle2.getId()).isEqualTo(2);
}
@Test
void staticMethod() {
// given
assertThat(Bicycle.getNumberOfBicycles()).isEqualTo(0);
// when
Bicycle bicycle = new Bicycle();
// then
assertThat(Bicycle.getNumberOfBicycles()).isEqualTo(1);
}