mian() 메소드가 없는 클래스는 대부분 외부 클래스에서 이용할 목적으로 설계된 라이브러리 클래스이다
라이브러리 클래스는 외부 클래스에서 접근할 수 있는 멤버와 접근할 수 없는 멤버를 구분하여 설계하는 것이 바람직하다
객체 생성을 막기 위해 생성자를 호출하지 못하게 하거나,
객체의 특정 데이터를 보호하기 위해 해당 필드에 접근하지 못하게 하거나,
그리고 특정 메소드를 호출할 수 없도록 제한한다
자바는 이러한 기능을 구현하기 위해 접근 제한자 (Access Modifier) 를 제공한다
이는 접근 수준 지시자 (Access-level Modifier) 라고도 한다
접근 제한자에는 public < protected < default < private 가 있다 (제한이 작은 순서)
public :
모든 패키지에서 아무런 제한 없이 호출 할 수 있게 한다
보통 생성자 또는 필드, 메소드가 public이라면 클래스도 public 접근 제한을 가진다
protected :
default 접근 제한과 마찬가지로 같은 패키지에 속하는 클래스에서 호출할 수 있도록 한다
차이점은 다른 패키지에 속한 클래스가 해당 클래스의 자식(child) 클래스라면 호출할 수 있다
default :
접근 제한자를 생략했다면 default 접근 제한을 가진다
같은 패키지에서는 제한 없이 호출할 수 있으나, 다른 패키지에서는 호출할 수 없다
private :
오로지 클래스 내부에서만 사용할 수 있다
Ex 1 ) 싱글톤 (Singleton)
클래스 외부에서 new연산자로 생성자를 호출할 수 없도록
단 하나의 객체만 만들도록 보장한다
그래서 어떻게 보면 싱글톤은 객체지향의 성격을 잃는 객체일 수 있다
public class Singleton {
private static Singleton s = new Singleton();
private Singleton() {}
static Singleton getInstance() {
return s;
}
}
...
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
-> s1 == s2
Ex 2 ) get set 메소드
데이터(필드)는 외부에서 접근할 수 없도록 막고 (private), 메소드는 공개(public)하여
외부에서 메소드를 통해 데이터에 접근하도록 유도한다
private int balance;
private boolean stop;
public int getBalance() { //get + fieldName
return balance;
}
public void setBalance(int balance) { //set + fieldName
this.balance = balance;
}
public boolean isStop() { //is + fieldName (boolean type)
return stop;
}
public void setStop(int stop) { //set + fieldName
this.stop = stop;
}
※ 주의할 것
접근 제한이 작은 메소드, 클래스에서 접근 제한이 큰 메소드, 클래스를 불러오면 에러가 나타난다
ex) attempting to assign weaker access privileges; was public
public class MyClass {
static void printSound(Soundable soundable) {
System.out.println(soundable.sound());
}
public static void main(String args[]) {
//new Cat() 에서 불러오는 line 23의 메소드의 접근 제한이 같이 public이어야 함
printSound(new Cat());
printSound(new Dog());
}
}
interface Soundable {
String sound();
}
class Cat implements Soundable {
//String sound() {
// 에러 !!!! : attempting to assign weaker access privileges; was public
public String sound() {
return "야옹";
}
}
'etc.' 카테고리의 다른 글
[Java code] 이것이 자바다 예외처리 확인문제 7번 - 예외 떠넘기기 (0) | 2020.05.18 |
---|---|
[Java] BufferedReader 클래스로 입력받기 (Scanner와의 차이) (0) | 2020.05.17 |
[Java] 정적 멤버 static (static 필드, static 메소드) (0) | 2020.04.30 |
[C code] 기본 자료형 (정수형, 실수형) / 출력 서식문자 (0) | 2020.03.10 |
[C code] 프로그램 바로 종료시키기 exit() (0) | 2020.02.12 |