제어자
제어자란?
클래스와 클래스 멤버 선언 시 사용하여 부가적인 의미를 부여하는 키워드이다. 제어자에는 접근 제어자와 기타 제어자로 나뉜다.
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. 접근 제어자를 이용한 캡슐화
- 외부로부터 데이터를 보호하기 위함
- 외부에서 불필요한 내부적으로만 사용되는 부분을 감추기 위함
메서드를 변경했을 때 접근 제어자에 따라 수정, 테스트해야 하는 부분이 달라질 수 있다. 또한 멤버 변수에 잘못된 값을 넣어도 막을 방법이 없어 멤버 변수를 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. 제어자 조합의 주의
- 메서드에 static과 abstract를 같이 사용할 수 없다.
- static은 구현 부분이 있는 메서드에만 사용 가능하다. - 클래스에 final과 abstract를 동시에 사용할 수 없다.
- final은 확장이 불가고 abstract는 상속을 통해 완성되기 때문에 모순이다. - abstract 메서드에 접근제어자는 private을 사용할 수 없다.
- abstract는 하위 클래스에서 완성시켜야 하는데 private은 하위 클래스에서 접근이 불가능하다. - 메서드에 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 |