클래스 변수
- Static으로 선언된 변수는 변수가 선언된 클래스의 모든 인스턴스가 공유하는 변수이다.
- 클래스 변수는 인스턴스 내에 존재하는 변수가 아니라 ‘어떠한 인스턴스에도 속하지 않는 상태로 메모리 공간에
하나만 존재하는 변수’
- 이 변수가 선언된 클래스의 인스턴스들은 이 변수에 바로 접근할 수 있는 권한이 있다.
클래스 변수의 초기화 시점
- 클래스 변수는 인스턴스 생성 이전에 메모리 공간에 존재한다.
- 클래스 변수는 해당 클래스 정보가 가상머신에 의해 읽히는 순간 메모리 공간에 할당되고 초기화된다.
이러한 할당과 초기화는 인스턴스의 생성과 무관하게 이뤄진다.
클래스 로딩(Class Loading)
- 가상머신이 특정 클래스 정보를 읽는 행위
- 특정 클래스의 인스턴스 생성을 위해서는 해당 클래스가 반드시 가상머신에 의해 로딩되어야 한다.
즉, 해당 클래스가 메모리에 올라가 있어야 인스턴스 생성이 가능하다.
Static 초기화 블록(Static Initialization Block)
- 클래스 로딩시 단 한번 실행이 되는 영역.
- Static 초기화 블록을 이용하여 클래스 변수를 초기화 할 수 있다.
- 해당 블록을 선언한 곳은 클래스 로딩 시점에 실행된다.
class ... {
static String date;
static {
LocalDate date = LocalDate.now();
date = date.toString();
}
}
Static 초기화 블록을 사용하여 클래스 변수를 선언과 동시에 초기화하는 것이 가능하다.
클래스 변수를 언제 유용하게 활용할 것인가?
- 인스턴스 간에 데이터 공유가 필요한 상황에서 클래스 변수를 선언한다.
- 참조를 목적으로만 존재하는 값은 final 선언이 된 클래스 변수에 담는다.
클래스 메소드
- 클래스 메소드의 정의는 클래스 변수의 특성과 동일하다.
- 인스턴스 생성 이전부터 접근이 가능하다.
- 어느 인스턴스에도 속하지 않는다.
클래스 메소드로 정의하는 것이 더 나은 상황?
- 모두 외부에 기능을 제공하기 위한 메소드인 경우
- 모두 인스턴스 변수의 값을 참조하거나 수정하지 경우
※ 위의 경우 클래스 메소드로 정의하면 불필요한 인스턴스의 생성과정을 생략할 수 있다.
클래스 메소드에서 인스턴스 변수에 접근이 가능한가?
- 인스턴스 변수는 인스턴스에 속한다.
인스턴스 변수는 인스턴스가 생성이 되어야 메모리 공간에 존재하게 된다.
반면, 클래스 메소드는 인스턴스 생성 이전부터 호출이 가능하다.
※ 클래스 메소드는 인스턴스에 속하지 않으므로 인스턴스 변수에 접근이 불가능하다.
같은 이유로 클래스 메소드는 인스턴스 메소드의 호출도 불가능하다.
그러나 클래스 메소드는 같은 클래스에 정의되어 있는 다른 클래스 메소드나 성격이 동일한 클래스 변수에는
접근 가능하다. ( 같은 시점에 메모리 공간에 존재하기 때문 )
[참고자료]
윤성우의 열혈 Java 프로그래밍
'Java > 기본' 카테고리의 다른 글
자바(Java) StringBuilder, StringBuffer (0) | 2020.02.26 |
---|---|
자바(Java) 메소드 오버로딩, 메소드 오버라이딩 (0) | 2020.02.25 |
자바(Java) 정보은닉, 캡슐화 (0) | 2020.02.23 |
자바(Java) 흐름 제어 (0) | 2020.02.23 |
자바(Java) 연산자 (0) | 2020.02.23 |