공부했던 자료 정리하는 용도입니다.

재배포, 수정하지 마세요.

 

 

 

 

 

제어자(Modifier)

접근제어자 : public, protected, default, private
그 외의 제어자 : static, final, abstract, native, transient, synchronized, volatile, strictfp

 제어자는 클래스나 변수, 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여한다. 제어자는 클래스나 멤버 변수, 메서드에 주로 사용되며 하나의 대상에 대해 여러 제어자를 조합하여 사용하는 것이 가능하다. 단, 접근제어자는 위의 표에 있는 4개 중 1개만 사용할 수 있다.

 

 

static

 

 static 이 붙은 것들은 모든 인스턴스에서 공통적으로 사용할 수 있게 된다. 인스턴스 메서드와  static 메서드의 차이는 메서드 내에서 인스턴스 멤버를 사용하는가의 여부에 있다. 인스턴스 멤버를 사용하지 않는 메서드는  static 를 붙여서  static 메서드로 만드는 것을 고려해봐야 한다. 인스턴스를 생성하지 않고도 호출이 가능해서 더 편리하고 속도도 빠르기 때문이다. 

 

 

 

final

 

 final 은 클래스나 메서드, 멤버 변수, 지역변수에 사용할 수 있다. 변수에 사용되면 값을 변경할 수 없는 상수가 되며 메서드에 사용되면 오버라이딩을 할 수 없게 되고 클래스에 사용되면 자신을 확장하는 자식 클래스를 정의하지 못하게 된다. 

 

 

  ■ 생성자를 이용한 final 멤버 변수의 초기화

   final 이 붙은 변수는 상수라서 선언과 동시에 초기화를 하는 경우가 대부분이지만, 인스턴스 변수의 경우 생성자에서 초기화되도록 할 수 있다. 클래스 내에 매개변수를 갖는 생성자를 선언하여, 인스턴스를 생성할 때  final 이 붙은 멤버 변수를 초기화하는데 필요한 값을 생성자의 매개변수로 제공받는 것이다. 이 기능을 이용하면 각 인스턴스마다  final 이 붙은 멤버 변수가 다른 값을 갖도록 하는 것이 가능하다.

 

 

 

abstract

  abstract 는 클래스나 메서드에 사용될 수 있다. 메서드의 선언부만 작성하고 실제 수행 내용은 구현하지 않는 추상 메서드를 선언할 때  abstract 를 사용한다. 추상 클래스는 아직 완성되지 않는 메서드가 존재하므로 인스턴스를 생성할 수 없다. 추상클래스는 혼자서는 아무것도 할 수 없지만 다른 클래스가 이 클래스를 상속받는 경우에 일부 원하는 메서드만 오버라이딩해도 된다는 장점이 있다.

 

 

 

접근제어자(Access Modifier)

 

대상에 따라 사용할 수 있는 접근제어자

 접근제어자는 멤버 또는 클래스에 사용되어 해당하는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한한다. 접근 제어자가  default 임을 알리기 위해 실제로  default 를 붙이지는 않지만 클래스나 멤버 변수, 메서드, 생성자에 특정한 접근제어자가 지정되어있지 않다면 기본적으로  default 가 된다. 

 

 

접근제어자가 사용될 수 있는 곳 : 클래스, 멤버 변수, 메서드, 생성자

public : 접근 제한이 없음
protected : 같은 패키지 안이거나, 다른패키지의 자식 클래스일때 접근이 가능하다
default : 같은패키지 내에서만 접근이 가능하다.
privcate : 같은 클래스 내에서만 접근이 가능하다.

 

 

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

  접근제어자를 사용하는 이유는 클래스 내부에 선언된 데이터가 외부에서 함부로 변경되지 못하게 해서 데이터가 유효한 값을 유지하도록 하는 것이다. 이것을 데이터 감추기(data hiding)라고 하며, 객체지향의 캡슐화(encapsulation)에 해당하는 내용이다. 또 다른 이유 역시 캡슐화에 해당하는 내용이다. 클래스 내에서 내부 작업을 위해 임시로 사용되는 멤버 변수나 부분 작업을 처리하기 위한 메서드 등의 멤버들을 클래스 내부에 감추기 위해서이다. 외부에서 접근할 필요가 없는 멤버들을  private 으로 지정하여 외부에 노출시키지 않음으로써 복잡성을 줄일 수 있다. 

 

  접근제어자를 이용하면 코드를 테스트할 때도 유용하다. 접근제어자가  public 이라면 테스트해야 하는 변경 범위가 넓지만  default 라면 패키지 내부만 확인하면 되고  private 이면 클래스 하나만 확인하면 된다.

 

 

  ■ 생성자의 접근 제어자

  생성자에 접근 제어자를 사용함으로써 인스턴스의 생성을 제한할 수 있다. 보통 생성자의 접근제어자는 클래스의 접근제어자와 같지만 다르게 지정할 수도 있다. 생성자가  private 인 클래스는 다른 클래스의 부모가 될 수 없다. 자식 클래스의 인스턴스를 생성할 때 부모 클래스의 생성자를 호출해야 하는데  private 이므로 호출할 수 없기 때문이다. 이런 경우에는 클래스 앞에  final 을 더 추가해서 상속할 수 없는 클래스라는 것을 알리는 것이 좋다. 

ex) 생성자의 접근제어자를  private 으로 지정하는 대신 인스턴스를 생성해서 반환해주는  public 메서드를 제공하면 외부에서 직접적으로 인스턴스를 생성할 수는 없고 사용만 가능하게 된다.(메서드는  public 인 동시에  static 이어야 한다.) 이처럼 생성자에 접근제어를 걸어두면 사용할 수 있는 인스턴스의 개수를 제한할 수 있다!

 

 

 

제어자(Modifier)의 조합과 주의사항

 

대상에 따라 사용할 수 있는 제어자

위의 내용을 최종적으로 정리한 표이다.

 

제어자를 조합해서 사용할 때 주의해야 할 점

  1. 메서드에  static  abstract 를 함께 사용할 수 없다.
    static 메서드는 몸통이 있는 메서드에만 사용할 수 있다.

  2. 클래스에  abstract  final 을 동시에 사용할 수 없다.
    abstract 메서드는 상속되어서 완성되어야 하는데 final이 붙은 클래스는 상속받을 수 없기 때문이다.
     

  3.  abstract 메서드의 접근 제어자가  private 일 수 없다.
    마찬가지로 abstract메서드는 자식 클래스에서 구현해주어야 하는데 private이면 자식 클래스에서 접근할 수 없기 때문이다.

  4. 메서드에  private  final 을 같이 사용할 필요는 없다.
    접근제어자가 private인 메서드는 오버라이딩 될 수 없기 때문이다. 하나만 써도 충분하다.

 

 

 

+ Recent posts