접근 제어자
- 객체에 대한 권한을 너무 쉽게 주면 문제가 생길 수 있음
- 그래서 자바에는 권한을 제한해주는 '접근 제어자(Access Modifier)'라는 게 있음
person.java
public class Person {
private int age;
}
|
cs |
- 인스턴스 변수 앞에 'private'라는 접근 제어자를 써주면, 그 변수는 해당 클래스 내에서만 접근이 가능함
- Driver(Person test file)는 age에 대한 권한이 없기때문에 Driver에서 p1.age = -10;을 해주려고 하면 오류가 나올 것
- 그렇다면 age에 대한 권한은 아예 없는 것일까? 아님, private 변수라도 그 클래스 내에서는 사용이 가능하기에, 그 클래스에 age를 사용하는 메소드를 만들어서 사용하면 됨.
public class Person {
private int age;
// 밖에서 접근 가능한 메소드
// 값을 지정하는 메소드(새로운 값을 파라미터로 받아올 것)
public void setAge(int newAge) {
if(newAge >= 0) {
age = newAge;
}
}
// 값을 읽어오는 메소드
public int getAge() {
return age;
}
}
|
cs |
- setAge()와 getAge() 메소드를 이용해서 age 변수를 바꿔주고 받아올 수 있음
- setAge와 getAge같은 메소드를 흔히 'setter' 메소드와 'getter' 메소드라고 부름
- 두 메소드 앞에 public이라는 접근 제어자는 다른 클래스에서도 사용가능하게 만들어줌
Driver.java
public class Driver{
public static void main(String[] args) {
Person p1 = new Person();
p1.setAge(28);
p1.setAge(-10);
System.out.println(p1.getAge()); // 28
}
}
|
cs |
접근 제어자 연습
Person 클래스와 BankAccount 클래스의 모든 인스턴스 변수들을 private으로 설정해주세요. 각 변수에 해당하는 'setter'(예: setName)과 'getter'(예: getName) 메소드를 써주고, BankDriver에서 오류가 나지 않도록 적절히 적용해주세요!
프로그램을 수정하여 오류가 나오지 않도록 하고, 테스트 케이스는 유지하여 이전 문제와 같이 아래의 출력값이 나오도록 해야 합니다.
30000원 입금하였습니다. 잔고: 530000원, 현금: 70000원
true
170000원 출금하였습니다. 잔고: 360000원, 현금: 240000원
true
입금 실패입니다. 잔고: 360000원, 현금: 240000원
false
출금 실패입니다. 잔고: 360000원, 현금: 240000원
false
public class Person {
// 사람 선언
private String name;
private int age;
private int cashAmount; // 계좌주의 현금액
private BankAccount account;
public void setName(String newName){
name=newName;
}
public String getName(){
return name;
}
public void setAge(int newAge){
if(newAge > 0){
age=newAge;
}
}
public int setAge(){
return age;
}
public void setCashAmount(int newCashAmount){
if(newCashAmount >= 0){
cashAmount=newCashAmount;
}
}
public int getCashAmount(){
return cashAmount;
}
public void setAccount(BankAccount newAccount){
account=newAccount;
}
public BankAccount getAccount(){
return account;
}
}
|
cs |
package example;
public class BankAccount {
private int balance;
private Person owner;
public void setBalance(int newBalance) {
balance=newBalance;
}
public int getBalance() {
return balance;
}
public void setOwner(Person newOwner) {
owner=newOwner;
}
public Person getOwner() {
return owner;
}
// 파라미터 : 입금할 액수(정수)
// 리턴 : 성공여부(불린)
boolean deposit(int amount) {
if(amount < 0 || amount > owner.getCashAmount()) {
System.out.println("입금 실패입니다. 잔고 :" + balance + "원, 현금 : " + owner.getCashAmount() +"원");
System.out.println("false");
return false;
}else {
balance += amount;
owner.setCashAmount(owner.getCashAmount()- amount);
System.out.println(amount+"원 입금하였습니다. 잔고 : " + balance +"원, 현금 : "+owner.getCashAmount() +"원");
System.out.println("true");
return true;
}
}
// 파라미터 : 출금할 액수(정수)
// 리턴 : 성공여부(불린)
boolean withraw(int amount) {
if(amount < 0 || amount > getBalance()) {
System.out.println("출금 실패입니다. 잔고 :" + balance + "원, 현금 : " + owner.getCashAmount() +"원");
System.out.println("false");
return false;
}else {
balance -= amount;
owner.setCashAmount(owner.getCashAmount()+amount);
System.out.println(amount+"원 출금하였습니다. 잔고 : " + balance +"원, 현금 : "+owner.getCashAmount()+"원");
System.out.println("true");
return true;
}
}
}
|
cs |
public class BankDriver {
public static void main(String[] args) {
// 사람 선언
Person p1 = new Person();
p1.setName("summer");
p1.setAge(28);
p1.setCashAmount(100000);
// 은행 계좌 생성
BankAccount a1 = new BankAccount();
a1.setBalance(500000);
a1.setOwner(p1);
p1.setAccount(a1);
a1.deposit(30000);
a1.withraw(170000);
a1.deposit(620000);
a1.withraw(890000);
}
}
|
cs |
'DEV > JAVA' 카테고리의 다른 글
생성자 | Constructor (0) | 2021.12.16 |
---|---|
메소드 오버로딩 | Method Overloading (0) | 2021.12.16 |
객체 만들기 | Object Oriented Programming (0) | 2021.12.13 |
배열 | Array (0) | 2021.12.12 |
조건문과 반복문 (0) | 2021.12.12 |