[Java의 정석] 제어자(modifier)

younghyun·2022년 10월 10일
0

Java의 정석

목록 보기
12/12
post-thumbnail

제어자란

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

static - 클래스의, 공통적인

  • 클래스변수(static멤버변수): 모든 인스턴스에 공통적으로 사용하는 변수이다.
    • 인스턴스를 생성하지 않고도 사용 가능하다.
    • 클래스가 메모리에 로드될 때 생성된다.
  • static 메서드: 인스턴스를 생성하지 않고도 호출이 가능한 메서드이다.
    • 메서드 내에서 인스턴스멤버들을 직접 사용할 수 없다.
    • 인스턴스 멤버를 사용하지 않는 메서드는 가능한 static메서드로 하는 것이 좋다.

final - 마지막의, 변경될 수 없는

  • final클래스: 변경될 수 없는 클래스. 다른 클래스의 조상이 될 수 없다.
  • final메서드: 변경될 수 없는 메서드. 오버라이딩이 불가능하다.
  • final멤버변수, 지역변수: 값을 변경할 수 없는 상수.

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

class Card {
    // 상수지만 선언과 동시에 초기화하지 않고 생성자에서 초기화할 수 있다. (단 한번만)
    final int NUMBER;
    final String KIND;
    
    // final멤버 변수를 초기화하는 데 필요한 값을 제공하는 생성자
    // 이를 통해 각 인스턴스마다 final멤버 변수가 다른 값을 갖도록 할 수 있다.
    // 이 방법이 아니라면 클래스에 선언된 final멤버 변수는 모두 같은 값을 가져야 한다.
    Card(String kind, int num) {
        KIND = kind;
        NUMBER = num;
    }
}

abstract - 추상의, 미완성의

  • 추상클래스(abstract클래스): 클래스 내에 추상 메서드가 선언되어 있음을 의미한다.
  • abstract 메서드: 선언부만 작성하고 구현부는 작성하지 않은 추상메서드.

접근 제어자(access modifier)

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

  • private: 같은 클래스 내에서만 접근 가능
  • default: 같은 패키지 내에서만 접근 가능
  • protected: 같은 패키지 내에서, 그리고 다른 패키지의 자손 클래스에서 접근 가능
    • 상속을 통해 확장될 것이 예상되는 클래스라면 멤버에 접근 제한을 주되 자손클래스에서 접근하는 것이 가능하도록 하기 위해 protected를 사용한다.
  • public: 접근 제한 없음

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

접근 제어자를 적절히 선택해서 접근 범위를 최소화하도록 노력하자.

생성자의 접근 제어자

  • 생성자에 접근 제어자를 사용함으로써 인스턴스의 생성을 제한할 수 있다.
    • 생성자의 접근 제어자를 private으로 지정하면, 외부에서 인스턴스를 생성할 수 없다.
    • 생성자가 private인 클래스는 다른 클래스의 조상이 될 수 없다. 따라서 클래스 앞에 final을 추가하여 상속할 수 없음을 알리는 것이 좋다.
    public final class Math {
        private Math() {
            // 상수와 static 메서드로만 구성되어 있음
        }
    }

제어자의 조합

  • 클래스: public, (default), final, abstract
  • 메서드: 모든 접근 제어자, final, abstract, static
  • 멤버변수: 모든 접근 제어자, final, static
  • 지역변수: final
profile
🌱 주니어 백엔드 개발자입니당

0개의 댓글