IT/JAVA

자바 - static 정적 변수, 싱글톤

트레비라임 2020. 11. 11.

정적멤버와 static

정적(staitc) : '고정된', 정적 멤버는 클래스에 고정된 멤버로 

객체를 생성하지 않고 사용할 수 있는 필드와 메소드를 말한다.

정적 멤버는 객체(인스턴스)에 소속된 멤버가 아니라 클래스에 소속된 멤버이기 때문에 클래스멤버라고 한다.

 

1.정적 멤버선언

public class 클래스{
   //정적필드
   static 타입 필드 [=초기값];
 
   //정적 메소드
   static 리턴 타입 메소드( 매개변수선언 , ...... ) { ... }

}

 

필드를 선언할 때 인스턴스 필드 / 정적 필드 선언 판단기준

  • 객체마다 가지고 있어야 할 데이터 : 인스턴스 필드로 선언 (ex. 객체별로 색깔이 다르다면 색깔은 인스턴스 필드로 선언)
  • 객체마다 가지고 있을 필요성이 없는 공용적인 데이터 : 정적필드로 선언

(ex. Calculator클래스에서 원의 넓이나 둘레를 구할 때 필요한 '파이3.14'는 객체마다 가지고 있을 필요가 없는 변지 않는 공용적인 데이터이므로 정적 필드로 선언하는 것이 좋다.)

public class Calculator{
   String color;                       //계산기별로 색깔이 다를 수 있다.
   static double pi = 3.14159    //계산기에서 사용하는 파이값은 동일하다
}

 

 

메소드를 선언할 때 인스턴스 메소드/ 정적 메소드 선언 판단기준

인스턴스 필드를 이용해서 실행시 : 인스턴스 메소드 

인스턴스 필드를 이용하지 않는다면 : 정적 메소드

ex, Calculator 클래스의 덧셈, 뺄셈 기능은 인스턴스 필드를 이용하기보다는 외부에서 주어진 매개값을 가지고 덧셈과 뺄셈을 수행하므로 정적 메소드로 선언하는 것이 좋다. 그러나 인스턴스 필드인 색깔을 변경하는 메소드느 인스턴스 메소드로 선언해야한다.

public class Calculator{
   String color;                                                  //인스턴스 필드
   void setColor( String color ){ this.color  = color; }  //인스턴스 메소드
   static int plus(int x, int y) { return x + y; }             //정적메소드
   static int minus(int x, int y) { return x - y; }           //정적 메소드

}

 

 

2. 정적 멤버 사용

클래스.필드;
클래스.메소드(매개값, ....)

 

3.정적 초기화 블록

인스턴스 필드는 생성자에서 초기화하지만, 정적 필드는 객체 생성 없이도 사용하야 하므로 생성자에서 초기화 작업을 할 수 없다. 생성자는 객체 생성시에만 실행되기 때문이다.

자바는 정적필드의 복잡한 초기화 작업을 위해서 정적 블록을 제공한다.

정적 블록 형태

정적블록의 특징

  • 정적 블록은 메모리로 로딩될 때 자동적으로 실행된다.
  • 정적 블록은 클래스 내부에 여러개가 선언되어도 상관없다.
  • 클래스가 메모리로 로딩될 때 선언된 순서대로 실행된다.

 

4. 정적메소드와 블록 선언 시 주의할 점

객체가 없어도 실행된다는 특징 때문에, 이들 내부에 인스턴스 필드나 인스턴스 메소드를 사용할 수 없다.

또한 객체 자신의 참조인 this키워드도 사용이 불가능하다.

정적 메소드와 정적 블로에서 인스턴스 멤버를 사용하고 싶다면 다음과 같이 객체를 먼저 생성하고 참조 변수로 접근해야한다.

 

변수 유형 선언 위치 사용 범위 메모리 생성과 소멸
지역 변수
(로컬 변수)
함수 내부에 선언 함수 내부에서만 사용 스택 함수가 호출될 때 생성되고 함수가 끝나면 소멸함
멤버 변수
(인스턴스 변수)
클래스 멤버 변수로 선언 클래스 내부에서 사용하고 private이 아니면 참조 변수로 다른 클래스에서 사용가능 인스턴스가 생성될 때 힙에서 생성되고, 가비지 컬렉터가 메모리를 수거할 떄 소멸됨
static 변수
(클래스 변수)
static 예약어를 사용하여 클래스 내부에 선언 클래스 내부에서 사용하고 private이 아니면 클래스 이름으로 다른 클래스에서 사용 가능 데이터 영역 프로그램이 처음 시작할 때 상수와 함께 데이터 영역에 생성되고 프로그램이 끝나고 메모리를 해제할 때 소멸됨

 

싱글톤(singleton)

단 하나만 생성된다고 해서 이객체를 싱글톤이라고 한다. 싱글톤을 만들려면 클래스 외부에서 new 연산자로 생성자를 호출할 수 없도록 막아야 한다.  (생성자를 호출한 만큼 객체가 생성되기 때문이다.)

생성자 앞에 private접근 제한자를 붙여주면 된다. 

자신의 타입인 정적 필드를 하나 선언하고, 객체를 생성해 초기화 한다.

클래스 내부에서는 new 연산자로 생성자 호출이 가능하다. 정적 필드도 private 접근 제한자를 붙여 외부에서 필드값을 변경하지 못하도록 막는다.

대신 외부에서 호출할 수 있는 getInstance()를 선언하고 정적 필드에서 참고 하고 있는 자신의 객체를 리턴해 준다.

이렇게 함으로써 Singleton 객체를 단 한번만 생성해 놓고 다른 클래스에서 반환을 요구할 떄 항상 같은 놈을 반환 시켜 줄 수 있다.

 

 

 

싱글톤 참고 티스토리

commin.tistory.com/121

'IT > JAVA' 카테고리의 다른 글

자바 - ArrayList  (0) 2020.11.15
자바 - 배열(Array)  (0) 2020.11.14
자바 Date, Calendar 클래스  (0) 2020.11.06
객체지향 - 자바 this, this()의 역할  (0) 2020.11.03
객체지향 - 정보은닉(getter/setter)  (0) 2020.11.03

댓글