public class Calc { 
		private static Calc current; // 
static이 쓰이는 이유
private이 쓰이는 이유
        public static Calc getInstance() {
        // 외부에서 getInstance()로 반환
        if( current ==  null ) {
        // 초기값이 null이므로 최초로 호출된 경우
			current = new Calc();
		} // 객체 선언 1번
		return current;
	}	// 초기값이 null이 아니고
    	// 이미 호출된 경우엔 그대로 반환
        	public static void freeInstance() {
		current = null;
	} // 객체에 null을 대입하면 메모리에서 삭제된다.
current 객체를 private으로 지정하였기 때문에, 객체를 메모리에서 간접적으로 할당하고 삭제하기 위한 메서드가 필요
객체를 메모리에서 제어하기 위해 null 사용
	public class Calc { 
		private static Calc current;
        public static Calc getInstance() {
		if( current ==  null ) {
			current = new Calc();
		}
		return current;
	}
    	public static void freeInstance() {
		current = null;
	}
	private Calc() { } // 싱글톤 객체 생성
기본생성자를 private형태로 정의
예시
public class Calc {
	// ------싱글톤 객체를 생성하기 위한 준비 시작 -------------
	private static Calc current;
	public static Calc getInstance() {
		if( current ==  null ) {
			current = new Calc();
		}
		return current;
	}
	public static void freeInstance() {
		current = null;
	}
	private Calc() { }	
	// ----------싱글톤 객체를 생성하기 위한 준비 끝 ----------
    // ----------이 객체가 구현해야하는 기능 -----------------	
	public int plus(int x, int y) {
		return x + y;
	}
	public int minus(int x, int y) {
		return x - y;
public class Main01 {
	public static void main(String[] args) {
		Calc c1 = Calc.getInstance();
		System.out.println( c1.plus(20, 10) );    
		
		// 참조처리를 생략하고 직접 사용하는 경우
		System.out.println( Calc.getInstance().minus(20, 10) );
	}
}
// 결과 : 30,10