은행 Account 클래스
- Day 클래스는 java13 클래스 생성자 다중 생성에서 확인.
class Account {
private static int counter = 0; // 몇 번 까지 식별 번호를 부여했는가
private String name; // 계좌 명의
private String no; // 계좌 번호
private long balance; // 잔고
private Day openDay; // 계좌 개설일
private int id; // 식별 번호
// 인스턴스 초기화 블록
{
id = ++ counter; // 식별 번호
System.out.println("은행 계좌를 개설해주셔서 감사합니다.");
}
// -- 생성자 -- //
public Account(String name, String no, long balance, Day openDay) {
this.name = name;
this.no = no;
this.balance = balance;
this.openDay = new Day(openDay);
}
// 생성자 : 예금액은 0이고 계좌 개설일은 오늘
public Account(String name, String no) {
this(name, no, 0, new Day());
}
public Account(String name, String no, long balance) {
this(name, no, balance, new Day());
}
// -- 계좌 명의 확인 -- //
public String getName() {
return name;
}
public String getNo() {
return no;
}
public long getBalance() {
return balance;
}
public int getId() {
return id;
}
public Day getOpenDay() {
return new Day(openDay);
}
void deposit(long k) { // k원 입금
balance += k;
}
// -- 문자열 표현에 의한 계좌 기본 정보 반환 -- //
public String toString() {
return "{" + name + ", " + no + ", " + balance + "}";
}
} // Account
Account 클래스 계좌를 상속한 정기 예금 클래스 TimeAccount 생성
class TimeAccount extends Account{
private long timeBalance; // 예금잔액
// 생성자
public TimeAccount(String name, String no, long balance, long timeBalance) {
super(name, no, balance);
this.timeBalance = timeBalance;
}
// 정기 예금 잔액 확인
long getTimeBalance() {
return timeBalance;
}
// 정기 예금을 해약하고 전액을 보통 예금으로 이체
void cancel() {
deposit(timeBalance);
timeBalance=0;
}
}
compBalance 메서드 생성과 메인 함수 작성
- 은행 계좌형 변수 a, b의 보통 예금과 정기 예금의 잔고 합계를 비교한 결과를 반환하는 compBalance(Account a, Account b)를 작성하라.
- 합계 금액을 비교하여 a가 많으면 1, 같으면 0, b가 많으면 -1을 반환할 것. 만약 a나 b의 참조 대상이 정기 예금이 없는 Account형 인스턴스이면 보통예금의 합계를 비교할 것.
compBalance 함수
static int compBalance(Account a, Account b) {
long totalBalanceA = a instanceof TimeAccount?
(((TimeAccount)a).getBalance() + ((TimeAccount)a).getTimeBalance()) : a.getBalance();
long totalBalanceB = b instanceof TimeAccount?
(((TimeAccount)b).getBalance() + ((TimeAccount)b).getTimeBalance()) : b.getBalance();
if (totalBalanceA > totalBalanceB)
return 1;
else if (totalBalanceA < totalBalanceB)
return -1;
else
return 0;
} // compBalance
메인 함수
public static void main(String[] args) {
Account doolly = new Account("둘리", "123456", 500);
TimeAccount chulsua = new TimeAccount("철수", "654321", 300, 400);
System.out.println("둘리와 철수의 예금잔액 비교 결과입니다.");
switch(compBalance(doolly, chulsua)) {
case 0: System.out.println("두 사람의 잔액이 같습니다.");
case 1: System.out.println("둘리의 잔액이 많습니다.");
case -1: System.out.println("철수의 잔액이 많습니다.");
}
}
실행 결과
은행 계좌를 개설해주셔서 감사합니다.
은행 계좌를 개설해주셔서 감사합니다.
둘리와 철수의 예금잔액 비교 결과입니다.
철수의 잔액이 많습니다.
A instance of B
참조형 변수 A각 클래스형 B를 암묵적으로 캐스트 할 수 있는 하위클래스이면 true, 그렇지 않으면 false를 생성.
클래스의 파생과 멤버
클래스의 파생으로 상속되는 것은 다음과 같다.
- 필드 - 메서드 - 클래스 - 인터페이스
여기서 클래스와 인터페이스는 클래스 안에 선언된 클래스와 인터페이스를 말한다.
멤버가 아닌 다음의 자원들은 상속되지 않는다.
- 인스턴스 초기화 블록 - 정적 초기화 블록 - 생성자
final 클래스와 메서드
- final 클래스로부터 파생 클래스를 만들 수 없다. 마음대로 서브 클래스를 만들어선 안되는 클래스는 final 클래스로 작성하는 것이 좋다.
- final 메서드는 서브 클래스에서 오버라이드 할 수 없다.
클래스의 접근 제어
- 클래스의 접근 제어는 다음의 2가지로 나눌 수 있다.
- 여기서 멤버는 클래스에 포함된 정적, 비정적 field와 method 모두를 뜻한다.
- public 멤버
패키지와 관계 없이 내부든 외부든 클래스를 사용할 수 있다. public 클래스의 이름과 파일명은 일치해야 한다. - protected 멤버
패키지 내부에서만 이용할 수 있다. 다른 패키지에 속해 있는 클래스에서 호출할 수 없다. 해당 패키지 내부 뿐만 아니라 상속된 다른 패키지의 클래스에서도 사용할 수 있다. - 기본 (선언 없음) 멤버
동일 패키지 내에서만 이용할 수 있다. 다른 패키지에 속하는 클래스에서는 호출할 수 없다. - 비공개(private) 멤버
선언된 클래스 내부에서만 이용할 수 있다. 같은 패키지 내부에서도 호출할 수 없다.
- public 멤버
'Java > Java 기초' 카테고리의 다른 글
Java24 문서화 주석과 JavaDoc (0) | 2020.06.01 |
---|---|
Java23 추상 클래스 (0) | 2020.05.29 |
Java21 참조형의 확대 변환과 축소 변환 (0) | 2020.05.27 |
Java20 클래스 오버라이드와 어노테이션 (0) | 2020.05.26 |
Java19 클래스의 상속과 다형성 (0) | 2020.05.26 |