본문 바로가기
Java

Java 기본 - 접근제어자

by KongJiHoon 2024. 12. 21.

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

 

다음은 스피커의 음량이 절대로 100을 넘으면 안되는 요구사항이 있는 예시 코드이다.

 

Speaker 클래스

package access;

public class Speaker {

    int volume;

    Speaker(int volume) {
        this.volume = volume;
    }

    void volumeUp() {
        if (volume >= 100) {
            System.out.println("음량을 증가할 수 없습니다.");
        } else {
            volume += 10;
            System.out.println("음량을 10 증가합니다.");
        }
    }

    void volumeDown() {
        volume -= 10;
        System.out.println("volumeDown 호출");
    }

    void showVolume() {
        System.out.println("현재 음량 : " + volume);
    }

}

 

SpeakerMain 클래스

package access;

public class SpeakerMain {

    public static void main(String[] args) {
        Speaker speaker = new Speaker(90);
        speaker.volumeUp();
        speaker.volumeUp();
        speaker.showVolume();

        speaker.volumeDown();
        speaker.showVolume();


        // 필드에 직접 접근
        System.out.println("volume 필드 접근 수정");
		speaker.volume = 200;
        speaker.showVolume();
    }
}
  • 위 코드를 이용하면 볼륨을 100까지 올렸을 경우 더 이상 볼륨을 증가 시킬수없다.
  • 하지만 volume 변수에 직접 접근하게 될 경우 volume을 변경할 수 있어 요구사항에 위반하게 된다.
  • 이 경우 해결하기 위해서는 volume 필드의 외부 접근을 막아야 한다.

Speaker 클래스 수정

package access;

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 증가합니다.");
        }
    }

    void volumeDown() {
        volume -= 10;
        System.out.println("volumeDown 호출");
    }

    void showVolume() {
        System.out.println("현재 음량 : " + volume);
    }

}
  • volume 변수에 private 접근제어자를 붙여 주면 해결할 수 있다.
  • private 접근 제어자는 모든 외부 호출을 막는다. 따라서 private이 붙은 경우 해당 클래스 내부에서만 호출할 수 있다.

 

접근제어자의 종류

  • private: 모든 외부 호출을 막는다.
  • default: 같은 패키지 안에서 호출은 허용한다.
  • protected: 같은 패키지안에서 호출은 허용한다. 패키지가 달라도 상속 관계의 호출은 허용.
  • public: 모든 외부 호출 허용.

 

캡슐화

  • 캡슐화(Encapsulation)는 객체 지향 프로그래밍의 중요한 개념 중 하나다. 데이터와 해당 데이터를 처리하는 메서드를 하나로 묶어서 외부에서의 접근을 제한하는 것을 말한다. 캡슐화를 통해 데이터의 직접적인 변경을 방지하거나 제한 할 수 있다.
  • Speaker의 volume을 생각해 보면, 객체 내부의 데이터를 외부에서 함부로 접근할 수 있었다. 그러면 클래스 안에서 데이터를 다루는 모든 로직을 무시하고 변경할 수 있다. 그래서 volume 변수에 private접근 제어자를 사용하여 외부에서의 접근을 막은 것이다.
  • 객체의 데이터는 객체가 제공하는 기능인 메서드를 통해서 접근해야 한다.
  • 객체의 기능 중에서 외부에서 사용하지 않고 내부에서만 사용하는 기능들이 있다. 다음 예시코드를 통해 알아봤다.

BankAccount 클래스

package access;

public class BankAccount {


    private int balance;

    public BankAccount() {
        this.balance = 0;
    }

    // 입금
    public void deposit(int amount) {

        if (isAmountValid(amount)) {
            this.balance += amount;
        } else {
            System.out.println("유효하지 않은 금액입니다.");
        }
    }

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

    }

    public int getBalance() {

        return balance;
    }

    private boolean isAmountValid(int amount) {
        // 금액이 0보다 커야함

        return amount > 0;
    }
}
  • private
    • balance: 데이터 필드는 외부에 직접 노출하지 않는다. BankAccount가 제공하는 메서드를 통해서만 접근할 수 있다.
    • isAmountValid() : 입력 금액을 검증하는 기능은 내부에서만 필요한 기능이다. 따라서 private을 사용한다.
    • 이처럼 접근제어자와 캡슐화를 통해 데이터를 안전하게 보호하고, 개발자 입장에서 해당 기능을 사용하는 복잡도도 낮출 수 있다.

 

출처: https://www.inflearn.com/course/%EA%B9%80%EC%98%81%ED%95%9C%EC%9D%98-%EC%8B%A4%EC%A0%84-%EC%9E%90%EB%B0%94-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard

'Java' 카테고리의 다른 글

Java 기본 - final  (0) 2025.01.02
Java 기본 - 자바 메모리 구조 및 static  (1) 2024.12.25
Java 기본 - 생성자  (0) 2024.12.08
Java 기본 - 객체지향 프로그래밍  (1) 2024.12.07
Java 기본 - 기본형과 참조형  (0) 2024.12.04