반응형
접근 제어자(access modifier)
멤버 또는 클래스에 사용되어, 해당하는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역활
접근 제어자가 지정되어 있지 않다면, 접근 제어자가 default이다.
- 사용될 수 있는곳 : 클래스, 멤버변수, 메서드, 생성자
public
접근 제한이 전혀 없다.
protected
같은 패키지 내에서, 다른 패키지의 자손클래스에서 접근 가능
default
같은 패키지 내에서만 접근 가능
private
같은 클래스 내에서만 접근 가능
접근 제어자를 이용한 캡슐화
접근 제어자를 사용하는 이유는 클래스의 내부에 선언된 데이터를 보호하기 위해서이다.
데이터가 유효한 값을 유지하도록, 또는 비밀번호와 같은 데이터를 위부에서 함부로 변경하지 못하도록 하기 위해서는 외부로부터 접근을 제한하는 것이 필요하다.
이것을 데이터 감추기(data hiding)라고 하며, 객체지향개념의 캡슐화(encapsulation)에 해당하는 내용이다.
class Account { // 계좌
// private를 사용해 외부에서 직접적으로 접근하는것을 막는다.
final String NUMBER; // 계좌번호
final String PASSWORD; // 비밀번호
private int money; // 잔고
public Account(String number, String password, int money) {
this.NUMBER = number;
this.PASSWORD = password;
this.money = money;
}
public void deposit(int money) { // 입금
this.money += money;
System.out.println(monty + "원이 입금 되었습니다.");
}
public void withdraw(String password, int money) { // 출금
if (this.PASSWORD.equals(password)) {
this.money -= money;
System.out.println(monty + "원이 출금 되었습니다.");
} else {
System.out.println("계좌 비밀번호가 일치하지 않습니다.");
}
}
}
생성자의 접근 제어자
생성자에 접근 제어자를 사용하므로써 인스턴스의 생성을 제한할 수 있다.
생성자의 접근 제어자를 private로 지정하면, 외부에서 생성자에 접근할 수 없으므로 인스턴스를 생성할 수 없게 된다.
대신 인스턴스를 생성해서 반환해주는 public 메서드를 제공함으로써 외부에서 이 클래스의 인스턴스를 사용하도록 할 수 있다.
생성자가 private인 클래스는 다른 클래스의 조상이 될 수 없다. (조상클래스의 생성자를 자손클래스에서 사용 할 수 없다.)
class Singleton {
// 미리 인스턴스 생성
private static Singleton s = new Singleton();
// private 접근 제어 생성자
private Singleton() {
...
}
// 인스턴스를 생성하지 않고도 호출할 수 있어야 하므로 static이여야 한다.
public static Singleton getInstance() {
return s;
}
}
제어자(modifier)의 조합 시 주의사항
- 메서드에 static과 abstract를 함께 사용할 수 없다
static 메서드는 몸통이 있는 메서드만 사용할 수 있다. - 클래스에 abstract와 final을 동시에 사용할 수 없다.
클래스에 사용되는 final은 클래스를 확장할 수 없다는 의미이고 abstract는 상속을 통해서 완성되어야 한다는 의미이므로 서로 모순되기 때문이다. - abtract 메서드의 접근 제어자가 private일 수 없다.
abstract 메서드는 자손클래스에서 구현해주어야 하는데 접근 제어자가 private이면, 자손 클래스에서 접근할 수 없기 때문이다. - 메서드에 private와 final을 같이 사용할 필요는 없다.
접근 제어자가 private인 메서드는 오버라이딩될 수 없기 때문이다.
반응형
'Java' 카테고리의 다른 글
다형성(polymorphism) (0) | 2021.09.16 |
---|---|
그 외 제어자(otherwise modifier) (0) | 2021.09.16 |
오버라이딩(overriding) (0) | 2021.09.14 |
상속(inheritance) (0) | 2021.09.14 |
변수의 초기화 (0) | 2021.09.14 |