매일 매일 미라클 코딩

[JAVA] 상속과 생성자 (feat. super()) 본문

BackEnd/JAVA

[JAVA] 상속과 생성자 (feat. super())

뚜벅-뚜벅 2020. 12. 2. 20:13

은행 계좌를 만들면, 그를 통해 여러가지 금융활동을 할 수 있습니다.

카드를 발급하고, 증권계좌와 연결하고, 보험상품도 구매할 수 있지요.

 

다양한 활동이지만 그 기본이 되는 것은 계좌번호, 잔액이라는 데이터이고. 입금과 출금이라는 기능임을 알 수 있습니다. 

 

이처럼 공통된 기능을 연관된 클래스에서 받아서 쓸 수 있는 것이 바로 상속입니다. 

기계의 작동원리인 전원켜기, 동작하기, 전원켜기를 TV, 라디오, 밥솥에 모두 적용할 수 있는데요

이러한 공통된 기능을 각각의 클래스마다 코딩하는 것은 비효율 적인 일일 것입니다 .

 

따라서 기계()라는 상위 클래스를 상속받아 쓰는 하위 클래스들을 만드는 것이지요.

 

저번에 은행 프로그램에서 만든 계좌 클래스를 활용해 상속을 다뤄 보겠습니다. 

 

 

class Account{
	String name;
	int accountNum;
	int money;
	
	public Account(String name, int num, int money) {
		this.name=name;
		accountNum= num;
		this.money = money;
	}
}

 

계좌 클래스 입니다. 이름과 계좌번호, 잔액 정보를 담고 있습니다.

이 정보를 이어 받아 사용할 Card 클래스를 작성해 보겠습니다. 

상속은 extends 키워드를 사용합니다. 

 

class Card extends Account{
	
	int cardNum =0; 
	
	public Card(String name, int num, int money) {
     int cardNum = (int) (math.Random()*10000);
     this.cardNum = cardNum;
	}
	
	public void pay(int money) {
		super.money = super.money- money;
	}
}

카드 객체 생성과 함께 0~10000 사이의 카드번호를 랜덤으로 생성하고 싶습니다.

Card 클래스와 이름과 매개변수가 같은 메소드, 즉 생성자 안에 해당 명령을 삽입했습니다.

 

하지만 이 상태로는 에러가 발생하는 것을 확인 할 수 있습니다.

하위 클래스 객체가 생성될 때, 자바가 자동으로 상위클래스의 생성자를 호출하게 되어있기 때문입니다.

 

하지만 지금 Account 클래스에는 기본생성자 (Account(){} 형태) 가 아닌 매개변수를 가진 생성자가 입력되어있지요.

따라서 자바에서 자동으로 기본생성자를 입력해주지 않습니다.

그렇기 때문에 호출할 상위클래스 생성자가 없다고 판단되어 에러가 발생하는 것이죠.

 

어차피 둘 다 같은 일을 하는 생성자인데, 하위클래스 생성시 부모클래스의 생성자를 갖다 쓰면 되지 않을까요?

이때 필요한 것이 super() 입니다.

 

super()

class Card extends Account{
	
	int cardNum =0; 
	
	public Card(String name, int num, int money) {
		super(name, num, money);
		int cardNum = (int) (Math.random() * 10000);
		this.cardNum = cardNum;
	}
	
	public void pay(int money) {
		super.money = super.money- money;
	}
}

 

super(name, num, money);

행을 삽입해 주었습니다. 

 

super는 부모(상위)클래스를 지칭합니다.

<-> this 자기자신을 가리키는 this와 비슷하면서도 다르다고 볼 수 있겠습니다. 

super(); 는 상위클래스의 생성자를 하위클래스에서 바로 호출하는 명령입니다. 괄호 안에 자식 클래스의 생성자 매개변수를 넣어주면 자식클래스가 인스턴스화 될 때, 같은 역할을 하는 부모클래스의 생성자를 호출해 주지요. 

따라서 부모 클래스의 기본생성자가 호출되지 않는 에러를 피할 수 있는 것입니다.

*하위클래스 생성자의 맨 첫줄에 super를 쓰고, 그다음 초기화에 필요한 코드를 넣어야 합니다

상위클래스가 초기화된 후에야 하위클래스도 초기화 할 수 있기 때문입니다.

 

public class Bank {

	public static void main(String[] args) {
	
	//Account a = new Account("홍길동",1234,10000);
	
	Card mycard = new Card("홍길동",1234,10000);
	
	System.out.println(mycard.name+"님의 잔액은"+ mycard.money+"입니다.");
	
	System.out.println("카드 번호는 "+mycard.cardNum+"입니다.");
	}

 

카드객체 생성으로 계좌까지 만들었음을 확인할 수 있습니다. 

 

 

만약 이렇게 상속을 활용한다면, 카드 뿐 아니라, 계좌를 생성/연동해야하는 모든 금융활동에 대한

클래스를 만들 수 있을 것 입니다. 주식Stock 클래스나 보험Insurance을 만들어 볼 수 있겠네요.

 

super는 this 처럼 상위클래스의 인스턴스 변수를 호출할 때도 쓰입니다.

헷갈리던 키워드였는데 직접 상속을 받아 사용하면서,

이런 상황에 쓰는 것이구나, 필요해서 만들었구나(?) 를 체감하게 되었습니다.

 

 

공통 기능을 받아 쓸 수 있도록 하는 만큼 주의해야할 사항도 많지만

프로그램이 복잡해질 수록 효율성과 재사용성을 높여주는 상속 이었습니다.