정적멤버 ?
클래스에 고정된 멤버
객체를 생성하지 않고 사용할 수 있는 필드와 메소드
1. 정적멤버 선언
정적필드와 정적 메소드를 선언하는 방법은 필드와 메소드 선언 시 static 키워드를 붙여주면 된다.
public class 클래스{
static 타입 필드 [= 초기값];
static 리턴 타입 메소드 ( 매개변수 선언, ...){...}
정적 필드와 메소드는 클래스에 고정 -> 클래스 별로 관리 됨
ⓐ 필드를 선언 할 때 판단기준
객체마다 가지고 있어야 할 데이터 = 인스턴스 필드 ex) static double pi = 3.141592;
공용적인 데이터 = 정적 필드 ex) String color;
ⓑ 메소드를 선언 할 때 판단기준
인스턴스 필드를 이용해서 실행 해야 하면 = 인스턴스 메소드
인스턴스 필드를 사용하지 않는다면 정적 메소드
2. 정적멤버 사용
클래스가 메모리로 로딩되면 정적 멤버를 바로 사용할 수 있는데, 클래스 이름과 함께 .(도트 연산자)로 접근
class.field;
class.method(values, ...);
정적필드와 정적 메소드는 원칙적으로는 클래스 이름으로 접근 but, 객체 참조 변수로도 접근 가능(경고 표시 뜸)
3. 정적 초기화 블록
정적 필드는 필드 선언과 동시에 초기값을 주는 것이 보통
※ 계산이 필요한 초기화 작업일 경우 정적블록(static block)을 사용
static{
...
}
* 정적블록은 클래스가 메모리로 로딩될 때 자동적으로 실행(한 클래스 내에 여러개가 선언되어도 상관x)
info는 초기화 x static블록을 이용해서 초기값 설정
4. 정적 메소드와 블록 선언 시 주의할 점
객체가 없어도 실행되기 때문에
ⓐ 내부에 인스턴스 필드나 인스턴스 메소드를 사용할 수 x
ⓑ this 사용 x
인스턴스 멤버를 사용하고 싶으면 객체를 먼저 생성 한 뒤 참조 변수로 접근해야 함.
5. 싱글톤(singleton)
singleton ?
단 하나의 객체만 생성
ⓐ 싱글톤을 만드려면 외부에서 new 연산자로 호출(=객체 생성) 하는걸 막아줘야 함 => private 접근 제한자
ⓑ 자신의 타입인 정적 필드를 하나 선언하고 자신의 객체를 생성해 초기화 함
ⓒ 정적 필드도 private 접근제한자를 붙여 외부에서 필드값을 변경하지 못하도록 함
public class 클래스 {
//정적필드
private static 클래스 singleton = new 클래스();
//생성자
private 클래스() {}
//정적 메소드
static 클래스 getInstance() {
return singleton;
}
}
* 외부에서 객체를 얻는 유일한 방법 = getInstance() 메소드 호출
6. final 필드와 상수
final ?
final 필드는 초기값이 지정되면 최종적인 값이 되어서 더이상 변경할 수 x
final 필드의 초기값 설정 방법
ⓐ 필드 선언 시 설정
ⓑ 생성자에서 주는 방법
상수(static final) ?
불변의 값 ( π, 지구의 무게 등)
상수는 static 이자 final 이여야 함
상수 이름은 모두 대문자로 작성하는 것이 관례
'STUDY > JAVA' 카테고리의 다른 글
JAVA - 접근제한자 ( public, protected, default, private) (0) | 2022.04.18 |
---|---|
JAVA - 패키지, import문 (0) | 2022.04.18 |
JAVA - 메소드 (0) | 2022.04.18 |
JAVA - 객체지향프로그래밍(필드, 생성자) (0) | 2022.04.13 |
JAVA - 열거타입 (0) | 2022.04.13 |