본문 바로가기
Programing/JAVA (& 혼공자Java)

자바(Java) - 인스턴스 멤버와 정적 멤버3 (싱글톤 & final필드, 상수)

by a.k.a DUKI 2020. 10. 16.
728x90
반응형

싱글톤(Singleton)

전체 프로그램에서 단 하나의 객체만 만들도록 보장하는 코딩 기법이다.

 

싱글톤 작성 방법

  • 클래스 외부에서 new연산자를 통해 생성자 호출하는 것을 불가하도록 private 접근 제한자를 붙여서 사용한다.
  • 자신의 타입인 정적 필드 선언 후 자신의 객체 생성해 초기화한다
  • 외부에서 호출할 수 있는 getInstance()를 선언하고 정적 필드에서 참조하고 있는 자신의 객체를 린턴한다.
public class 클래스{
	//정적 필드
    private static 클래스 singleton = new 클래스();
    
    //생성자
    private 클래스(){ }
    
    //정적 메소드
    static 클래스 getInstance() {
    	return singleton;
    }
}    

혼공자 유툽 참고

외부에서 객체를 얻는 유일한 방법은 getInstance() 메소드를 호출하는 방법이다.

getInstance() 메소드는 단 하나의 객체만 리턴하기 때문에 아래 코드에서 변수1과 변수2는 동일한 객체를 참조한다.

클래스 변수1 = 클래스.getInstance();
클래스 변수2 = 클래스.getInstance();

 

예시1) Calculator클래스

public class Singleton {
	//정적 필드
	private static Singleton singleton = new Singleton();
	
	//생성자
	private Singleton() {}
	
	
	//정적 메소드
	static Singleton getInstance() {
		return singleton;
	}
}

 

public class SingletonEx {

	public static void main(String[] args) {
		
		/*
		//아래처럼 하면 컴파일 에러 생김
		Singleton obj1 = new Singleton();
		Singleton obj2 = new Singleton();
		*/
		
		Singleton obj1 = Singleton.getInstance();
		Singleton obj2 = Singleton.getInstance();
		
		if(obj1 == obj2) {
			System.out.println("같은 Singleton 객체");
		}else {
			System.out.println("다른 Singleton 객체");
		}
	}

}

 

 

final 필드와 상수

final필드는 초기값이 저장되면 최종값이 되어 프로그램 실행 도중에 수정할 수 없다.

 

싱글톤 작성 방법

  • 단순 값일 경우 필드 선언 시 초기화한다. (주로 정적 필드(상수)일 경우)
  • 객체 생성 시 외부 데이터로 초기화가 필요한 경우 생성자에서 초기화 한다. (주로 인스턴스 필드인 경우)

 

인스턴스 final 필드

객체에 한번 초기화된 데이터를 변경 불가로 만들 경우 (ex. 주민번호)

final 타입 필드 [=초기값];
final String ssn; //생성자에서 초기화

 

정적 final 필드 (관례적으로 모두 대문자로 작성한다.)

일반적으로 불변의 값을 상수(static final)라 부른다. 불변의 값을 저장하는 필드를 자바에서는 상수(constant)라고 한다.

불변의 값인 상수를 만들 경우 (ex. PI, 지구의 무게, 지구의 둘레)

static final 타입 상수 = 초기값;

static final double PI = 3.14159;
static final double EARTH_RADIUS = 6400;
static final double EARTH_AREA = 4 * Math.PI * EARTH_RADIUS * EARTH_RADIUS;

 

 

final 필드를 상수라고 부르지 않는다!

불변의 값은 객체마다 저장할 필요가 없는 공용성을 띄며, 여러가지 값으로 초기화될 수 없기 때문이다.

final필드는 객체마다 저장되고, 생성자의 매개값을 통해서 여러 가지 값을 가질 수 있기 때문에 상수가 될 수 없다.

 

상수는 static이면서 final이어야한다.

static final 필드는 객체마다 존재하지 않고 클래스에만 존재한다. 

 

예시2) 상수 선언 & 사용

public class Earth {
	static final double EARTH_RADIUS = 6400;
	static final double EARTH_AREA = 4 * Math.PI * EARTH_RADIUS * EARTH_RADIUS;
	//Math는 자바 표준 클래스이며,  PI는 static필드 (static final로 선언되어있다)
}
public class EarthEx {

	public static void main(String[] args) {
		System.out.println("지구의 반지름: " +Earth.EARTH_RADIUS + " km");
		System.out.println("지구의 표면적: " +Earth.EARTH_AREA + " km^2");
		
	}

}

 

 

 

 


※용어 정리

  • 싱글톤: 전체 프로그램에서 단 하나의 객체만 만들도록 보장해야하는 경우에 사용하는 객체의 이름.

  • final 필드: 초기값이 저장되면 이것이 최종적인 값이 되어 프로그램 실행도중에 수정할 수 없는 필드.  final 로 사용

  • 상수: 수학에서 사용되는 원주율 파이나 지구의 무게 및 둘레 같은 불변의 값을 저장하는 필드. final static으로 사용

 

본 내용은 #혼자공부하는자바 책을 참고해 공부하려 작성했습니다.

 

728x90
반응형

댓글