JAVA

접근제어자

고민말고생각하는사람 2024. 1. 17. 16:12

접근제어자란?

클래스의 멤버변수와 메서드에 접근하는 권한을 지정하는 예약어 이다.

public, default, protected, private 등이 있다.

 

-----

역시나 이렇게 사전적인 정의만 봐 봤자 잘 모르겠다.

 

접근 제어자는 왜 필요할까? 목적이 뭘까?

 

예시를 작성 해보자.

public class Japangea {

    int inputMoney;

    Japangea(int inputMoney) {
        this.inputMoney = inputMoney;
    }

    public void sellProduct(int productPrice) {
        if (productPrice > inputMoney) {
            System.out.println("금액이 부족합니다.");
        } else {
            inputmoney -= productPrice;
            System.out.println("물품이 구매 되었습니다.");
        }
    }

현실의 이치에 맞게,

상품의 가격 > 투입한 금액 이면, 판매할 수 없어야 한다.

 

그러나,  우리는 아래 예시와 같이 외부에서 인스턴스의 값을 직접 입력하며 학습 해왔다.

public class JapangeaMain {
    public static void main(String[] args) {
    	Japangea japangea = new Japangea(0);
     	japangea.inputMoney = 10000;
    }
}

0원을 투입했는데, 10,000원 넣은 것 같은 효과!! 

 

이런식으로 외부에서 값을 입력 가능할 경우..

해당 예시에서 자판기는 돈도 안 받았는데 물건을 줄 것이고,

물건을 싹 다 털린 자판기 소유주는 울 것이고,

자판기 소유주의 토끼같은 자식들은 저녁을 계속 굶게되며, 끝내 영양실조까지 걸릴 것이다.

 

이렇게 어마어마한 파장을 낳을 수 있는 '불필요한 외부에서의 입력' 막아야 하지 않겠나?'

그래서! 필요한 것이 바로 '접근제어자' 이다.

 

접근 제어자는 외부에서의 접근 권한, 범위 등을 제어할 수 있게 해준다.

 

public class Japangea {
    private int inputMoney;

    Japangea(int inputMoney) {
        this.inputMoney = inputMoney;
    }

처음 예시 코드에서 딱 한 군데, 변화를 주었다.

멤버변수에 private  접근제어자를 작성한 것이 보이는가?

 

이 private를 하나 더 붙였을 뿐인데 글쎄...?

public class JapangeaMain {
    public static void main(String[] args) {
    	Japangea japangea = new Japangea(0);
     	// japangea.inputMoney = 10000;
    }
}

외부에서 값을 직접적으로 입력하는 게 막혀 버렸다.

..대..애..박.

자판기 주인과 가족들은 울지도, 굶지도, 병에 걸리지도 않게 됐다.

 

접근제어자의 핵심

속성과 기능을 외부로부터 숨기는 것.

 

private - 외부로부터의 접근에서 속성과 기능을 숨길 때 사용

defalut - 동일 패키지의 접근 허용. 외부 패키지로의 속성과 기능을 숨길 때 사용

protected - 상속 관계로 속성과 기능을 숨길 때 사용. 상속 관계가 아닌 곳에서 해당 기능 호출 못 함.

public - 어디서든 사용 가능