: 기존 환경 내에서 반복적으로 일어나는 문제들을 어떻게 풀어날갈 것인가에 대한 일종의 솔루션
package singleton;
public class Calc {
public int plus(int x, int y) {
return x+y;
}
public int minus(int x, int y) {
return x-y;
}
public int times(int x, int y) {
return x*y;
}
public int divide(int x, int y) {
return x/y;
}
}
package singleton;
public class Main01 {
public static void main(String[] args) {
Calc c1 = new Calc();
int a = c1.plus(100, 200);
System.out.println(a);
//Calc c2 = new Calc();
int b = c1.minus(200, 100);
System.out.println(b);
}
}
package singleton;
public class Calc2 {
// 공통 기능을 포함할 클래스 안에 스스로의 객체를 static 선언
// static이 적용된 자원은 메모리의 고정 영역에 생성되기 때문에,
// 클래스 자체의 객체나 그 안에 포함된 멤버변수, 메모리상에서 구별됨
// 그러므로 Calc2 클래스 안에 static 형태로 Calc2 클래스의 객체를 정의하더라도,
// 코드 상의 논리적인 연관관계를 위해 하나의 클래스 파일에 정의하는 것일 뿐,
// 실제로는 Calc 클래스 자체에서 독립된 객체가 되는 것
// Calc2 클래스 이외의 여러 곳에서 new 연산자를 사용하여 객체 할당이 가능하다면,
// SingleTon이라는 개념 자체가 성립되지 않으므로,
// 외부에서 이 객체에 직접적인 접근을 못하도록 은닉시킴
private static Calc2 current;
// current 객체를 private으로 지정하였기 때문에 객체를 메모리에서 간접적으로 할당하고 삭제하기 위한 메서드가 필요
// 객체가 할당되지 않은 경우에만 할당하도록 하여 중복 할당을 방지
public static Calc2 getInstance() {
if(current == null) {
current = new Calc2();
}
return current;
}
// new 연산자를 사용한 객체 할당 금지
// 기본 생성자를 private 형태로 정의하는 객체 생성자가 은닉 처리되어 외부에서 new 연산자를 사용한 객체 할당이 금지
private Calc2() {
super();
}
// 객체에 null을 대입하면 메모리에서 삭제+
public static void freeInstance() {
current = null;
}
public int plus(int x, int y) {
return x+y;
}
public int minus(int x, int y) {
return x-y;
}
public int times(int x, int y) {
return x*y;
}
public int divide(int x, int y) {
return x/y;
}
}
package singleton;
public class Main02 {
public static void main(String[] args) {
Calc c2 = new Calc();
int b = c2.minus(200, 100);
System.out.println(b);
}
}
package singleton;
public class Main03 {
public static void main(String[] args) {
// 싱글톤 객체 사용하기
// - getInstance() 메서드를 사용하여 객체를 리턴 받는 형식으로 사용
// - 여떤 객체를 리턴 받더라도 모두 하나의 static 객체를 참조하게 되기 때문에 전역 객체 하나만이 메모리를 할당되게 함
Calc2 c = Calc2.getInstance();
Calc2 c2 = Calc2.getInstance();
Calc2 c3 = Calc2.getInstance();
Calc2 c4 = Calc2.getInstance();
System.out.println(c.plus(100, 2000));
System.out.println(c2.plus(100, 2000));
System.out.println(c3.plus(100, 2000));
System.out.println(c4.plus(100, 2000));
}
}
package study.java.helper;
// 기본적인 공통 기능들을 묶어놓은 클래스
public class Util {
// --- 싱글톤 객체 생성 시작 ---
private static Util current;
public static Util getInstance() {
if(current == null) {
current = new Util();
}
return current;
}
public static void freeInstance () {
current = null;
}
private Util() {
}
// --- 싱글톤 객체 생성 끝 ---
// 범위를 갖는 랜덤값을 생성하여 리턴하는 메서드
// @param min - 범위 안에서의 최소값
// @param max - 범위 안에서의 최대값
// @return - min~max 안에서의 랜덤값
public static int random (int min, int max) {
int num = (int)((Math.random() * (max - min + 1)) + min);
return num; }
}