본문 바로가기

Java

static과 싱글톤

Static

정적(static)은 '고정된'이란 의미를 갖고 잇다.

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

필드와 메소드 선언 시 static 키워드를 추가적으로 붙이면 된다.

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

클래스 로더가 클래스(바이트 코드)를 로딩해서 메소드 메모리 영역에 적재할 때 관리된다. 로딩 끝나면 바로 사용할 수 있음.

정적 필드를 사용하는 이유

1. 항상 값이 변하지 않는 변수인 경우 메모리 할당을 한번만 하여 메모리를 낭비하지 않기 위해

2. 공유하여 사용해야하는 변수인 경우 (보통 이 이유로 많이 사용한다)

정적블록

정적필드는 보통 초기값을 지정해주는데, 초기값 계산이 복잡하면 정적블록을 써서 그 안에 초기 값을 지정해줘도 된다.

public class 클래스명{
	static String name;
	static int cnt;

	//정적블록
	static{
		name = "자바";
		cnt = 5;
	}
}

참고,

  1. 정적멤버는 클래스 객체를 생성하지 않고도 접근할 수 있다. 인스턴스 객체로도 접근이 가능하다.

(단 경고 표시 생김)

2. 정적메소드 및 블록 선언 시 주의사항

객체가 없어도 실행되기 때문에 정적 메소드 및 정적 블록 내부에 인스턴스 필드나 인스턴스 메소드를 사용할 수 없고, this키워드도 쓸 수 없다. (인스턴스 필드 및 메소드는 static이 붙지 않은 클래스 멤버를 말한다.)


싱글톤

전체 프로그램에서 단 하나의 객체만 생성되도록 하는 패턴을 싱글톤 패턴이라 한다.

싱글톤 패턴 예제

  1. 생성자를 private로 선언
  1. 자신을 타입으로 가진 정적필드에 자신의 객체를 생성하여 초기화한다.(private)
  1. 자신의 객체를 리턴해주는 정적메소드를 선언한다.
  1. getInstance()를 통해 해당 객체에 접근한다.

싱글톤 패턴은 객체를 단 한번만 선언해서 사용하게 된다. 자신을 타입으로 가진 정적필드에 자신의 객체를 생성 초기화하면서 private를 준다. 그리고 외부에서 객체를 생성할 수 없게 해야한다. 그래서 생성자도 private을 준다. 하지만 여기에 접근은 해서 값을 쓸 수 있어야 하기 때문에 getInstance()메소드를 만들어둔다.

class Singleton{
	private static singleton = new Singleton(); // 싱글톤 객체를 생성, 하지만 접근 x
	private Singleton(){ //생성자가 private니, 외부에서 new할 수 없다.
	}
	public static Singleton getInstance(){
		return singleton; //싱글톤 패턴으로 만들어진 객체를 받아오기 가능
	}
}

public class Main{
	public static void main(String[] args){
		Singleton st1 = Singleton.getInstance();
		Singleton st2 = Singleton.getInstance();
		System.out.println(st1 ==st2); //true
	}
}

싱글톤은 객체 한 개만 생성해서 사용하는 개념이기 때문에 두 인스턴스가 결국 하나의 객체를 참조하게 된다. 결과값은 true

[참고] 자바기초] 클래스 -2 static 및 싱글톤|작성자 Su

반응형

'Java' 카테고리의 다른 글

예외 : 예외와 예외 클래스  (0) 2021.03.25
어노테이션(Annotation)  (0) 2021.03.11
상속 : 추상 클래스  (0) 2021.03.07
상속 : 타입 변환과 다형성  (0) 2021.03.07
상속 : Protected 접근 제한자  (0) 2021.03.07