전체 글
- 2016블로그결산 2017.02.06
- 생성자가 있는 슈퍼클래스를 상속하는 방법 2017.02.06
2016블로그결산
생성자가 있는 슈퍼클래스를 상속하는 방법
상속받은 CheckingAccount 클래스의 슈퍼클래스인 Account 클래스에 생성자가 있었다면 어떻게 될까?
예)
String accountNo;
String ownerName;
int balance;
Account(String accountNo, String ownerName, int balance)
{
this.accountNo = accountNo;
this.ownerName = ownerName;
this.balance = balance;
}
void deposit(int amount){
balance += amount;
}
int withdraw(int amount) throws Exception{
if (balance < amount)
throw new Exception("잔액이 부족합니다.");
balance -= amount;
return amount;
}
}
String cardNo;
CheckingAccount (String accountNo, String ownerName, int balance, String cardNo) {
this.accountNo = accountNo;
this.ownerName = ownerName;
this.balance = balance;
this.cardNo = cardNo;
}
int pay(String cardNo, int amount) throws Exception {
if(!cardNo.equals(this.cardNo) || (balance < amount))
{
throw new Exception("지불이 불가능합니다");
}
else
return withdraw(amount);
}
}
컴파일 에러 발생
Implicit super constructor Account() is undefined. Must explicitly invoke another constructor 라는 에러메시지가 뜬다.
위의 에러 메시지는 Account()라는 생성자를 찾을 수 없다고 말하고 있습니다. Account 클래스 no-arg constructor(파라미터를 받지 않는 생성자)를 말하는 거죠. 그리고 이런 컴파일 에러가 CheckingAccount.java의 3행 마지막 부분, 다시 말해서 CheckingAccount 클래스의 생성자 본체가 시작되는 부분에서 발생했다고 표시 하고 있습니다.
왜 이런 컴파일 에러가 발생한 걸까?
이런 컴파일 에러가 발생한 이유는 자바 컴파일러가 컴파일을 할 때 생성자의 첫 번째 명령문이 슈퍼클래스의 생성자 호출문이 아니면 자동으로 슈퍼클래스의 no-arg constructor 호출문을 그 위치에 추가하기 때문 입니다. 그런데 Account 클래스에는 no-arg constructor가 없었기 때문에 컴파일 에러가 발생한 것입니다.
이런 에러가 발생하지 않도록 하려면 두 가지 방법이 있습니다. 첫 번째 방법은 Account 클래스에 no-arg constructor를 추가하는 것입니다. 하지만 객체지향 프로그래밍에서는 슈퍼클래스의 소스 코드를 건드리지 않고 상속받는 것을 원칙으로 하기 때문에 이런 방법은 해결책이라고 할 수 없습니다.
또 다른 방법은 CheckingAccount 클래스의 생성자 안에 슈퍼 클래스의 Account 클래스의 생성자 호출문을 명시적으로 써넣는 것입니다. 자바 컴파일러는 생성자 안에 슈퍼클래스의 생성자 호출문이 있으면 no-arg constructor 호출문을 추가하지 않기 때문입니다. 이 방법은 Account 클래스의 소스 코드를 건드리지 않고도 할 수 있는 방법이기 때문에 올바르 해결책이라고 할 수 있습니다.
그러면 이제 슈퍼클래스의 생성자 호출문 작성 방법을 배워보자.
서브클래스의 생성자 안에서 슈퍼 클래스의 생성자를 호출할 때는 슈퍼클래스의 이름 대신 super 키워드를 써야 합니다.
예를 들면..
super(accountNo, ownerName, balance);
※ 슈퍼클래스의 생성자 호출문은 반드시 생성자의 첫 번째 명령문이어야 합니다.
출처 : 뇌를 자극하는 JAVA 프로그래밍
'프로그램 > Java' 카테고리의 다른 글
public 상속과 private 상속에 대해 (0) | 2017.03.20 |
---|---|
[JAVA] Serializable 과 transient (0) | 2017.02.24 |
자바/Java 자바의 다형성이란? (0) | 2017.02.06 |