- 접근 제어자 정리
- 접근 제어자 연습
- 메소드 오버로딩 정리
- 계좌 이체
- 생성자 정리
- 생성자 연습
- this 정리
- 특가 할인 매장
접근 제어자 정리
우리가 쓰고 있는 Person 클래스의 매우 간소화된 버전이다:
Person.java
public class Person {
int age;
}
Driver.java
public class Driver {
public static void main(String[] args) {
Person p1 = new Person();
p1.age = 28;
System.out.println(p1.age);
}
}
그런데 사실 이건 굉장히 위험한 코드이다. p1.age = 28; 을 p1.age = -10; 으로 바꾸어도 아무 문제 없이 실행된다. 나이가 음수인 것은 말이 안 되는데도 말이다.
접근 제어자
방금 본 것처럼, 객체에 대한 권한을 너무 쉽게 주면 문제가 생길 수 있다. 다행히 자바에서는 권한을 제한해주는 '접근 제어자(Access Modifier)'라는 게 있다.
Person.java
public class Person {
private int age;
}
인스턴스 변수 앞에 private이라는 접근 제어자를 써주면 그 변수는 해당 클래스 내에서만 접근 가능하다.
이제 Driver는 age에 대한 권한이 없기 때문에 Driver에서 p1.age = -10; 을 해주려고 하면 오류가 나올 것이다.
마찬가지로 System.out.println(p1.age); 도 불가능하다.
그러면 이제는 age에 대한 권한이 아예 없는 것일까?
아니다. private 변수라도 그 클래스 내에서는 사용이 가능하기 때문에, 그 클래스에 age를 사용하는 메소드를 쓰면 된다.
Person.java
public class Person {
private int age;
public void setAge(int newAge) {
if (newAge > 0) {
age = newAge;
}
}
public int getAge() {
return age;
}
}
이제 setAge와 getAge 메소드를 이용해서 age 변수를 바꿔주고 받아올 수 있다. setAge와 getAge 같은 메소드를 흔히 'setter' 메소드와 'getter' 메소드라고 부른다.
그런데 보면 두 메소드 앞에는 public이라는 접근 제어자를 써주었다. 변수 age는 숨기고 싶어서 private으로 설정했지만, setAge와 getAge는 다른 클래스에서도 사용하고 싶기 때문에 어디서든 접근 가능하게 해주는 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
실습과제
접근 제어자 연습
'접근 제어자' 강의에서 한 것처럼 Person 클래스와 BankAccount 클래스의 모든 인스턴스 변수들을 private으로 설정하라. 각 변수에 해당하는 'setter'(예: setName)과 'getter'(예: getName)메소드를 써주고, BankDriver에서 오류가 나지 않도록 적절히 적용하라.
프로그램을 수정하여 오류가 나오지 않도록 하고, 테스트 케이스는 유지하여 이전 문제와 같이 아래의 출력값이 나오도록 해야 한다.
30000원 입금하였습니다. 잔고: 530000원, 현금: 70000원
true
170000원 출금하였습니다. 잔고: 360000원, 현금: 240000원
true
입금 실패입니다. 잔고: 360000원, 현금: 240000원
false
출금 실패입니다. 잔고: 360000원, 현금: 240000원
false
public class BankAccount {
private int balance;
private Person owner;
public void setBalance(int pBalance) {
balance = pBalance;
}
public int getBalance() {
return balance;
}
public void setOwner(Person pOwner) {
owner = pOwner;
}
public Person getOwner() {
return owner;
}
// 파라미터 : 입금할 액수(정수)
// 리턴 : 성공여부(불린)
boolean deposit(int amount) {
// 1. write code here
if (amount < 0 || owner.getCashAmount() < amount) {
System.out.print("입금 실패입니다. 잔고: " + balance + "원, 현금: " + owner.getCashAmount() + "원");
return false;
} else {
balance += amount;
owner.setCashAmount(owner.getCashAmount() - amount);
System.out.print(amount + "원 입금하였습니다. 잔고: " + balance + "원, 현금: " + owner.getCashAmount() + "원");
return true;
}
}
// 파라미터 : 출금할 액수(정수)
// 리턴 : 성공여부(불린)
boolean withdraw(int amount) {
// 2. write code here
if (amount < 0 || balance < amount) {
System.out.print("출금 실패입니다. 잔고: " + balance + "원, 현금: " + owner.getCashAmount() + "원");
return false;
} else {
balance -= amount;
owner.setCashAmount(owner.getCashAmount() + amount);
System.out.print(amount + "원 출금하였습니다. 잔고: " + balance + "원, 현금: " + owner.getCashAmount() + "원");
return true;
}
}
}
// 첫 번째 파라미터 : 받는 사람(Person)
// 두 번째 파라미터 : 이체할 금액(정수)
// 리턴 : 성공여부(불린)
// boolean transfer(Person to, int amount) {
// (다음 과제에서 사용하므로, 우선 skip합니다.)
// }
public class Main {
public static void main(String[] args) {
// 사람 선언
Person p1 = new Person();
p1.setName("김신의");
p1.setAge(28);
p1.setCashAmount(30000);
// 은행 계좌 생성
BankAccount a1 = new BankAccount();
a1.setBalance(100000);
p1.setAccount(a1);
a1.setOwner(p1);
// 3 - 4. write code here
Person p2 = new Person();
p2.setName("유예진");
p2.setAge(26);
p2.setCashAmount(100000);
BankAccount a2 = new BankAccount();
a2.setBalance(500000);
p2.setAccount(a2);
a2.setOwner(p2);
System.out.println(a2.deposit(30000));
System.out.println(a2.withdraw(170000));
System.out.println(a2.deposit(620000));
System.out.println(a2.withdraw(890000));
}
}
public class Person {
private String name;
private int age;
private int cashAmount;
private BankAccount account;
public void setName(String pName) {
name = pName;
}
public String getName() {
return name;
}
public void setAge(int pAge) {
if (pAge >= 0) {
age = pAge;
}
}
public int getAge() {
return age;
}
public void setCashAmount(int pCashAmount) {
cashAmount = pCashAmount;
}
public int getCashAmount() {
return cashAmount;
}
public void setAccount(BankAccount pAccount) {
account = pAccount;
}
public BankAccount getAccount() {
return account;
}
}
메소드 오버로딩 정리
'메소드 오버로딩(Method Overloading)'은 클래스 내에 같은 이름의 메소드를 2개 이상 정의할 수 있게 해주는 기능이다.
public class Calculator {
int add(int a, int b) {
return a + b;
}
int add(int a, int b, int c) {
return a + b + c;
}
double add(double a, double b) {
return a + b;
}
public static void main(String[] args) {
Calculator c = new Calcurator();
System.out.println(c.add(2, 4));
System.out.println(c.add(2, 4, 8));
System.out.println(c.add(3.14, 2.54));
}
}
6
14
5.68
add라는 이름의 메소드가 세 개나 있다. 그런데 아무 오류도 나지 않는다. 왜 그럴까?
잘 보면 각 메소드는 다른 구성의 파라미터들을 받는다. 첫 번째 add는 정수형 값 두 개, 두 번째 add는 정수형 값 세 개, 그리고 세 번째 add는 소수형 값 두 개를 받는다.
같은 이름의 메소드라도 파라미터 구성이 다르면 자바는 알아서 구분을 할 수 있다. main 메소드에서 c.add(2, 4)를 하면 알아서 첫 번째 add가 불리고, c.add(2, 4, 8)을 하면 두 번째 add가 불리고, c.add(3.14, 2.54)를 하면 세 번째 add가 불리는 것이다.
쓰임(Usage)
은행 계좌 예제
'달러'나 '유로'같은 다른 통화로 입금을 하는 depositWithExchangeRate 메소드를 아래처럼 쓸 수 있다.
public boolean deposit(int amount) {
if (amount < 0 || amount > owner.getCashAmount()) {
System.out.println("입금 실패입니다. 잔고: " + balance + "원, 현금: " + owner.getCashAmount() + "원");
return false;
}
balance += amount;
owner.setCashAmount(owner.getCashAmount() - amount);
System.out.println(amount + "원 입금하였습니다. 잔고: " + balance + "원, 현금: " + owner.getCashAmount() + "원");
return true;
}
public boolean depositWithExchangeRate(double amount, double exchangeRate) {
return deposit((int) (amount * exchangeRate));
하지만 사실 depositWithExchangeRate을 deposit으로 바꿔도 아무 문제 없다. 파라미터 구성이 달라 '메소드 오버로딩' 개념이 적용되기 때문이다.
public boolean deposit(double amount, double exchangeRate) {
return deposit((int) (amount * exchangeRate));
}
콘솔 출력
생각해보면 지금까지 써왔던 System.out.println도 파라미터를 굉장히 다양하게 받는다. 이게 다 '메소드 오버로딩'이다.
System.out.println(5); // 정수 파라미터
System.out.println(3.14); // 소수 파라미터
System.out.println("hello"); // 문자열 파라미터
System.out.println(true); // 불린 파라미터
5
3.14
hello
true
실습과제
계좌 이체
지금까지 만들어 온 은행 시뮬레이션 프로그램에 송금 기능을 담당하는 transfer 메소드를 써보자.
메소드 오버로딩의 개념을 이용해서 BankAccount 클래스에 두 개의 transfer 메소드를 쓰고, Person 클래스에도 두 개의 transfer 메소드를 쓰겠다.
송금 메소드 작성(BankAccount.java)
송금은 계좌 - 계좌 방식으로 이루어진다. 하지만 사용자의 편리함을 위해서 아래의 두 메소드를 만들겠다.
public class BankAccount {
// 저번 과제에서의 코드를 포함해주세요!
// 첫 번째 파라미터: 받는 사람 (Person)
// 두 번째 파라미터: 이체할 금액 (정수)
// 리턴 : 성공여부 (불린)
public boolean transfer(Person to, int amount) {
// insert code here
}
// 첫 번째 파라미터: 받는 사람의 계정 (BankAccount)
// 두 번째 파라미터: 이체할 금액 (정수)
// 리턴 : 성공여부 (불린)
public boolean transfer(BankAccount to, int amount) {
// insert code here
}
}
(1) 송금 성공 시 true를 리턴, 실패시 false를 리턴한다.
(2) 송금하고자 하는 금액(amount)이 음수일 때 송금 실패이다.
(3) amount가 잔고(balance)보다 클 때 송금 실패이다.
(4) 나의balance를 amount 만큼 줄이고, 받는사람(to)의 balance를 amount만큼 늘려준다.
(5) 송금 성공시 아래 문구를 출력한다:
true - from: [송금자 이름], to: [수신자 이름], amount: [송금액], balance: [송금자 잔고]
(6) 송금 실패시 아래 문구를 출력한다:
false - from: [송금자 이름], to: [수신자 이름], amount: [송금액], balance: [송금자 잔고]
송금 메소드 작성(Person.java)
위의 룰들을 지킨 송금 메소드를 Person 클래스 내에도 만든다.
public class Person {
// 저번 과제에서의 코드를 포함해주세요!
// 첫 번째 파라미터: 받는 사람 (Person)
// 두 번째 파라미터: 이체할 금액 (정수)
// 리턴 : 성공여부 (불린)
public boolean transfer(Person to, int amount) {
// insert code here
}
// 첫 번째 파라미터: 받는 사람의 계정 (BankAccount)
// 두 번째 파라미터: 이체할 금액 (정수)
// 리턴 : 성공여부 (불린)
public boolean transfer(BankAccount to, int amount) {
// insert code here
}
}
테스트
true - from: 문종모, to: 김신의, amount: 200000, balance: 300000
true - from: 김신의, to: 문종모, amount: 150000, balance: 150000
true - from: 문종모, to: 김신의, amount: 270000, balance: 180000
true - from: 김신의, to: 문종모, amount: 130000, balance: 290000
과제 해설
우리가 만들어야 할 메소드는 총 4개이다.
- BankAccount 클래스에 transfer(Person to, int amount)
- BankAccount 클래스에 transfer(BankAccount to, int amount)
- Person 클래스에 transfer(Person to, int amount)
- Person 클래스에 transfer(BankAccount to, int amount)
넷 다 같은 송금 기능을 담당하지만, 각각 다른 클래스에 다른 파라미터를 가지고 있다.
다 비슷하기 때문에 일단 하나만 작성해놓으면 다른 메소드들은 간단하게 해결할 수 있다.
실제 송금은 계좌와 계좌 사이에 이루어지는 것이기 때문에 먼저 2번 메소드를 작성하도록 한다.
BankAccount에 transfer(BankAccount to, int amount)
public class BankAccount {
.
.
.
public boolean transfer(BankAccount to, int amount) {
// 작성해야 함
}
}
먼저 성공 여부를 보관하는 불린 변수 success를 정의한다.
만약에 성공 조건에 잘 맞으면 success에 true를 지정해주고, 그렇지 않으면 false를 지정해주면 되겠다.
마지막에는 success의 값을 리턴해주면 된다.
public class BankAccount {
.
.
.
public boolean transfer(BankAccount to, int amount) {
boolean success;
if () {
success = false;
} else {
success = true;
}
return success;
}
}
문제에 맞게 if문의 조건 부분을 채워 보도록 한다.
실패의 경우는 이 둘이다.
- 송금하고자 하는 금액(amount)이 음수일 때(amount < 0)
- amount가 잔고(balance)보다 클 때(amount > balance)
두 경우 중 하나만 성립되어도 실패이기 때문에 if문의 조건 부분은 amount < 0 || amount > balance가 되겠다.
public class BankAccount {
.
.
.
public boolean transfer(BankAccount to, int amount) {
boolean success;
if (amount < 0 || amount > balance) {
success = false;
} else {
success = true;
}
return success;
}
}
이제 실제 송금이 이루어지는 부분을 작성하자. 실패가 아닌 부분이므로 else문의 수행 부분에 작성하면 된다.
보내는 계좌의 balance를 amount 만큼 줄이고, 받는 계좌의 balance를 amount만큼 늘려준다.
balance -= amount;
to.balance += amount;
이렇게 적어주면 될 것이다. 출력 메소드까지 포함한, 완성된 코드는 아래와 같다.
public class BankAccount {
.
.
.
public boolean transfer(BankAccount to, int amount) {
boolean success;
if (amount < 0 || amount > balance) {
success = false;
} else {
balance -= amount;
to.balance += amount;
success = true;
}
System.out.println(success + " - from: " + owner.getName()
+ ", to: " + to.owner.getName()
+ ", amount: " + amount
+ ", balance: " + balance);
return success;
}
}
나머지 메소드 3개
아까 말한 것처럼 하나를 써놓으면 나머지는 어렵지 않다. 나머지 세 메소드에서 방금 쓴 메소드를 호출하면 되기 때문이다.
BankAccount.java
public class BankAccount {
.
.
.
public boolean transfer(BankAccount to, int amount) {
boolean success;
if (amount < 0 || amount > balance) {
success = false;
} else {
balance -= amount;
to.balance += amount;
success = true;
}
System.out.println(success + " - from: " + owner.getName()
+ ", to: " + to.owner.getName()
+ ", amount: " + amount
+ ", balance: " + balance);
return success;
}
// account와 account 간의 거래이므로, Person to의 정보를 to의 account 정보로 바꾸어 호출.
public boolean transfer(Person to, int amount) {
return transfer(to.getAccount(), amount);
}
}
Person.java
public class Person {
.
.
.
// account와 account 간의 거래이므로, 첫째로 BankAccount 클래스의 transfer 메소드를 써야함.
// 둘째로 Person to의 정보를 to의 account 정보로 바꾸어 호출.
public boolean transfer(Person to, int amount) {
return account.transfer(to.getAccount(), amount);
}
// account와 account 간의 거래이므로, BankAccount 클래스의 transfer 메소드를 써야함.
public boolean transfer(BankAccount to, int amount) {
return account.transfer(to, amount);
}
}
Person 클래스의 public boolean transfer(Person to, int amount) 메소드의 경우, 내부를 아래처럼 작성할 수도 있다.
public boolean transfer(Person to, int amount) {
return account.transfer(to, amount);
}
둘의 차이가 무엇인지에 대해서 한 번 고민해보자.
전자는 BankAccount 클래스에 있는 transfer(BankAccount to, int amount) 2번 메소드를 호출하여 정의한 것이고,
후자는 BankAccount 클래스에 있는 transfer(Person to, int amount) 1번 메소드를 호출하여 정의한 것이다.
BankAccount.java
public class BankAccount {
// 저번 과제에서의 코드!
private int balance;
private Person owner;
public void setBalance(int pBalance) {
balance = pBalance;
}
public int getBalance() {
return balance;
}
public void setOwner(Person pOwner) {
owner = pOwner;
}
public Person getOwner() {
return owner;
}
// 파라미터 : 입금할 액수(정수)
// 리턴 : 성공여부(불린)
boolean deposit(int amount) {
// 1. write code here
if (amount < 0 || owner.getCashAmount() < amount) {
System.out.print("입금 실패입니다. 잔고: " + balance + "원, 현금: " + owner.getCashAmount() + "원");
return false;
} else {
balance += amount;
owner.setCashAmount(owner.getCashAmount() - amount);
System.out.print(amount + "원 입금하였습니다. 잔고: " + balance + "원, 현금: " + owner.getCashAmount() + "원");
return true;
}
}
// 파라미터 : 출금할 액수(정수)
// 리턴 : 성공여부(불린)
boolean withdraw(int amount) {
// 2. write code here
if (amount < 0 || balance < amount) {
System.out.print("출금 실패입니다. 잔고: " + balance + "원, 현금: " + owner.getCashAmount() + "원");
return false;
} else {
balance -= amount;
owner.setCashAmount(owner.getCashAmount() + amount);
System.out.print(amount + "원 출금하였습니다. 잔고: " + balance + "원, 현금: " + owner.getCashAmount() + "원");
return true;
}
}
// 첫 번째 파라미터: 받는 사람 (Person)
// 두 번째 파라미터: 이체할 금액 (정수)
// 리턴 : 성공여부 (불린)
// account와 account 간의 거래이므로, Person to의 account 정보로 바꾸어 호출.
public boolean transfer(Person to, int amount) {
// insert code here
return transfer(to.getAccount(), amount);
}
// 첫 번째 파라미터: 받는 사람의 계정 (BankAccount)
// 두 번째 파라미터: 이체할 금액 (정수)
// 리턴 : 성공여부 (불린)
public boolean transfer(BankAccount to, int amount) {
// insert code here
boolean success;
if (amount < 0 || amount > balance) {
success = false;
} else {
balance = balance - amount;
to.balance = to.balance + amount;
success = true;
}
System.out.println(success + " - from: " + owner.getName() + ", to: " + to.owner.getName() + ", amount: " + amount + ", balance: " + balance);
return success;
}
}
Main.java
public class Main {
public static void main(String[] args) {
// 사람 1
Person p1 = new Person();
p1.setName("김신의");
p1.setAge(28);
p1.setCashAmount(30000);
// 은행 계좌 1
BankAccount a1 = new BankAccount();
a1.setBalance(100000);
p1.setAccount(a1);
a1.setOwner(p1);
// 사람 2
Person p2 = new Person();
p2.setName("문종모");
p2.setAge(25);
p2.setCashAmount(100000);
// 은행 계좌 2
BankAccount a2 = new BankAccount();
a2.setBalance(500000);
p2.setAccount(a2);
a2.setOwner(p2);
// 계좌 이체 테스트
a2.transfer(a1, 200000);
a1.transfer(p2, 150000);
p2.transfer(a1, 270000);
p1.transfer(p2, 130000);
}
}
Person.java
public class Person {
// 저번 과제에서의 코드!
private String name;
private int age;
private int cashAmount;
private BankAccount account;
public void setName(String pName) {
name = pName;
}
public String getName() {
return name;
}
public void setAge(int pAge) {
if (pAge >= 0) {
age = pAge;
}
}
public int getAge() {
return age;
}
public void setCashAmount(int pCashAmount) {
cashAmount = pCashAmount;
}
public int getCashAmount() {
return cashAmount;
}
public void setAccount(BankAccount pAccount) {
account = pAccount;
}
public BankAccount getAccount() {
return account;
}
// 첫 번째 파라미터: 받는 사람 (Person)
// 두 번째 파라미터: 이체할 금액 (정수)
// 리턴 : 성공여부 (불린)
// account와 account 간의 거래이므로, 첫째로 BankAccount 클래스의 transfer 메소드를 써야함.
// 둘째로 Person to의 정보를 to의 account 정보로 바꾸어 호출.
public boolean transfer(Person to, int amount) {
// insert code here
return account.transfer(to.getAccount(), amount);
}
// 첫 번째 파라미터: 받는 사람의 계정 (BankAccount)
// 두 번째 파라미터: 이체할 금액 (정수)
// 리턴 : 성공여부 (불린)
// account와 account 간의 거래이므로, BankAccount 클래스의 transfer 메소드를 써야함.
public boolean transfer(BankAccount to, int amount) {
// insert code here
return account.transfer(to, amount);
}
}
생성자 정리
'생성자(Constructor)'는 크게 두 가지 역할이 있다:
- 인스턴스를 만들고
- 인스턴스의 속성(인스턴스 변수)들을 초기화시켜준다.
기본 생성자
생성자를 한 개도 정의 안 했을 경우에는 자바에서 자동으로 기본 생성자를 제공해준다. (우리도 사용했었다.)
Person p1 = new Person();
생성자 정의
생성자를 하나라도 정의하면 위의 기본 생성자는 사용할 수 없다.
public class Person {
String name;
int age;
public Person(String pName, int pAge) {
name = pName;
age = pAge;
}
}
파라미터 두 개를 받는 생성자를 작성했다. 그러면 원래는 이렇게 썼던 것을:
public static void main(String[] args) {
Person p1 = new Person();
p1.setName("김신의");
p1.setAge(27);
}
이렇게 바꿀 수 있다:
public static void main(String[] args) {
Person p1 = new Person("김신의", 27);
}
그러면 Person 인스턴스가 생성되고, 그 인스턴스의 변수 name에 "김신의"가 지정되고, 변수 age에 27이 지정된다.
한번에 모든 인스턴스 변수의 초기값을 설정할 수 있게 된 것이다.
오버로딩
파라미터의 구성을 다르게 하면 같은 이름의 메소드를 여러 개 정의할 수 있다.
이 개념을 '메소드 오버로딩'이라고 했었는데, 마찬가지로 생성자 오버로딩도 가능하다.
public Person(String pName, int pAge) {
name = pName;
age = pAge;
}
public Person(String pName) {
name = pName;
age = 12; // 12살을 기본 나이로 설정
}
파라미터 하나만 받는 생성자도 작성했다. 그러면 어떤 파라미터를 넘기느냐에 따라 어떤 생성자가 사용될지 정해진다.
public static void main(String[] args) {
Person p1 = new Person("김신의", 27); // 첫 번째 생성자
Person p2 = new Person("박윤석"); // 두 번째 생성자
System.out.println(p1.name);
System.out.println(p1.age);
System.out.println(p2.name);
System.out.println(p2.age);
}
김신의
27
박윤석
12
실습과제
생성자 연습
두 클래스에 생성자를 만들어 보자.
Person 클래스
Person의 생성자 2개를 만들 것이다.
(1) 파라미터로 '이름'을 뜻하는 String형 값 pName과 '나이'를 뜻하는 int형 값 pAge를 받고 초기값을 설정한다. 인스턴스 변수 cashAmount은 0으로 시작한다. 단, pAge가 음수면 인스턴수 변수 age는 12로 설정한다.
public Person(String pName, int pAge) {
// 코드를 입력하세요
}
(2) 파라미터로 '이름'을 뜻하는 String형 값 pName, '나이'를 뜻하는 int형 값 pAge, 그리고 '보유 현금'을 뜻하는 int형 값 pCashAmount를 받고 초기값을 설정한다. (1)번과 마찬가지로 pAge가 음수인 경우에는 age를 12로 설정한다. pCashAmount가 음수면 인스턴스 변수 cashAmount를 0으로 설정한다.
public Person(String pName, int pAge, int pCashAmount) {
// 코드를 입력하세요
}
BankAccount 클래스
BankAccount의 생성자 3개를 만들 것이다.
(1) 파라미터로 '잔액'을 뜻하는 int형 값 pBalance를 받는다. 파라미터로 받은 잔액은 음수가 될 수 없다. 음수 입력이 있을 경우 0으로 설정한다.
public BankAccount(int pBalance) {
// 코드를 입력하세요
}
(2) 파라미터로 '소유자'를 뜻하는 Person형 값 pOwner를 받는다. pOwner를 인스턴스 변수 owner에 지정해주고, 잔액은 0으로 시작한다.
public BankAccount(Person pOwner) {
// 코드를 입력하세요
}
3) 파라미터로 '잔액'을 뜻하는 int형 값 pBalance와 '소유자'를 뜻하는 Person형 값 pOwner를 받는다. 마찬가지로 balance와 owner를 설정해주고, 파라미터로 받은 잔액이 음수인 경우에는 balance를 0으로 설정한다.
public BankAccount(int pBalance, Person pOwner) {
// 코드를 입력하세요
}
테스트
Main 클래스의 main 메소드에:
- Person의 1번 생성자를 사용해서 인스턴스 p1을 만듭니다. 생성 후 보유 현금은 30000으로 재설정해줍니다.
- Person의 2번 생성자를 사용해서 인스턴스 p2를 만듭니다. 보유 현금 초기값은 100000으로 설정해줍니다.
- BankAccount의 2번 생성자를 사용해서 인스턴스 a1을 만듭니다. 파라미터로 p1을 넘겨줘서 p1과 a1을 연결해줍니다. 생성 후 잔액을 100000으로 재설정해줍니다.
- BankAccount의 3번 생성자를 사용해서 인스턴스 a2을 만듭니다. 파라미터로 p2을 넘겨줘서 p2과 a2을 연결해줍니다. 잔액 초기값은 500000입니다.
위의 지시에 따라 프로그램을 수정하여 오류가 나오지 않도록 하고, 테스트 케이스는 유지하여 이전 문제와 같이 아래의 출력값이 나오도록 해야 한다.
true - from: 문종모, to: 김신의, amount: 200000, balance: 300000
true - from: 김신의, to: 문종모, amount: 150000, balance: 150000
true - from: 문종모, to: 김신의, amount: 270000, balance: 180000
true - from: 김신의, to: 문종모, amount: 130000, balance: 290000
this 정리
'~2023.02 > Java' 카테고리의 다른 글
[자바의 정석] 지네릭스(Generics) (0) | 2022.06.25 |
---|---|
객체지향 프로그래밍 정리 (0) | 2022.03.19 |
자바 기초 _ [토픽2] 자바 객체 지향 프로그래밍 _ 객체 만들기 (0) | 2021.12.29 |
자바 기초 _ [토픽1] 자바 왕기초 _ 배열 (0) | 2021.12.29 |
자바 기초 _ [토픽1] 자바 왕기초 _ 조건문과 반복문 (0) | 2021.12.29 |