상속받은 CheckingAccount 클래스의 슈퍼클래스인 Account 클래스에 생성자가 있었다면 어떻게 될까?

예)


public class 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;
 }
}



public class CheckingAccount extends Account {
 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

+ Recent posts