[Java] Static

SANG JONG CHOI·2022년 10월 28일
0

Java

목록 보기
11/28

인스턴스 멤버

  • non-static 멤버
  • 객체를 통해서 접근
  • 지금까지 우리가 만들었던 객체(인스턴스) 멤버
  • 객체가 생성될 때 각 객체 내부에 하나씩 생성
  • 객체마다 자신의 고유 멤버 공간을 가짐
  • 다른 객체들과 공유하지 않음
  • 객체가 사라지면 함께 사라짐
image-20220619014146344

static 멤버 (정적 멤버)

  • 클래스에 고정된 필드와 메소드
  • 클래스에 소속된 멤버 (클래스 당 하나만 생성)
  • 객체를 생성하지 않고 클래스로 바로 접근해서 사용
  • 클래스 내의 모든 객체들이 공유
  • 프로그램이 시작될 때 이미 생성
  • 객체 보다 먼저 생성됨
  • 프로그램이 종료될 때 사라짐
image-20220619014156400 image-20220619014210536

static 멤버 사용

  • 클래스 이름과 함께 도트(.) 연산로 접근
클래스명.static필드
클래스명.static메소드(인수, ….)
  • static 멤버도 멤버이기 때문에 객체를 통해 접근 가능

  • 객체명. static필드

  • 객체명.static메소드(인수, …)

  • 바람직하지 못한 사용

  • 이클립스에서 경고 표시

static의 활용

(1) 객체들 간의 공유 멤버로 활용

  • static 선언된 필드나 메소드는 클래스 내의 각 객체들이 공통으로 사용 가능
  • 모든 객체가 공유

(2) 전역 변수와 전역 함수 만들 때 사용

  • 자바에서는 어떤 변수나 함수(메소드)도 클래스 밖에 존재할 수 없음
  • 모든 변수와 메소드는 클래스의 멤버로 존재 (캡슐화의 원칙)
  • 그러나 응용프로그램 작성 시 클래스가 여러 개 있는 경우
  • 모든 클래스에서 공유할 수 있는 전역 변수와 전역 함수 필요
  • 이런 문제를 해결하기 위해 static 사용

static 메소드 제약

  • static 메소드는 static 멤버만 접근 가능
image-20220619014401524

static 멤버 선언

  • 앞에 static 키워드 사용 (명시적 선언)
static int staticVar;  
: static 필드 

static void staticMethod() {  
  } 
: static 메소드

static 초기화 블록

  • static { }

  • 클래스가 메소드 영역(static 영역)으로 로딩될 때 자동으로 실행되는 블록

  • 클래스 내부에 여러 개가 선언되면 선언된 순서대로 실행

  • static 필드의 복잡한 초기화 작업과 static 메소드 호출 가능

static 블록 사용 시 주의점

  • static 블록 내부에 인스턴스 필드나 인스턴스 메소드 사용 불가

  • 객체 자신을 참조하는 this 사용 불가

  • static 메소드와 static 블록에서 인스턴스 멤버를 사용하고 싶다면 객체를 먼저 생성하고 참조 변수로 접근

image-20220619014642034

싱글톤 (Singleton)

  • 하나의 애플리케이션 내에서 단 하나만 생성되는 객체
  • 객체 중에는 스레드 풀, 캐시, 사용자 설정, 레스트리 설정 등과 하나만 있어도 되는 (또는 하나만 있어야 하는 것) 것들이 있는데
  • 이런 객체의 경우 인스턴스 2개 이상 만들 경우 에러나 또는 자원의 낭비를 야기할 수 있기 때문에
  • 이 경우 싱글톤 패턴 사용

싱글톤을 만드는 방법

  • 외부에서 new 연산자로 생성자를 호출할 수 없도록 private 접근 제한자를 생성자 앞에 붙임

  • 클래스 자신의 타입으로 static 필드 선언

  • 자신의 객체를 생성해서 초기화

  • private 접근 제한자를 붙여 외부에서 필드 값 변경 불가하도록

  • 외부에서 호출할 수 있는 static 메소드인 getInstance() 메소드 선언

  • static 필드에서 참조하고 있는 자신의 객체 리턴

final 필드 (인스턴스 레벨에서의 상수)

  • 최종적인 값을 갖고 있는 필드 (값을 변경할 수 없는 필드)
  • 한 번 초기화되면 수정할 수 없는 필드
  • 각 인스턴스 내에서 변하지 않음
  • 클래스 레벨에서는 통용되지 않음

final 필드의 초기값을 지정하는 방법

  • 필드 선언 시 : 단순히 고정된 값
  • 생성자에서 복잡한 초기화 코드가 필요하거나 객체 생성 시 외부 데이터로 초기화해야 하는 경우
  • 생성자가 매개변수 받아서 초기화시킴

static final : 클래스 레벨에서의 상수

static final int MAX_SUBJECT_SCORE = 100;

인스턴스 레벨에서의 상수

final int PI = 3.14;

final int PRICE = 1000;
profile
No error, No gain

0개의 댓글