접근 제어자
private : 해당 클래스 내에서만 접근 가능
public : 모든 클래스에서 접근 가능
default : 같은 패키지 내에서만 접근 가능, 아무 접근제어자도 설정하지 않았을때 기본값.
protected : 같은 패키지 내에서는 접근 가능, 다른 패키지인 경우 자식 클래스에서만 접근 가능
접근제어자를 학습하기 위하여 BlackBoxRefurbish라는 클래스를 새로 생성하였다.
Tip) Getter & Setter 를 쉽게 생성하는 법
- 변수를 선언한다
- 상단 바 중 [Code]-[Generate] 메뉴 접근
- 팝업 내 [Getter and Setter] 클릭
- Getter와 Setter를 생성할 변수 클릭 (Ctrl 이나 Shift를 이용하면 복수선택 가능)
이전 Getter & Setter 시간에 학습한 예제를 활용해서 다시 한번 학습해보자.
자동 생성된 Getter & Setter에 지난시간에 학습한 예시를 아래와 같이 추가해주었다.
1) resolution 값이 null 이거나 빈문자 일 때 "판매자에게 문의하세요" 리턴 (resolution 값이 있을때는 resolution 리턴)
2) 수정한 price 값이 10만원 이하일때 price 값은 10만원으로 변경
public String getResolution() {
if(resolution == null || resolution.isEmpty()){
return "판매자에게 문의하세요.";
}
return resolution;
}
public void setPrice(int price) {
if(price<100000){
this.price = 100000;
}else{
this.price = price;
}
}
BlackBoxRefurbish 클래스를 이용하여 접근제어자를 이해해보자.
_10_AccessModifier 라는 클래스를 생성하고 아래와 같이 테스트해보았다.
위 예제에서 price 관련 로직을 좀 더 자세하게 확인해보자.
b1.setPrice(-5000);
System.out.println("가격 : "+b1.getPrice() + "원");
b1.price = -5000;
System.out.println(b1.price);
- b1.setPrice(-5000); -> BlackBoxRefurbish 클래스 내 setPrice(-5000) 호출
- price 값에 -5000 을 적용하려고 하지만, 10만원 미만 값이므로 price는 10만원으로 적용된다.
- b1.getPrice() 호출 시 위 적용된 price값인 10만원이 출력된다.
- 이후 b1.price 값을 -5000 으로 적용하였다.
- b1.price 출력 시에는 -5000 으로 출력된다.
결국 Getter & Setter를 이용하지 않을 시에는 price 값을 -5000으로 설정할 수 있게되는 것이다.
이러한 문제를 방지하기 위하여 접근 제어자를 활용할 수 있다.
기존의 int price에 접근자 private을 설정하였다.
private : 해당 클래스 내에서만 접근 가능한 특징을 가진다.
즉 다른 클래스에서 BlackBoxRefurbish 의 price 값을 직접 접근할 수 없고,
해당 값에 접근하기 위해서는 Getter & Setter를 통해서만 접근 및 수정이 가능하게 된다.
위와 같이 price 변수의 접근제어자를 private로 선언 후 _10_AccessModifier 클래스를 다시 확인해보게되면 아래와 같이 오류가 발생되고 있는 것을 확인할 수 있다.
오류) 'price' has private acces in 'chap_07.BlackBoxRefurbish'
이번에는 public, default, protected 접근제어자에 대해서도 확인해보자.
private : 해당 클래스 내에서만 접근 가능 public : 모든 클래스에서 접근 가능 default : 아무것도 적지 않았을때, 같은 패키지 내에서만 접근 가능 protected : 같은 패키지 내에서는 접근 가능, 다른 패키지인 경우 자식 클래스에서만 접근 가능 |
public String modelName; -> modelName 변수의 접근제어자 : public
String resolution; -> resolution 변수의 접근제어자 : default (아무것도 입력하지않은경우 default)
private int price; -> price 변수의 접근제어자 : private
protected String color; -> color 변수의 접근제어자 : protected
이번에는 다른 패키지를 생성하여 확인해보자.
- BlackBoxRefurbish 클래스는 chap_07 패키지 안에 생성되어 있다.
- chap_08 이라는 새로운 패키지를 생성하고, 그 안에 _00_AccessModifierTest 클래스를 생성하였다.
chap_08._00_AccessModifierTest에서 BlackBoxRefurbish의 변수 접근 시 위와 같이 오류가 발생된다.
b1.modelName 은 접근제어자 public (모든 클래스에서 접근가능) 이므로 문제없음.
b1.resolution 은 접근제어자 default(같은 패키지-chap_07 내에서만 접근 가능) 이므로 오류.
b1.private 은 접근제어자 private (해당 클래스-BlackBoxRefurbish 내에서만 접근 가능) 이므로 오류.
b1.color 은 접근제어자 protected (같은 패키지 내에서는 접근 가능, 다른 패키지인 경우 자식 클래스에서만 접근 가능) 이므로 오류.
메소드나 클래스에도 해당 접근제어자를 설정할 수 있다.
- 기본적으로 클래스는 public 접근제어자로 선언되며 다른 접근제어자로 설정을 바꿀 수 있다. class A { }
- public 클래스일때는 .java 파일의 이름과 동일해야한다.
캡슐화(Encapsulation) : 서로 연관된 것들끼리만 하나의 캡슐에 담는 특성.
> BlackBox 클래스 내에는 블랙박스에 관련된 내용만 담는다.
정보은닉(Information hiding) : 객체 내에 있는 변수나 메소드로 직접적인 접근을 막고, 객체에서 허용해주는 형태로만 접근이 가능하도록 하는 특성. (주로 접근제어자로 설정)
'Spec UP - Backend > 나도코딩의 자바기본편' 카테고리의 다른 글
Chap_07. 상속 (0) | 2023.04.28 |
---|---|
Chap_07. 패키지 (0) | 2023.04.28 |
Chap_07. Getter & Setter (0) | 2023.04.26 |
Chap_07. 생성자 (0) | 2023.04.25 |
Chap_07. This (1) | 2023.04.25 |
댓글