package com.java1.day16;
/*생성자의 접근제어자*/
//생성자에 접근제어자를 사용함으로써 인스턴스의 생성을 제한할 수 있다.
public class SingletonTestEx05 {
//static int a = 0;
public static void main(String[] args) {
// Singleton s = new Singleton();// 에러!!! Singleton() has private access in Singleton
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance(); // 인스턴스 객체가 생성 되는게 아니다.
// a = 1;
System.out.println(s1.hashCode()); //hashCode()는 주소를 반환해 준다.
System.out.println(s2.hashCode()); //s1과 s2 의 주소가 같은 주소를 출력함을 자세히 보자..(같은 객체라는 뜻이다.)
}
}
class Singleton {
private static Singleton instance; //private 이므로 직접 접근은 할수 없다.
private Singleton() { //생성자의 접근제어자를 private으로 지정하면
//외부에서 생성자에 접근 할수 없으므로
} //인스턴스를 생성 할수 없다.
//그러나 클래스 내부에서는 생성 할수 있다.
// 인스턴스를 생성하지 않고도 호출할 수 있어야 하므로 static이어야 한다.
public static Singleton getInstance() { //인스턴스를 반환//static 매서드 안에는 클래스 맴버 변수를 쓸수있고//인스턴스 변수는 사용할수 없다.
if(instance == null) //생성되어진 인스턴스가 없다면 인스턴스를 생성하자
instance = new Singleton(); //외부 에서는 new 를 사용해서 생성을 할수 없지만 내부에서는 가능하다.
return instance; //생성된 인스턴스가 있으면 새로 만들지 말고 기존의 인스턴스를 리턴해주자!
} //공통의 업무 로직을 사용할때는 static 매서드를 사용한다. 그러나 static 변수는 가급적 사용하지 않도록 한다.
}
/* 제어자의 조합 */
/* 클래스가 사용할수 있는 제어자 (protected 와 private 사용 불가)
- public, (default), final(상속 불가), abstract */
/* 매서드가 사용할수 있는 제어자
- 모든 접근 제어자, final(오버라이딩 불가), static, abstract */
/* 맴버 변수가 사용할수 있는 제어자
- 모든 접근 제어자, final, static */
//지역 변수가 사용할수 있는 제어자 - final
474675244
474675244