#1. 생성자의 접근 제어자
생성자에 접근 제어자를 사용하면서 인스턴스의 생성을 제한할 수 있습니다.
보통 생성자의 접근 제어자는 클래스의 접근제어자와 같습니다만 다르게도 지정할 수도 있습니다.
생성자의 접근 제어자를 private으로 지정한다면 외부에서 생성자에 접근할수 없게
// *private은 같은 클래스에서만 접근이 가능.
되므로 인스턴스를 생성할 수 없게 됩니다. 그래도 private의 특성상 클래스 내부에
서는 인스턴스의 생성이 가능합니다.
ex)
1 2 3 4 5 6 7 | class Singleton{ private Singleton(){ // } // ... } | cs |
위의 이미지는 클래스 Singleton의 생성자를 private 제어자를 붙임으로써 외부의 접근을 차단하여줍니다.
private으로 외부의 접근을 막는 대신에 클래스 내부에서 대신에 인스턴스를 생성해
서 반환해주는 public 메서드를 제공함으로써 외부에서 이 클래스의 인스턴스를 사
용할 수 있게 해줄수 있습니다. 대신에 이 메서드는 인스턴스가 생성하지 않고도 호
출하기 위하여 static을 반드시 붙여주어야합니다.
ex)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class Singleton{ // ... private static Singleton s = new Singleton(); private Singleton(){ //... } public static Singleton getInstance(){ return s; } //... } | cs |
위의 코드처럼 생성자를 통해 직접 인스턴스를 생성하지 못하게 하고 public 메서드
를 이용해 인스턴스에 접근하게 함으로써 사용할 수 있는 인스턴스의 개수를 제한
할 수 있다.
또한, 생성자가 private인 클래스는 다른 클래스의 조상이 될 수 없다. 이유는 자손
클래스의 인스턴스를 생성할 때에 조상클래스의 생성자를 호출해야만 하는데, 생성
자의 접근제어자가 private이므로 자손클래스에서 호출하는 것이 불가능하기 때문
이다.(private은 자신 클래스안에서만 호출이 가능하므로)
그러므로 클래스 앞에 final을 추가시켜줌으로써 상속할 수 없는 클래스인 것을 미리
알려주는 것이 좋다.
우리가 흔히쓰는 Math.random() 이 있는 클래스인 Math클래스는 몇 개의 상수와
static 메서드만으로 구성되어 있기 때문에 인스턴스를 생성할 필요가 없다.
그래서 외부로부터의 불필요한 접근을 막기위하여 생성자의 접근 제어자를 private
으로 지정하였다.
ex,내용정리예제)
1 2 3 4 5 6 7 8 | public final class Math{ private Math(){ //... } } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | final class Singleton{ // 클래스앞에 final을 붙여서 더 추가하여 상속할 수 없는 클래스라는 것을 알렸다. private static Singleton s = new Singleton(); private Singleton(){ } public static Singleton getInstance(){ if(s==null){ s = new Singleton(); } return s; } } class SingletonTest{ public static void main(String[] args){ // Singleton s = new Singleton(); < -- private이 접근제어자로 있음에도 불구하고 Singleton 인스턴스를 생성하려했으므로 에러가 발생한다. Singleton s1 = Singleton.getInstance(); // 반면 이 호출은 static으로 되어있는 getInstance를 호출하므로 올바른 접근이다. } } | cs |
#2.제어자의 조합
제어자가 사용될 수 있는 대상을 중심으로 제어자를 정리하였다.
제어자의 개념을 다시 복습하여보자.
ex) 대상 : 사용가능한 제어자
클래스 : public , (default), final, abstract
메서드 : 모든 접근 제어자(private,protected,public), final, abstract, static
멤버변수 : 모든 접근 제어자, final , static
지역변수 : final
제어자 조합의 주의사항
- 메서드는 static과 abstract를 같이 사용할 수 없다.
(static 메서드는 몸통이 있는 실체인 메서드에만 사용할 수 있기 때문이다.)
- 클래스에 abstract와 final를 같이 사용할 수 없다.
(클래스에 사용되는 final은 클래스를 확장(상속)할 수 없다는 의미이며 abstract는
상속을 통하여 완성되어야한다는 의미이므로 서로 모순이 된다.)
- abstract 메서드의 접근 제어자가 private일 수는 없다.
(abstract메서드는 자손클래스에서 구현해주어야하는데 접근 제어자가 private이라
면 자손클래스가 접근이 불가능하기 때문이다.)
-메서드에 private과 final을 같이 사용할 필요는 없다.
(접근 제어자가 private인 메서드는 오버라이딩될 수 없기 때문이다. 이 둘 중
하나만 사용해도 의미가 충분하다.)
'Development > Java' 카테고리의 다른 글
(JAVA)참조변수 형변환과 instanceof 연산자 (0) | 2016.03.16 |
---|---|
(JAVA)다형성의 개념 (0) | 2016.03.16 |