[자바] 접근제어자

brand_mins·2024년 1월 18일

Java

목록 보기
44/47

1. 접근제어자

1) 접근제어자 종류

1. public
- 모든 외부 호출을 허용한다.
- 즉, 기능을 숨기지 않고 어디서든 호출 가능하다.

2. private
- 모든 외부 호출을 막는다.
- 외부 클래스에서 해당 기능을 호출할 수 없다.

3. protected
- 같은 패키지안에서 호출은 허용한다.
- 패키지가 달라도 상속관계 호출은 허용한다.

4. default
- 같은 패키지내에서만 호출이 가능하다.

(1) 접근 제어자 사용 위치

  • 접근 제어자는 필드와 메서드, 생성자에 사용된다.
  • 추가로 클래스 레벨에도 일부 접근 제어자 사용 가능
public class Speaker { // 클래스 레벨
	private int volume; // 필드
    
    public Speaker(int volume) {} // 생성자
    
    public void volumeUp() {} // 메서드
}

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

package access.a;

public class AccessData {
    public int publicField;
    int defaultField;
    private int privateField;

    public void publicMethod() {
        System.out.println("publicMethod 호출 " + publicField);
    }

    void defaultMethod() {
        System.out.println("defaultMethod 호출 " + defaultField);
    }

    private void privateMethod() {
        System.out.println("privateMethod 호출 " + privateField);
    }
    public void innerAccess() {
        System.out.println("내부 호출");
        publicField = 100;
        defaultField = 200;
        privateField = 100;
        publicMethod();
        defaultMethod();
        privateMethod();
    }
}

package access.a;

public class AccessInnerMain {
    public static void main(String[] args) {
        AccessData data = new AccessData();

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

        // 같은 패키지 내 default 호출 가능
        data.defaultField = 2;
        data.defaultMethod();

        // private 호출 불가. private을 선언한 클래스에서만 접근이 가능하다.
        // data.privateField = 3;

        data.innerAccess(); // innerAccess은 public으로 선언하였기 때문에 세 필드 값을 호출할 수 있다.
    }
}
package access.b;

import access.a.AccessData;

public class AccessOuterMain {
    public static void main(String[] args) {
        AccessData data = new AccessData();

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

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

        // private 호출 불가. private을 선언한 클래스에서만 접근이 가능하다.
        // data.privateField = 3;

        data.innerAccess(); // innerAccess은 public으로 선언하였기 때문에 세 필드 값을 호출할 수 있다.
    }
}

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

  • 클래스 레벨의 접근 제어자 규칙
- 클래스 레벨 접근 제어자는 public, default만 사용가능하다.
- public 클래스는 반드시 파일명과 이름이 같아야 한다.
- 하나의 자바파일에 public 클래스는 하나만 등장.
- 하나의 자바파일에 default 접근 제어자는 무한정 만들 수 있다.

2. 캡슐화

  • 객체지향 개념 중 중요한 개념
  • 데이터를 처리하는 메서드를 하나로 묶어서 외부에서 접근을 제한함.

1) 캡슐화 특징

  1. 데이터를 숨겨야 한다.
- 캡슐화에서 가장 필수로 숨겨야 할 속성은 데이터(속성)임.
- 객체 내부의 클래스를 함부로 접근하면 모든 로직 무시하고 데이터 변경 가능.
- 즉, 객체의 데이터는 객체가 제공하는 기능인 메서드를 통해 접근
  1. 기능을 숨겨야 한다.
- 객체의 기능 중에서 외부에서 사용되지 않고 내부에서만 사용하는 기능 있음.
- 즉, 필요한 기능만 노출하고 나머지 기능들은 숨겨야 한다.
  • 코드의 예는 아래를 보면서 공부하자.
package access;

public class BankAccount {

    private int balance; // balance를 private으로 막음.

    public BankAccount() {
        balance = 0;
    }

    // public 메서드 : deposit
    public void deposit(int amount) {
        if(isAmountValid(amount)) {
            balance += amount;
        } else {
            System.out.println("유효하지 않는 금액입니다.");
        }
    }

    // public 메서드 : withdraw
    public void withdraw(int amount) {
        if(isAmountValid(amount) && balance - amount >= 0) {
            balance -= amount;
        } else {
            System.out.println("유효하지 않는 금액이거나 잔액이 부족합니다.");
        }
    }

    public boolean isAmountValid(int amount) {
        // 금액이 0보다 커야함
        return amount > 0;
    }

    public int getBalance() {
        return balance;
    }
}

package access;

public class BankAccountMain {
    public static void main(String[] args) {
        BankAccount account = new BankAccount();
        account.deposit(10000);
        account.withdraw(3000);
        System.out.println("balance = " + account.getBalance());
    }
}
  • BankAccount의 account 인스턴스에는 deposit, withdraw, isAmountValid가 있다.
  • 메인 메서드에는 isAmountValid가 없다.
    그 이유는 사용자 입장에서 필요하지 않는 기능이기 때문이다.
profile
IT 개발자가 되기 위한 기록

0개의 댓글