본문 바로가기
개발 공부/Java

[자바다] static 정적 변수와 final 필드 그리고 싱글톤 선언하는 법

by 반달bear 2022. 8. 16.
반응형

정적 변수 static

정적 멤버는 클래스에 고정된 멤버로 객체를 생성하지 않고 사용할 수 있는 필드와 메소드를 말합니다.

정적 멤버를 선언하기 위해서는 static 키워드를 붙여줘야 하는데 정적 멤버는 '객체'가 아니라 '클래스'에 소속됨으로 객체마다 가지고 있을 필요가 없는, 변화지 않는! 공용적인 데이터들을 정적 멤버로 선언하고는 합니다.

클래스가 메모리로 로딩되면 생성자를 이용해서 객체를 선언해야 이용할 수 있는 인스턴스 멤버와 달리 정적 멤버는 바로 사용할 수 있다. 그러므로 객체의 이름이 아닌 클래스의 이름으로 접근해야 합니다.

정적 멤버의 초기화
- 필드 선언과 동시에 선언
- 정적 블록을 활용 (객체 생성 없이 사용해야 하므로 생성자에서 초기화 작업을 할 수 없다)

정적 멤버 사용시 주의점
- 정적 메소드 내에서 인스턴스 필드를 사용하고 싶다면 !!자기자신의 클래스라도!! 메소드 안에서 객체를 먼저 생성하고 참조변수로 접근해야 한다
- this.varName 으로 접근이 불가하다

 

Final 필드

Final이라는 의미는 최종입니다. 필드를 초기화 한 이후에는 변경이 불가합니다.

Final 필드 초기화
- 필드 선언과 동시에 선언
- 생성자에서 입력

 

싱글톤 선언하는 법

클래스가 단 하나의 객체만 만들도록 짜여져있을 때 그 객체를 싱글톤이라고 합니다.

싱글톤은 선언하는 법은 간단합니다.

우선 객체마다 싱글톤이 생성된다면 싱글톤이 아니게 됨으로 정적 필드면서 동시에 private인 필드로 객체를 생성해줍니다. private로 생성하는 이유는 다른 클래스에서 참조가 불가능하게 해주기 위함입니다. 이때 생성자도 동시에 private로 선언해주어서 외부에서 필드값을 바꾸지 못하게 한다. 대신 외부에서 호출할 수 있는 메소드를 static으로 선언해줍니다.

이때 필드랑 메소드는 static인데 왜 생성자는 static이 아닐까?라는 의문을 가질 수 있는데 그건 위에서 설명했다시피 static이 객체와 관련된 키워드이기 때문입니다. static은 객체 생성과 관련이 없을 때만 붙이는 키워드입니다. 필드와 메소드는 객체 생성과 관련이 없을 수 있지만 '생성자'는 객체 생성시에 사용되는 멤버이기에 반드시 객체와 관련이 있을 수 밖에 없고 그렇기에 static을 붙이지 못합니다.

public class CLASSNAME {
//정적필드
private static CLASSNAME singleton = new CLASSNAME();

//생성자
private CLASSNAME() {}

//정적 메소드
static CLASSNAME getInstance() {
 reuturn singleton;
}

이렇게 싱글톤 객체를 메인 메소드에서 선언해주면 객체를 아무리 생성해도 모두 이 하나의 객체 '싱글톤' 객체만을 가르키게 됩니다.

반응형

댓글