본문 바로가기

etc.

[Java] 접근 제한자(Access Modifier) / 접근 수준 지시자(Access-level Modifier)

반응형

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 "야옹";
    }
}
반응형