제어자(Modifier) - 정의

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

  • 클래스나 멤버변수와 메서드에 주로 사용

  • 하나의 대상에 대해 여러 제어자를 조합해서 사용 가능

    • 단, 접근 제어자는 한가지만 선택할 수 있음
  • 제어자 순서는 무관하지만, 접근제어자를 가장 왼쪽에 놓는 경향이 있음



제어자 - 종류

  • 접근 제어자

    • public, protected, default, private
  • 그 외의 제어자

    • static, final, abstract, native, trnsient, synchronized, strictftp, volatile



[자주 쓰는 제어자] static - 클래스의, 공통적인

  • 사용될 수 있는 곳

    • 멤버변수, 메서드, 초기화 블럭
  • static이 붙으면

    • 인스턴스가 아닌 클래스에 관계된 것으로 인스턴스를 생성하지 않아도 사용 가능

    • 인스턴스 멤버를 사용하지 않는 메서드는 static을 붙여서 static 메서드로 선언하는 것을 고려

    • 가능하면 static으로 하는 것이 인스턴스를 생성하지 않고 호출이 가능하기 때문에 더 편하고 빠름

대상 의미
static 멤버변수 - 모든 인스턴스에 공통으로 사용되는 클래스 변수
- 인스턴스를 생성하지 않고도 사용 가능
- 클래스가 메모리에 로드될 때 생성
static 메서드 - 인스턴스를 생성하지 않고도 호출 가능
- 인스턴스멤버들을 직접 사용할 수 없음



[자주 쓰는 제어자] final - 마지막의, 변경될 수 없는

  • 사용될 수 있는 곳

    • 클래스, 메서드, 멤버변수, 지역 변수
  • final이 붙으면

    • 변수 : 값을 변경할 수 없는 상수가 됨

    • 메서드 : 오버라이딩을 할 수 없음

    • 클래스 : 자신을 확장하는 자식클래스를 만들 수 없음
      예) string, math

대상 의미
final 클래스 - (변경될)확장할 수 없는 클래스 (자식클래스를 만들 수 없음 - 상속불가)
final 메소드 - 변경될 수 없는 메서드
- 오버라이딩을 통해 재정의 불가
final 멤버/지역 변수 - 값을 변경할 수 없는 상수
  • final멤버변수의 초기화

    • final이 붙은 변수 = 상수

    • 인스턴스변수의 경우 생성자에서 초기화되도록 할 수 있어서 각 인스턴스마다 final이 붙은 멤버변수가 다른 값을 갖도록 하는 것이 가능

      방법) 클래스 내에 매개변수를 갖는 생성자를 선언
      → 인스턴스를 생성할 때 final이 붙은 멤버변수를 초기화하는데 필요한 값을 생성자의 매개변수로부터 제공



[자주 쓰는 제어자] abstract - 추상의, 미완성의

  • 사용될 수 있는 곳

    • 클래스, 메서드
  • abstract가 붙으면

    • 클래스 : 인스턴스 생성 불가, 클래스 내에 추상메서드가 있음 표시
      (간혹 이용) 추상메서드가 없는데 붙일 경우 → 인스턴스를 생성할 수 없음

    • 메서드 : 메서드의 선언부만 작성하고 실제 내용은 수행하지 않는 추상 메서드

대상 의미
abstract 클래스 - 추상클래스
- 클래스 내에 추상 메서드가 선언되어 있음
- 인스턴스를 생성하지 못하게 막은 클래스
abstract 메서드 - 추상메서드
- 선언부만 작성하고 구현부는 작성하지 않은 메서드



접근제어자

  • 외부에서 접근하지 못하도록 제한하는 역할

  • 사용 이유

    • 외부로부터 데이터를 보호하기 위해서

    • 외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위해서 → 캡슐화

  • 사용될 수 있는 곳

    • 클래스, 멤버변수, 메서드, 생성자
  • 접근 범위

제어자 같은 클래스 같은 패키지 자식 클래스 전체
public O O O O
protected O O O  
(default)
아무것도 명시 안할 때
O O    
private O      
  • 사용 대상
대상 사용가능한 접근 제어자
클래스 public, (default)
메서드
멤버변수
public, protected, (default), private
지역변수 X



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

  • 데이터 감추기(data hiding) → 객체지향개념의 캡슐화(encapsulation)

    • 데이터가 유효한 값을 유지하도록, 또는 비밀번호와 같은 데이터를 외부에서 함부로 변경하지 못하도록 외부로부터의 접근을 제한

    • 클래스 내에서만 사용하는, 내부 작업을 위해 임시로 사용되는 멤버변수 또는 부분 작업을 처리하기 위한 메서드 등의 멤버를 클래스 내부로 감춤

    • 외부에서 접근할 필요가 없는 멤버들을 private로 지정 → 복잡성 ↓

  • 보통 메서드 이름 (암묵적인 룰)

    • 캡슐화되면 멤버변수를 private 등으로 변경하고, 외부에서 접근은 메서드를 통해 진행

    • getter(게터) / get(멤버변수이름) / 멤버변수의 값을 읽는 메서드

    • setter(세터) / set(멤버변수이름) / 멤버변수의 값을 변경



생성자의 접근 제어자

  • 보통 클래스의 접근 제어자와 같지만 다르게 지정할 수도 있음

  • 인스턴스 생성을 제한할 수 있음

  • 생성자가 private인 클래스

    • Singleton 패턴 적용 가능
      : private static한 인스턴스 참조변수를 생성하고 (static하니까 1회 생성)
      그 인스턴스를 반환해주는 public static 메서드를 제공할 수 있음

    • 다른 클래스의 부모클래스가 될 수 없음(상속 불가)
      : 자식클래스에서 상속시 생성자를 호출해야하는데, 생성자가 private이면 접근이 불가능하기 때문
      → 클래스 앞에 final을 추가해서 상속 불가인 것을 알리는 것이 좋음



제어자(modifier)의 조합시 주의사항

  • 메서드에 static과 abstract를 함께 사용할 수 없음

    • static 메서드는 내용이 있는 메서드만 가능
  • 클래스에 abstract와 final을 동시에 사용할 수 없음

    • final - 확장(상속) 불가

    • abstract - 확장(상속)을 통해 완성

  • abstract 메서드는 접근 제어자가 priavte일 수 없음

    • abstract 메서드 - 자식클래스에서 구현해야 하기 때문
  • 메서드에 private와 final을 같이 사용할 필요는 없음

    • 접근제어자가 priavte인 메서드는 오버라이딩 불가하기때문에, 하나만 써도 됨