Java - 클래스#2

이새봄·2022년 9월 3일

Java

목록 보기
2/11

이 글은 이것이 자바다를 참고하여 작성되었습니다.

정적 멤버와 static

정적 멤버

  • 클래스에 고정된 멤버. 객체를 생성하지 않고 사용할 수 있는 필드와 메소드. 각각 정적 필드, 정적 메소드라고 부른다.
  • 객체(인스턴스)에 소속된 멤버가 아니라 클래스에 소속된 멤버이기 때문에 클래스 멤버라고도 한다.

정적 멤버 선언

public class 클래스 {
    // 정적 필드
    static 타입 필드 [=초기값];
    //정적 메소드
    static 리턴 타입 메소드(매개변수선언,...){...}
}
  • 인스턴스 필드 vs 정적 필드
    객체마다 가지고 있을 필요성이 없는 공용적인 데이터라면 정적 필드로 선언하는 것이 좋다.
  • 인스턴스 메소드 vs 정적 메소드
    인스턴스 필드를 이용해서 실행해야 한다면 인스턴스 메소드로 선언하고,
    인스턴스 필드를 이용하지 않는다면 정적 메소드로 선언한다.

정적 멤버 사용

: 클래스가 메모리로 로딩되면 정적 멤버를 바로 사용할 수 있다.
클래스.필드;
클래스.메소드(매개값,...);

정적 초기화 블록

: 정적 필드는 필드 선언과 동시에 초기값을 주는 것이 보통이지만 계산이 필요한 초기화 작업이 있을 수 있다. 정적 필드는 객체 생성 없이도 사용해야 하므로 생성자에서 초기화 작업을 할 수 없다.
→ 정적 블록(static block)을 제공

static {
    ...
}

정적 블록은 클래스 내부에 여러 개가 선언되어도 상관없다.

주의할 점

  • 정적 메소드와 정적 블록은 객체가 없어도 실행되기 때문에 이들 내부에 인스턴스 필드나 인스턴스 메소드를 사용할 수 없다. 객체 자신의 참조인 this 키워드도 사용할 수 없다.
  • 인스턴스 멤버를 사용하고 싶다면 객체를 먼저 생성하고 참조 변수로 접근해야 한다.
  • main() 메소드도 정적(static) 메소드이므로 객체 생성 없이 인스턴스 필드와 인스턴스 메소드를 main() 메소드에서 바로 사용할 수 없다.

싱글톤(Singleton)

: 단 하나의 객체만 만들도록 보장해야 하는 경우에 사용.

public class 클래스 {
    // 정적 필드
    private static 클래스 singleton = new 클래스();
    // 생성자
    private 클래스() {}
    // 정적 메소드
    static 클래스 getInstance(){
        return singleton;
    }
}
  • getInstance() 메소드는 단 하나의 객체만 리턴하기 때문에 아래 코드에서 변수1과 변수2는 동일한 객체를 참조한다.
    클래스 변수1 = 클래스.getInstance();
    클래스 변수2 = 클래스.getInstance();

final 필드와 상수

  • final 필드 : 초기값이 저장되면 프로그램 실행 도중에 수정할 수 없다.
    final 타입 필드 [=초기값];
  • final 필드의 초기값을 줄 수 있는 방법
    • 필드 선언 시에 주는 방법
    • 생성자에서 주는 방법
  • 상수(static final)
    static final 타입 상수 [=초기값];
    복잡한 초기화일 경우 정적 블록에서도 할 수 있다.
    static final 타입 상수;
    static {
        상수 = 초기값;
    }

0개의 댓글