[JAVA] 김영한의 실전 자바 ; 접근 제어자

선뀰·2023년 12월 28일
0

JAVA

목록 보기
14/25

접근 제어자

자바는 public, private같은 접근 제어자를 제공한다. 접근 제어자를 통해 클래스 외부에서 특정 필드나 메서드에 접근하는 것을 허용하거나 제한할 수 있다.

private int volume;
private를 사용하면 volume필드를 Speaker클래스 외부에서 접근하지 못하게 막는다.

public class Speaker {
    private int volume;
    Speaker(int volume){
        this.volume = volume;
    }
    void volumeUp(){
        if(volume >= 100){
            System.out.println("음량을 증가할 수 없습니다. 최대 음량입니다.");
        } else {
            volume += 10;
            System.out.println("음량을 10 증가합니다.");
        }
    }
}

private 접근 제어자는 모든 외부 호출을 막는다. 따라서 private가 붙은 경우 해당 클래스 내부에서만 호출할 수 있다.

접근 제어자 종류

  • private : 모든 외부 호출을 막는다. 동일 클래스에서만 사용
  • default(package-private) : 같은 패키지 안에서 호출은 허용한다. 동일 패키지의 모든 클래스
  • protected : 같은 패키지안에서 호출은 허용한다. 패키지가 달라도 상속 관계의 호출은 허용한다. 동일 패키지 모든 클래스 + 다른 패키지 자식 클래스
  • public : 모든 외부 호출을 허용한다.

private > default > protected > public 순서대로 차단된다.

package-private : 접근 제어자를 명시하지 않으면 같은 패키지 안에서 호출을 허용하는 default 접근 제어자가 적용된다. 접근 제어자를 사용하는 멤버는 동일한 패키지 내의 다른 클래스에서만 접근이 가능하기 때문이다.

접근 제어자 사용 위치

필드와 메서드, 생성자에 사용된다.
클래스 레벨에도 일부 접근 제어자를 사용할 수 있다.

public class Speaker { // 클래스 레벨
private int volume; // 필드
public Speaker(int volume) {} // 생성자
public void volumeUp() {} // 메서드
public void volumeDown() {}
public void showVolume() {}

private는 나의 클래스 안으로 속성과 기능을 숨길 때 사용한다. 외부 클래스에서 해당 기능을 호출할 수 없다.
default는 나의 패키지 안으로 속성과 기능을 숨길 때 사용, 외부 패키지에서 해당 기능을 호출할 수 없다.
protected는 상속 관계로 속성과 기능을 숨길 때 사용, 상속 관계가 아닌 곳에서 해당 기능을 호출할 수 없다.
public은 기능을 숨기지 않고 어디서든 호출할 수 있게 공개한다.

접근 제어자 사용 - 필드, 메서드

private는 AccessData 내부에서만 접근할 수 있다. 따라서 호출이 불가능하다.
생성자도 접근 제어자 관점에서 메서드와 같다.

AccessData data = new AccessData();
        // public 호출 가능
        data.publicField = 1;
        data.publicMethod();

        // 다른 패키지 default 호출 가능
        data.defaultField = 2;
        data.defaultMethod();

        // private 호출 불가
        data.privateField = 3;
        data.privateMethod(); // 컴파일 에러가 발생한다.

        data.innerAccess(); // public 메서드이기 때문에 아무곳에서 호출이 가능하다.

접근 제어자 사용 - 클래스 레벨

  • 클래스 레벨의 접근 제어자 규칙
    클래스 레벨의 접근 제어자는 public, default만 사용할 수 있다.
    private, protected 사용 불가능!!

public 클래스는 반드시 파일명과 이름이 같아야 한다.
하나의 자바 파일에 public클래스는 하나만 등장할 수 있다.
하나의 자바 파일에 default 접근 제어자를 사용하는 클래스는 무한정 만들 수 있다.
default패키지는 내부에서만 접근이 가능하다. 다른 패키지에서 접근이 불가능하다.
default패키지는 ex. class A
public 패키지는 ex. public class A

public class C {
	C() { //default 생성자 직접 생성한다. 
    }
}
public class PublicClass {
    public static void main(String[] args) {
        PublicClass publicClass = new PublicClass();
        DefaultClass1 class1 = new DefaultClass1();
        DefaultClass2 class2 = new DefaultClass2();
    }
}
class DefaultClass1 {

}

class DefaultClass2 {

}

캡슐화 (Encapsulation)

데이터와 해당 데이터를 처리하는 메서드를 하나로 묶어서 외부에서접근을 제한하는 것을 말한다.
데이터의 직접적인 변경을 방지하거나 제한할 수 있다.
속성과 기능을 하나로 묶고, 외부에 꼭 필요한 기능만 노출하고 나머지는 모두 내부로 숨기는 것이다.

1. 데이터를 숨겨라

객체에는 속성(데이터)와 기능(메서드)가 있다.
캡슐화에서 가장 필수로 숨겨야 하는 것은 속성(데이터)이다.
객체 내부의 데이터를 외부에서 함부로 접근하게 두면, 클래스 안에서 데이터를 다루는 모든 로직을 무시하고 데이터를 변경할 수 있다. 모든 안전망을 빠져나가게 된다. 캡슐화가 깨진다.

= 객체의 데이터는 객체가 제공하는 기능인 메서드를 통해서 접근해야 한다.

2. 기능을 숨겨라

외부에서 사용하지 않고 내부에서만 사용하는 기능이 있다. 모두 감추는 것이 좋다.
사용자 입장에서 꼭 필요한 기능만 외부에 노출할것
데이터는 모두 숨기고, 기능은 꼭 필요한 기능만 노출하는 것이 좋은 캡슐화이다.

default접근 지정자일 때 다른 패키지에서 임포트가 불가능하다.

profile
공부 기록

0개의 댓글