제어자
자바에는 다양한 제어자가 있다. 처음 배울 땐 그렇구나 하고 넘어가는데, 다 배우고 나니 추상, final, 접근 제어자 등.. 헷갈리기 시작한다. 익숙해지면 헷갈리지 않겠지만 자바에만 시간을 쏟는 게 아니다 보니 다른 언어를 하다 보면 까먹게 될 것 같아서 정리해본다. 우선 접근제어 자부터 살펴보자.
접근제어자
접근제어자에는 public과 private만이 있는 게 아니다!
제어자 이름 | 같은 클래스 | 같은 패키지 | 자손 클래스 | 모두 |
public | O | O | O | O |
protected | O | O | O | |
default | O | O | ||
private | O |
까먹을 것 같을 때 종종 보도록 하자. protected의 경우 자손클래스 까지만 접근이 가능하다는 것과, 접근제어자를 붙이지 않은 default의 경우 같은 클래스와 같은 패키지 내에서만 접근 가능하다는 것을 기억해야겠다.
static - 클래스의, 공통적인
인스턴스가 아닌 클래스에 관계된 것이기 때문에 인스턴스를 생성하지 않고도 사용이 가능하다.
static 이 사용되는 곳
- 멤버변수
- 메소드
- 초기화 블럭: static { }
final - 변경 불가능한
final 이 사용되는 곳을 보면서 final이 붙을 때 각자 어떻게 변하는지를 살펴보자.
- 지역변수
- 멤버 변수: 상수
- 메소드: 오버라이딩 불가
- 클래스: 상속 불가
abstract - 추상의, 미완성의
자바에서 허용하는 추상 클래스를 사용할 때 사용되는 제어자이다. 메소드의 선언부만 작성하고 실제 수행 내용은 구현하지 않은 추상 메소드를 선언하는 데 사용된다. 추상 클래스는 인스턴스를 생성해봐야 아무 소용없는 단순한 설계도이므로, 인스턴스 생성을 막기 위해 abstract를 붙인다고 생각하면 된다.
하나의 미완성 설계도라고 보면 편하다.
abstract 가 사용되는 곳
- 클래스
- 메소드
제어자를 사용하는 이유?
- 외부로부터의 데이터 보호
- 내부적으로만 사용되는 부분을 감추기 위해서
만약 확장될 것이 예상되는 클래스라면, 자손 클래스에서만 접근을 허용하는 protected를 사용하도록 하자.
이렇게 정보를 보호하기 위해 제어자를 사용하는 것이 캡슐화이다.
생성자에 private을?
생성자에 private을 부여하면 외부에서 생성자에 접근할 수 없으므로 인스턴스 생성이 불가능하게 된다!! 이런 경우 해당 클래스의 내부에서만 인스턴스 생성이 가능하다.
- 인스턴스를 생성해주는 메소드를 생성하여 인스턴스를 생성하게 할 수 있다.
class Data {
private static Data d = new Data();
private Data() {
...
}
public static getInstance() { // 외부에서 Classname.getInstance()를 하게 된다.
return d // 인스턴스를 생성하지 않고 사용할 수 있어야 하기 때문이다.
}
}
제어자의 정리
- 메소드에 static과 abstract 함께 사용 불가.
- static을 사용할 때 메소드의 내용이 있어야 한다.
- 클래스에 final과 abstract 함께 사용 불가.
- abstract는 상속을 통해 사용이 되는 설계도 같은 존재인데, final은 상속을 불가능하게 하는 제어자이기 때문이다.
tip! 제어자의 순서는 크게 상관이 없다! 하지만 접근제어자를 맨 왼쪽에(제일 처음) 넣는 것을 권장한다.
'Study > Java' 카테고리의 다른 글
[Java] 추상클래스 (0) | 2020.03.13 |
---|---|
[Java] 다형성 (0) | 2020.03.13 |
[Java] 패키지와 import (0) | 2020.03.12 |
[Java] 오버라이딩 (0) | 2020.03.12 |