이 글은 이것이 자바다를 참고하여 작성되었습니다.
- 클래스에 고정된 멤버. 객체를 생성하지 않고 사용할 수 있는 필드와 메소드. 각각 정적 필드, 정적 메소드라고 부른다.
- 객체(인스턴스)에 소속된 멤버가 아니라 클래스에 소속된 멤버이기 때문에 클래스 멤버라고도 한다.
public class 클래스 { // 정적 필드 static 타입 필드 [=초기값]; //정적 메소드 static 리턴 타입 메소드(매개변수선언,...){...} }
- 인스턴스 필드 vs 정적 필드
객체마다 가지고 있을 필요성이 없는 공용적인 데이터라면 정적 필드로 선언하는 것이 좋다.- 인스턴스 메소드 vs 정적 메소드
인스턴스 필드를 이용해서 실행해야 한다면 인스턴스 메소드로 선언하고,
인스턴스 필드를 이용하지 않는다면 정적 메소드로 선언한다.
: 클래스가 메모리로 로딩되면 정적 멤버를 바로 사용할 수 있다.
클래스.필드;
클래스.메소드(매개값,...);
: 정적 필드는 필드 선언과 동시에 초기값을 주는 것이 보통이지만 계산이 필요한 초기화 작업이 있을 수 있다. 정적 필드는 객체 생성 없이도 사용해야 하므로 생성자에서 초기화 작업을 할 수 없다.
→ 정적 블록(static block)을 제공static { ... }정적 블록은 클래스 내부에 여러 개가 선언되어도 상관없다.
- 정적 메소드와 정적 블록은 객체가 없어도 실행되기 때문에 이들 내부에 인스턴스 필드나 인스턴스 메소드를 사용할 수 없다. 객체 자신의 참조인 this 키워드도 사용할 수 없다.
- 인스턴스 멤버를 사용하고 싶다면 객체를 먼저 생성하고 참조 변수로 접근해야 한다.
- main() 메소드도 정적(static) 메소드이므로 객체 생성 없이 인스턴스 필드와 인스턴스 메소드를 main() 메소드에서 바로 사용할 수 없다.
: 단 하나의 객체만 만들도록 보장해야 하는 경우에 사용.
public class 클래스 { // 정적 필드 private static 클래스 singleton = new 클래스(); // 생성자 private 클래스() {} // 정적 메소드 static 클래스 getInstance(){ return singleton; } }
- getInstance() 메소드는 단 하나의 객체만 리턴하기 때문에 아래 코드에서 변수1과 변수2는 동일한 객체를 참조한다.
클래스 변수1 = 클래스.getInstance();
클래스 변수2 = 클래스.getInstance();
- final 필드 : 초기값이 저장되면 프로그램 실행 도중에 수정할 수 없다.
final 타입 필드 [=초기값];- final 필드의 초기값을 줄 수 있는 방법
- 필드 선언 시에 주는 방법
- 생성자에서 주는 방법
- 상수(static final)
static final 타입 상수 [=초기값];
복잡한 초기화일 경우 정적 블록에서도 할 수 있다.static final 타입 상수; static { 상수 = 초기값; }