제어자

제어자란?

클래스와 클래스 멤버 선언 시 사용하여 부가적인 의미를 부여하는 키워드이다. 제어자에는 접근 제어자와 기타 제어자로 나뉜다.

1. 제어자의 종류

클래스, 변수, 메서드에 사용되면 접근 제어자는 한 가지만 사용 가능하다.

1.1. 접근 제어자

종류 : public, protected, default, private

1.2. 기타 제어자

종류 : static, final, abstract, native, tansient, synchronized, volatile, strictfp

1.2.1. static - 클래스의, 공통적인

클래스와 관계된 접근 자이며 사용하는 곳은 멤버 변수, 메서드, 초기화 블록이다.

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

  • 사용하는 곳 : 클래스, 메서드, 멤버 변수, 지역 변수
  • 클래스 : 상속받을 수 없는 클래스
  • 메서드 : 오버 라이딩될 수 없는 클래스
  • 멤버 변수, 지역변수 : 값을 변경할 수 없는 상수

생성자를 이용한 final 멤버 변수의 초기화 선언 시 초기화를 안 하고 생성자에서 단 한 번만 초기화한다. 선언과 동시에 초기화되면 모든 인스턴스는 같은 값을 갖게 되어 생성자에서 매개변수로 받아 초기화해준다.

class Sample {
    final int NUMBER;
    
    Sample(int n) {
        this.NUMBER = n;
    }
}

1.2.3. abstract - 추상의, 미완성의

  • 사용되는 곳 : 클래스, 메서드
  • 클래스 : 클래스 내에 추상 메서드가 선언되어 있음을 의미
  • 메서드 : 선언 부만 작성하고 구현부는 작성하지 않는 추상 메서드임을 알린다.

메서드 선언 부만 작성하고 로직은 구현하지 않는 추상 메서드를 선언하는 데 사용한다.

추상 클래스는 미완성 임으로 인스턴스를 생성할 수 없다.

인스턴스를 생성하지 못하도록 사용하기도 한다.

public abstract class Parent {
    public abstract int get();
    public abstract boolean set();
}

public Child extends Parent {
    public int get() {}
    public boolean set() {}
}

1.3. 접근 제어자 (access modifier)

사용되는 곳 : 클래스, 메서드, 멤버 변수, 생성자

1.3.1. 종류

  • private : 같은 클래스 내에서만 접근 가능
  • default : 같은 패키지 내에서만 접근 가능, 제어자를 지정하지 않으면 접근 제어자가 default임을 뜻
  • protected : 같은 패키지 내에서, 다른 패키지의 하위 클래스에서 접근 가능
  • public  : 접근 제한 없음

1.3.2. 범위 순서

public > protected > default > private

1.3.3. 대상에 따른 접근 제어자

  • 클래스 : public, (default)
  • 메서드, 멤버 변수 : public, protected, default, private
  • 지역 변수 : 없음

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

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

메서드를 변경했을 때 접근 제어자에 따라 수정, 테스트해야 하는 부분이 달라질 수 있다. 또한 멤버 변수에 잘못된 값을 넣어도 막을 방법이 없어 멤버 변수를 private으로 하고 setter를 이용하여 유효성 검사를 마치고 변수를 변경한다.

public 클래스는 파일에 단 한 개만 존재 가능하고 public 클래스 이름과 파일 이름이 같아야 한다.

public class Sample {
    private int n; // 외부에서 접근 불가
    
    public setN(int n) { // 외부에서 접근 가능하기 때문에 생성자를 통해 내부로 들어와 private n 을 변경
        this.n = n;
    }
}

1.5. 생성자의 접근 제어자 (singleton)

생성자에 private 부여하여 외부에서 인스턴스 생성을 못하도록 막는다. 대신 public으로 인스턴스를 return 해주는 메서드를 제공하여 인스턴스를 받는다.

public class Singleton {
    private static Singleton s = new Singleton();
    
    private singleton() {}
    
    public static Singleton getInstance() {
    	return s;
    }
}


main() {
	Singleton s = Singleton.getInstance();
}

생성자가 private일 경우 상속 클래스로 사용 불가하다. 하위 인스턴스가 생성되면서 상위 인스턴스도 생성되어야 하는데 생성자가 없이 생성이 불가능하다.

1.6. 제어자 (modifier)의 조합

대상 사용가능 제어자
클래스 public, default, protected, private
메서드 모든 접근 제어자, final, abstract, static
멤버 변수 모든 접근 제어자, final, static
지역 변수 final

1.7. 제어자 조합의 주의

  1. 메서드에 static과 abstract를 같이 사용할 수 없다.
    - static은 구현 부분이 있는 메서드에만 사용 가능하다.
  2. 클래스에 final과 abstract를 동시에 사용할 수 없다.
    - final은 확장이 불가고 abstract는 상속을 통해 완성되기 때문에 모순이다.
  3. abstract 메서드에 접근제어자는 private을 사용할 수 없다.
    - abstract는 하위 클래스에서 완성시켜야 하는데 private은 하위 클래스에서 접근이 불가능하다.
  4. 메서드에 final과 priavet을 같이 사용할 필요 없다.
    - 둘 다 같은 의미라 하나만 사용해도 된다.

'개발 언어 > Java' 카테고리의 다른 글

[Java] 추상 클래스&추상 메서드  (0) 2021.08.26
[Java] 다형성  (0) 2021.08.25
[Java] Package와 import  (0) 2021.08.24
[Java] 상속  (0) 2021.08.24
[Java] 변수의 초기화  (0) 2021.08.24

+ Recent posts