제어자(Modifier)

  • 접근제어자 : public, protected, default, private

  • 그 외 : static ,abstract, final, ..

접근제어자는 한번에 하나만 쓸 수 있으며 그 외에는 조합하여 사용할 수 있다.

  • 접근 제어자 (Access Modifier)

    외부에서 접근하지 못하도록 제한하는 역할을 하며 접근자가 지정되어 있지 않다면 접근 제어자는 default가 된다

    public : 접근제한 X
    protected : 같은 패키지 내에서 접근, 다른 패키지의 자손 클래스에서 접근 가능
    default : 같은 패키지 내에서만 접근
    private : 같은 클래스 내에서만 접근

    하나의 .java 파일에서는 public 클래스가 단 하나만 존재할 수 있으며 파일의 이름은 반드시 public 클래스명과 같아야함

    • 접근 제어자를 이용한 캡슐화 (Encapsulation)

      • 외부로부터 데이터를 보호하기 위해서
      • 외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위해서

      메서드 하나를 변경해야 한다면 이 메서드의 접근제한자가 public일 경우 메서드 변경후 오류가 없는지 확인해야 할 범위가 넓지만 default일 경우 같은 패키지내만 확인하면 되고, private일 경우 클래스 내부만 확인해보면 된다. 이와 같은 이유로 접근 범위를 최소화하도록 노력하는것이 좋음

    • 생성자의 접근 제어자

      보통 생성자의 접근 제어자는 클래스의 접근 제어자와 같지만 접근제어자를 사용함으로써 인스턴스의 생성을 제한 할 수 있다.
      생성자의 접근 제어자를 private으로 지정, 외부에서 생성자에 접근할 수 없으므로 인스턴스를 생성할 수 없게 됨, 대신 인스턴스를 생성후 반환하는 public 메서드를 제공함으로써 외부에서 이 클래스의 인스턴스를 사용할 수 있음

        class Singleton{
            private static Singleton s = new Singleton();
            private Singleton (){}
            // 인스턴스를 생성하지 않고도 호출해야함
            // public인 동시에 static이어야 한다
            public static singleton getInstance(){
                return s;
            }
        }

      생성자가 private인 클래스는 다른 클래스의 조상이 될 수 없음, 자손 클래스의 인스턴스를 생성할 때 조상클래스의 생성자를 호출해야 하는데 생성자의 접근 제어자가 private이므로 자손클래스에서 호출하는것이 불가능 함
      그래서 클래스 선언 앞에 final을 추가하여 상속이 불가한 클래스라는것을 명시하는게 좋음

  • 그 외 제어자

    • static (클래스의, 공통적인)

      • 사용 범위 : 멤버변수, 메서드, 초기화 블럭
      • 맴버변수

        모든 인스턴스에 공통적으로 사용되는 클래스 변수
        클래스 변수는 인스턴스를 생성하지 않고도 사용 가능
        클래스가 메모리에 로드될 때 생성됨

      • 메서드

        인스턴스를 사용하지 않고도 호출이 가능한 메서드
        static 메서드 내에서는 인스턴스 맴버들을 직접 사용할 수 없음

        • 인스턴스 메서드와 static 메서드의 근본적인 차이는 매서드 내에서 인스턴스 맴버를 사용하는가의 여부

      인스턴스를 생성하지 않고도 호출이 가능하여 더 편리하고 속도도 빠르기 때문에 인스턴스 맴버를 사용하지 않는 메서드는 static 선언을 고려해보도록

    • final (마지막의, 변경될 수 없는)

      • 사용 범위 : 클래스, 메서드, 맴버변수, 지역변수

      • 클래스 : 변경될 수 없는 클래스, 자손을 가질 수 없음 (조상이 될 수 없음)
      • 메서드 : 오버라이딩으로 재정의 될 수 없음
      • 맴버변수, 지역변수 : 값을 변경할 수 없는 상수
      • 생성자를 이용한 final 맴버 변수의 초기화

        일반적으로 final이 붙은 상수는 선언과 동시에 초기화 해야하지만
        인스턴스 변수의 경우 생성자에서 초기화가 가능함

        1. 매개변수를 갖는 생성자를 선언

        2. 그 생성자의 매개변수 값으로 상수를 초기화

          이것이 불가능 하다면 클래스에서 선언된 final 인스턴스변수는 모든 인스턴스에서 같은 값을 가져야 함

    • abstract (추상의, 미완성의)

      • 사용 범위 : 클래스, 메서드

      • 클래스 : 클래스 내에 추상 메서드가 선언되어 있음을 의미
      • 메서드 : 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 알림

        추상 클래스는 아직 완성되지 않은 메서드가 존재하는 완성 설계도

  • 제어자 조합

    • 사용가능한 제어자
      • 클래스 : public, default, final, abstract
      • 메서드 : 모든 접근 제어자, final, abstract, static
      • 맴버변수 : 모든 접근 제어자, final, static
      • 지역변수 : final
    • 제어자 조합 주의 사항
      • 메서드에 static과 abstract를 함께 사용할 수 없다
        • static 메서드는 몸통이 있는 메서드에만 사용할 수 있다.
      • 클래스에 abstarct와 final을 동시에 사용할 수 없다
        • 클래스에 사용되는 final은 클래스를 확장할 수 없다는 의미, abstract는 상속을 통해 완성이 되기 때문에 서로 모순됨
      • abstract 메서드의 접근제어자가 private일 수 없다
        • 추상 메서드는 자손 클래스에서 구현해주어야 하는데 접근 제어자가 private면 자손 클래스에서 접근이 불가능하다
      • 메서드에 private과 final을 같이 사용할 필요는 없다
        • 접근제어자가 private일 경우 오버라이딩 될 수 없기 때문에 둘중 하나만 사용해도 의미가 충분하다

+ Recent posts