제어자
제어자는 클래스, 변수 또는 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여한다.
접근 제어자
- public
- protected
- default
- private
그 외
- static
- final
- abstract
- native, transient, synchronized, volatile, strictfp
클래스나 멤버변수와 메서드에 주로 사용되며, 여러 제어자를 조합하여 사용하는 것이 가능
단, 한번에 네 가지 중 하나만 선택해서 사용가능
즉, 하나의 대상에 대해서 public과 private을 함께 사용할 수 없다
static - 클래스의, 공통적인
인스턴스 변수는 하나의 클래스로부터 생성되었더라도 각기 다른 값을 유지하지만,
클래스변수(static 멤버 변수)는 인스턴스에 관계없이 같은 값을 갖는다
그 이유는 하나의 변수를 모든 인스턴스가 공유하기 때문
static이 붙은 멤버변수와 메서드, 그리고 초기화 블럭은 인스턴스가 아닌 클래스에 관계된 것이기 때문에
인스턴스를 생성하지 않고도 사용가능하다
인스턴스 멤버를 사용하지 않는 메서드는 static 메서드로 선언하는 것이
인스턴스를 생성하지 않고도 호출이 가능해서 더 편리하고 속도도 빠르다
final - 마지막의, 변경될 수 없는
거의 모든 대상에 사용될 수 있다
변수에 사용되면 값을 변경할 수 없는 상수가 되며
메서드에 사용되면 오버라이딩을 할 수 없게되고
클래스에 사용되면 자식클래스를 정의하지 못해 확장할 수 없다
abstract - 추상의, 미완성의
메서드의 선언부만 작성하고 실제 수행내용은 구현하지 않은 추상 메서드를 선언하는데 사용
클래스에 사용되어 클래스에 추상 메서드가 존재한다는 것을 알수있다
접근 제어자
멤버 또는 클래스에 사용되어, 해당하는 메버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 한다
- private - 같은 클래스 내에서만 접근이 가능
- default - 같은 패키지 내에서만 접근이 가능
- protected - 같은 패키지 내에서, 그리고 다른 패키지의 자식클래스에서 접근이 가능
- public - 접근 제한이 없음
범위가 넓은 쪽에서 좁은 쪽으로 나열하면 다음과 같다
public > protected > (default) > private
접근 제어자를 이용한 캡슐화
접근 제어자를 사용하는 이유는 클래스 내부에 선언된 데이터를 보호하기 위해서이다
이것을 데이터 감추기라고 하며, 객체지향개념의 캡슐화에 해당하는 내용
접근제어자를 사용하는 이유
외부로부터 데이터를 보호하기 위해
외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위해
public class Time {
private int hour;
private int minute;
private int second;
public int getHour(){
return hour;
}
public void setHourt(int hor) {
if(hour < 0 || hour > 23)
return;
this.minute = minute;
}
public int getMinute(){
return minute;
}
public void setMinute(int minute) {
if(minute < 0 || minute > 59)
return;
this.minute = minute;
}
public int getSecond(){
return second;
}
public void setSecond(int second) {
if(second < 0 || second > 59)
return;
this.second = second;
}
}
get으로 시작하는 메서드는 단순히 멤버변수의 값을 반환하는 일을 하고,
set으로 시작하는 메서든느 매개변수에 지정된 값을 검사하여 조건에 맞는 값일 때만 멤버변수의 값을 변경하도록 작성
만약 상속을 통해 확장이 예상되는 클래스는 private 대신 protected를 사용한다
이 규칙은 Getter/Sertter 라고 한다
제어자의 조합
제어자를 조합해서 사용할 때 주의사항
1. 메서드에 static과 abstract를 함께 사용할 수 없다
static 메서드는 몸통이 있는 메서드에만 사용할 수 있기 때문
2. 클래스에 abstract와 final을 동시에 사용할 수 없다
클래스에 사용되는 final은 클래스를 확장할 수 없다는 의미이고
abstract는 상속을 통해서 완성되어야 한다는 의미이므로 서로 모순되기 때문
3. abstract 메서드에 접근 제어자가 private일 수 없다
abstract 메서드는 자식클래스에서 구현해주어야 하는제 접근 제어자가 private이면
자식 클래스에서 접근할 수 없기 때문
4. 메서드에 private과 fianl을 같이 사용할 필요는 없다
접근 제어자가 private인 메서든느 오버라이딩될 수 없기 때문이다
이 둘 중 하나만 사용해도 의미가 충분함
'Language > Java' 카테고리의 다른 글
[Java] 인터페이스 (0) | 2024.04.18 |
---|---|
[Java] 객체지향 프로그래밍 - 다형성과 추상클래스 (0) | 2024.04.08 |
[Java] 객체지향 프로그래밍 - package와 import (0) | 2024.04.05 |
[Java] 객체지향 프로그래밍 - 오버라이딩(overriding) (0) | 2024.04.05 |
[Java] 객체 지향 프로그래밍 - 상속 (0) | 2024.04.03 |