Java의 기본 개념 중 private에 대해 알아보자.
private을 활용하면, class 내부에서는 사용 가능하지만 외부에서는 접근이 불가능하다.
private 변수는 setter, getter를 통해 외부에서 접근이 가능하다.
class Tiger {
private int num = 10; //class 내부에서는 사용 가능, 외부에서는 접근 불가
public int getNum() {
return num;
}
public void setNum(int num) {
//확장 코드를 추가할 수 있다.
if(num<0) {
System.out.println("음수는 설정할 수 없습니다.");
return;
}
this.num = num;
}
}
public class hello {
public static void main(String[] args) {
Tiger t = new Tiger();
// System.out.println(t.num); //외부에 노출 되는 것은 바람직하지 않다.
t.setNum(20);
System.out.println(t.getNum());
}
}
싱글톤 패턴의 특성상, 각 class마다 객체를 1개씩만 생성할 수 있다.
이를 private을 활용하여 구현해보자.
만약 다음과 같은 코드가 있다면,
Tiger t1 = new Tiger();
Tiger t2 = new Tiger();
객체가 2개이므로 싱글톤 패턴이 적용되었다고 할 수 없다.
그러면 어떻게 딱 1개의 객체만 만들 수 있을까?
.
.
앞서 언급했던 static을 활용하면 가능하다 !
class 안에 static으로 객체를 null 상태로 하나 생성해두고, 이 객체가 null이라면 더이상 객체를 만들지 않는 것이다. 다음의 코드를 살펴보자.
class Tiger {
static Tiger t = null; //멤버 변수 , static안에서 사용하기 위해 static 추가
// 객체를 생성시키지 못하게 하는 방법
private Tiger() {}
static Tiger getInstance() { //static을 활용하면 외부에서 호출 가능
if(t == null)
t = new Tiger(); //멤버 내에서는 객체 생성 가능
return t;
}
}
public class hello {
public static void main(String[] args) {
Tiger t1 = Tiger.getInstance();
Tiger t2 = Tiger.getInstance();
Tiger t3 = Tiger.getInstance();
System.out.println(t1.hashCode());
System.out.println(t2.hashCode());
System.out.println(t3.hashCode());
//모두 같은 hashCode -> 같은 객체이다
}
}
위의 코드에서 t1, t2, t3의 hashcode를 확인해보면 모두 같은 결과가 나와, 3개의 객체가 모두 같음을 알수 있다.