Dico

[Java] 제어자

제어자 Modifier

클래스, 변수, 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여한다.

하나의 대상에 대해서 여러 제어자를 조합하여 사용할 수 있다.

접근 제어자는 한 번에 네 가지 중 하나만 선택해서 사용할 수 있다.

static

클래스의, 공통적인

하나의 변수를 모든 인스턴스가 공유한다.

인스턴스를 생성하지 않고 사용할 수 있다.

  • 멤버변수 :  모든 인스턴스에 공통적으로 사용되는 클래스 변수가 된다. 클래스가 메모리에 로드될 때 생성된다.
  • 메서드 :  static 메서드 내에서는 인스턴스 멤버들을 직접 사용할 수 없다.
  • 초기화 블럭
public class StaticTest {
    static int x;
    static void method() {}
    static {}
}

final

마지막의, 변경될 수 없는

  • 클래스 :  변경될 수 없는, 확장될 수 없는 클래스가 된다. final로 지정된 클래스는 다른 클래스의 조상이 될 수 없다.
  • 메서드 :  변경될 수 없는 메서드가 되어 오버라이딩을 통해 재정의 될 수 없다.
  • 멤버변수 :  값을 변경할 수 없는 상수가 된다. 생성자의 매개변수로 값을 넘겨받아 초기화할 수 있다.
  • 지역변수 :  값을 변경할 수 없는 상수가 된다.
public final class FinalTest {
    final int X;
    StaticTest(int x){
        X = x;
    }
    final void method() {
	final int A;
    }
}

abstract

추상의, 미완성의

  • 클래스 :  클래스 내에 추상 메서드가 선언되어 있음을 알린다.
  • 메서드 :  선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 알린다.
abstract class AbstractTest {
    abstract void method() {};
}

접근 제어자 Access Modifier

멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할.

대상에 따라 사용 가능한 접근 제어자가 다르다.

  • 클래스 :  publicm (default)
  • 멤버변수, 메서드 :  public, protected, (default), private
  • 생성자
제어자같은 클래스같은 패키지자손 클래스전체
public
protected
(default)
private

default는 아무런 접근 제어자도 붙이지 않는 것을 의미.

접근 제어자를 이용한 캡슐화

데이터 감추기 date hiding.

객체지향개념의 캡슐화 Encapsulation

외부로부터 클래스 내부에 선언된 데이터를 보호한다.

내부에서만 사용되는 부분은 감추어 외부에서 불필요하게 접근하지 못하게 한다.

멤버변수 관리

잘못된 값을 지정할 수 없도록 멤버변수를 private이나 protected로 제한하고, 값을 읽고 변경할 수 있는 public 메서드를 제공한다.

  • Getter and Setter

    겟터 Getter :  get멤버변수이름. get으로 시작하여 멤버변수의 값을 읽는 메서드.

    셋터 Setter :  set멤버변수이름. set으로 시작하여 멤버변수의 값을 변경하는 메서드.

public class ModifierTest{
    private int mIv;

    public int getIv(){ return mIv; }
    public void setIv(int mIv){ this.mIv = mIv; }
}

생성자의 접근 제어자

인스턴스의 생성을 제한한다.

생성자를 통해 직접 인스턴스를 생성하지 못하게 하고 public 메서드를 통해 인스턴스에 접근하게 하여 사용할 수 있는 인스턴스의 개수를 제한할 수 있다.

생성자가 private인 클래스는 final을 더 추가하여 상속할 수 없는 클래스라는 것을 알리는 것이 좋다.

public final class ModifierTest{
    private static ModifierTest m = new ModifierTest();

    private ModifierTest() {};

    public static ModifierTest getInstance(){
        return m;
    }
}

제어자의 조합

   대상   사용 가능한 제어자
클래스   public, (defalut), final, abstract
메서드   모든 접근 제어자, final, abstract, static
멤버변수   모든 접근 제어자, final, static
지역변수   final
  • 주의점

     static 메서드는 몸통이 있어야 하므로 abstract와 함께 사용할 수 없다.

     클래스에 abstract와 final을 동시에 사용할 수 없다. abstract(확장) ≠ final(비확장)

     abstract 메서드는 자손 클래스에서 구현해주어야 하므로 접근 제어자가 private일 수 없다.

     private 메서드는 오버라이딩할 수 없으므로 private과 final을 같이 사용할 필요 없다.

참고 서적: 자바의 정석 3판