** 자바는 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을 사용한다.
- 이처럼 접근제어자와 캡슐화를 통해 데이터를 안전하게 보호하고, 개발자 입장에서 해당 기능을 사용하는 복잡도도 낮출 수 있다.
'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 |