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();
data.publicField = 1;
data.publicMethod();
data.defaultField = 2;
data.defaultMethod();
data.innerAccess();
}
}
package access.b;
import access.a.AccessData;
public class AccessOuterMain {
public static void main(String[] args) {
AccessData data = new AccessData();
data.publicField = 1;
data.publicMethod();
data.innerAccess();
}
}
3) 접근 제어자 사용 - 클래스 레벨
- 클래스 레벨 접근 제어자는 public, default만 사용가능하다.
- public 클래스는 반드시 파일명과 이름이 같아야 한다.
- 하나의 자바파일에 public 클래스는 하나만 등장.
- 하나의 자바파일에 default 접근 제어자는 무한정 만들 수 있다.
2. 캡슐화
- 객체지향 개념 중 중요한 개념
- 데이터를 처리하는 메서드를 하나로 묶어서 외부에서 접근을 제한함.
1) 캡슐화 특징
- 데이터를 숨겨야 한다.
- 캡슐화에서 가장 필수로 숨겨야 할 속성은 데이터(속성)임.
- 객체 내부의 클래스를 함부로 접근하면 모든 로직 무시하고 데이터 변경 가능.
- 즉, 객체의 데이터는 객체가 제공하는 기능인 메서드를 통해 접근
- 기능을 숨겨야 한다.
- 객체의 기능 중에서 외부에서 사용되지 않고 내부에서만 사용하는 기능 있음.
- 즉, 필요한 기능만 노출하고 나머지 기능들은 숨겨야 한다.
package access;
public class BankAccount {
private int balance;
public BankAccount() {
balance = 0;
}
public void deposit(int amount) {
if(isAmountValid(amount)) {
balance += amount;
} else {
System.out.println("유효하지 않는 금액입니다.");
}
}
public void withdraw(int amount) {
if(isAmountValid(amount) && balance - amount >= 0) {
balance -= amount;
} else {
System.out.println("유효하지 않는 금액이거나 잔액이 부족합니다.");
}
}
public boolean isAmountValid(int amount) {
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가 없다.
그 이유는 사용자 입장에서 필요하지 않는 기능이기 때문이다.