본문 바로가기

Java

접근 제어 지시자 Accecc Modifier

접근제어지시자 Access Modifier

1. public 어디서나
2. default 패키지 내부
3. private 클래스 내부

-----------------------------------
pretected... 상속개념이해필요

접근 제어 지시자

그래서 왜 사용하는가?

만약 후임개발자가
실수로 메서드를 통해 코드를 작성하지 않고
바로 멤버변수에 접근해서 수정하는 코드를 작성했다면?

실수할 수 있는 가능성이 있다.

만약 balance 변수에 대한 외부접근을 차단한다면?
외부에서는 오직 deposit, withdraw 메서드로만 접근 가능

이같은 처리를 캡슐화 라고도 한다.

-----------------------------------

 

추가로private 접근제어지시자로 접근이 제한된 멤버변수에 접근하라면

 

getter, setter메서드를 쓸 수 있어야 한다.

 

package com.accesss;
public class Account {
    //속성
    private String name;
    private int balance; // 2단계
    //생성자
    //메서드 - 입금하다, 출금하다, 잔액출력
    public void deposit(int dmoney) { // 입금하다
        balance += dmoney;
        System.out.println(dmoney +"원 입금했습니다. 현재 잔액은 " + balance + "원 입니다.");
    }
    public void withdraw(int wmoney) { // 출금하다
        // TODO 방어적 코드 작성한다
        if (wmoney > balance) {
            System.out.println("잔액이 부족합니다. 현재 잔액은" + balance + "입니다.");
        } else {
            balance -= wmoney;
            System.out.println(wmoney +"원 출금했습니다. 현재 잔액은 " + balance + "입니다.");
        }
    }
    public void showInfo() { // 잔액출력
        System.out.println("현재 잔액은 " + balance + "입니다.");
    }
    /*
    외부에서 balance 값을 받을 수 있는 메서드가 필요하다.

    getter, setter 메서드

    getter
    변수 앞에 get이라는 단어를 붙인다.
    매개변수는 선언하지 않아도 된다.
     */
    public int getBalance() {
        return balance;
    }
    public String getName() {
        return name;
    }
    /*
    setter 메서드 만들기

    방어적 코드를 작성할 수 있다.
    setter 메서드를 만들지 않는다면 접근 자체를 할 수 없다.
     */
    public void setBalance(int setBal) {
        if (setBal < 0) {
            System.out.println("0 이하 값은 넣을 수 없습니다");
        } else {
            System.out.println("잔액을 " +setBal+ "원으로 조정했습니다.");
            balance = setBal;
        }
    }
    public void setName(String setNam) {
        name = setNam;
    }
}//end of class
package com.accesss;
public class AccessMainTest1 {
    //main
    public static void main(String[] args) {
        Account acc1 = new Account();
        acc1.deposit(10000);
        acc1.withdraw(6000);
        acc1.showInfo();

        /*
        접근 제어 지시자 Access Modifier

        왜 사용하는가?

        만약 후임개발자가
        실수로 메서드를 통해 코드를 작성하지 않고
        바로 멤버변수에 접근해서 수정하는 코드를 작성했다면?

        실수할 수 있는 가능성이 있다.

        만약 balance 변수에 대한 외부접근을 차단한다면?
        외부에서는 오직 deposit, withdraw 메서드로만 접근 가능

        이를 캡슐화 라고 한다.
         */
        // acc1.balance = 10000; // 입금을 했다고 착각
        // acc1.showInfo();

        //getter 메서드 사용
        int outerBalancer = acc1.getBalance();
        System.out.println("현재 잔액은 " + outerBalancer + "입니다.");
        System.out.println(acc1.getName());
        // 멤버 변수 값을 초기화하지 않으면 String null로 초기화된다.

        //setter 메서드 사용
        acc1.setBalance(10);
        acc1.showInfo();
    }//end of main
}//end of class