2020-11-28
상속 : 현실세계에서는 부모의 재산을 자식이 물려받는 뜻으로 쓰이고는 한다. 자바에서도 그 의미가 크게 다르지 않는데, 한 번 알아보도록 하자.
자바에서의 상속은 부모 클래스의 멤버(필드, 메서드)를 자식 클래스가 상속받아 그대로 사용할 수 있다. (다만 상속 시 부모 클래스에서 private 접근 제한을 갖는 필드와 메서드는 상속이 이루어지지 않는다.)
아래 코드를 살펴보자.
package Family상속;
public class parent {
String name;
int age;
parent(String name, int age){
this.name = name;
this.age = age;
}
void info(){
System.out.println("저의 이름은 " + name + "이고 나이는 " + age + "입니다.");
}
}
위의 코드는 부모클래스로써 자식에게 물려줄 클래스이다. 두 가지의 필드와 이름을 초기화시키는 생성자, 간단한 필드 정보를 출력하는 메서드가 있는 것을 확인할 수 있다.
package Family상속;
public class child_One extends parent{
String sex;
child_One(String name, int age, String sex) {
super(name, age);
//부모 클래스에 정해진 생성자가 없으면 생략해도 되나,
//정해진 생성자가 있을 경우에는 꼭 super 통해 자식또한 생성자를 만들어 주어야 한다.
this.sex = sex;
}
@Override
void info(){
if(sex.equals("아들") || sex.equals("딸")) {
System.out.println("저의 이름은 " + name + "이고 나이는 " + age + "입니다. 아! 그리고 저는 " + sex + "입니다.");
}else{
super.info();
}
}
}
위의 코드는 부모클래스를 물려받은 자식 클래스이다. 필드의 경우 하나가 추가되었으며, 생성자를 살펴보면 부모 클래스의 필드를 물려받아 초기화시켜주는 것을 확인할 수 있다. 주석에도 나와 있듯이 부모 클래스의 명시된 생성자가 있을 시 super를 사용하여, 물려받은 필드라는 것을 표현해 주어야 한다.
메서드의 경우 Override 하여 새로운 기능을 추가시켜주었다. 필드에 성별이 추가된 만큼 해당 내용도 같이 출력될 수 있게 변경하였다.
실행(메인) 클래스로 가서 해당 내용이 정상적으로 출력되는지 살펴보자.
package Family상속;
import java.util.Scanner;
public class main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//상속 구문 테스트 해보기
while(true) {
System.out.println("-----------------------------------------------");
System.out.println("프로그램 종료를 원하시면 0번 진행을 원하시면 1번을 눌러주세요.");
int start = scan.nextInt();
if(start == 0) {System.out.println("프로그램을 종료합니다.");}
else {System.out.println("프로그램을 실행합니다.");}
System.out.println("이름 / 나이 / 아들인지 딸인지 입력해 주세요.");
System.out.println("자신이 부모일 경우 아들 딸 항목에 부모라고 적어주세요");
child_One one = new child_One(scan.next(), scan.nextInt(), scan.next());
one.info();
}
}
}
간단한 정보를 입력받고 해당 정보를 출력하는 프로그램을 만들었다. 코드에서 확인할 수 있듯이 Scanner를 통해 콘솔 창에 1번을 입력하면, 프로그램이 실행되며, 이후 상속받은 자식 클래스에 생성자에 데이터를 입력하는 방식이다. 만약 상속이 이루어지지 않았으며, 컴파일 오류 메시지가 발생했겠지만, 정상적으로 상속이 이루어져 자식 클래스에서 Override 한 메서드가 출력되는 것을 확인할 수 있다.