매일 매일 미라클 코딩
[JAVA] 상속과 생성자 (feat. super()) 본문
은행 계좌를 만들면, 그를 통해 여러가지 금융활동을 할 수 있습니다.
카드를 발급하고, 증권계좌와 연결하고, 보험상품도 구매할 수 있지요.
다양한 활동이지만 그 기본이 되는 것은 계좌번호, 잔액이라는 데이터이고. 입금과 출금이라는 기능임을 알 수 있습니다.
이처럼 공통된 기능을 연관된 클래스에서 받아서 쓸 수 있는 것이 바로 상속입니다.
기계의 작동원리인 전원켜기, 동작하기, 전원켜기를 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 처럼 상위클래스의 인스턴스 변수를 호출할 때도 쓰입니다.
헷갈리던 키워드였는데 직접 상속을 받아 사용하면서,
이런 상황에 쓰는 것이구나, 필요해서 만들었구나(?) 를 체감하게 되었습니다.
공통 기능을 받아 쓸 수 있도록 하는 만큼 주의해야할 사항도 많지만
프로그램이 복잡해질 수록 효율성과 재사용성을 높여주는 상속 이었습니다.
'BackEnd > JAVA' 카테고리의 다른 글
[자료구조] 해쉬(Hash)구조 - Set 과 Map (0) | 2021.03.26 |
---|---|
오버라이딩 VS 오버로딩, 그리고 super. / this. (0) | 2020.12.07 |
생성자(Constructor)의 MBTI 는 '엄격한관리자(ESTJ)' (0) | 2020.12.01 |
배열과 밀고 당기기: 깊은 복사, 얕은 복사 (0) | 2020.11.24 |
[JAVA] 배열로 로또 번호 점지 받기 (중복 없는 랜덤 정수) (0) | 2020.11.17 |