객체지향 프로그래밍을 하는 자바에서는 하위 클래스에서 부모(상위)클래스의 멤버를 물려받는 것을 의미한다
즉, 자식(하위클래스)이 부모(상위클래스)의 변수와 메소드를 선택해서 가져오는 것이며 생성자를 상속하는 것은 아니다
public class Name {
int a;
void run() {}
}
public class Student extends Name {
String name;
void method(){}
}
위의 코드에서 보는 것처럼 extends 키워드를 사용해서 Name 클래스를 상속받는다
상속을 하면 어떤 점이 좋을까?
먼저, 상속을 하면 부모 클래스의 필드와 메소드를 그대로 가져와 사용할 수 있기 때문에 새로은 코드를 작성할 필요가 없으며 유지 보수 또한 편리하다
그렇다면 모든 부모 클래스를 상속받을 수 있을까?
public class Date extends Student, Timetable {
}
먼저 자바는 다중 상속을 허용하지 않기 때문에 위의 코드처럼 Student와 Timetable이라는 복수의 클래스를 상속받을 수는 없다
반드시 하나의 부모 클래스만 상속받을 수 있으며 상속 받을 수 있는 부모 클래스에는 제한이 있다
private으로 설정된 필드와 메소드는 상속할 수 없으며 default 필드와 메소드도 다른 패키지에서는 상속할 수 없다
public class Tab {
String model;
String name;
void runOn() {
System.out.println("start");
}
void voiceOn() {
System.out.println("start voice");
}
void sendMessage() {
System.out.println("start message");
}
}
부모클래스인 Tab을 만들고 하위 클래스인 SmartTab 에서 상속을 받아보자
public class SmartTab extends Tab {
int year;
//생성자 추가
SmartTab(String model, String name, int year) {
this.model = model;
this.name = name;
this.year = year;
}
void turnOnSmartTab() {
System.out.println("start smart tab");
}
void turnOffSmartTab() {
System.out.println("off smart tab");
}
}
SmartTab 클래스는 extends 키워드로 부모 클래스인 Tab의 필드와 메소드를 그대로 상속받는다
상속과는 별개로 void turnOnSmartTab() 과 void turnOffSmartTab() 메소드도 추가했다
public class TabExample {
public static void main(String[] args) {
SmartTab myTab = new SmartTab("sam", "sam-tap", 2010);
System.out.println(myTab.model);
myTab.voiceOn();
myTab.sendMessage();
}
}
SmartTab 객체를 생성해서 Tab의 필드와 메소드를 그대로 호출할 수 있다
여기서 참조변수인 myTab은 자식객체인 SmartTab을 참조한다
public class People {
public String name;
public String job;
public People(String name, String job) {
this.name = name;
this.job = job;
}
}
위의 people 클래스는 기본생성자가 아닌 매개변수를 받는 생성자가 있다
public class Child extends People {
}
Child라는 하위 클래스를 생성하고 People 클래스를 상속받으면 이클립스에 다음과 같은 에러 메시지가 뜬다
Implicit super constructor People() is undefined for default constructor. Must define an explicit constructor
이 에러메시지의 뜻은 부모클래스에 기본 생성자가 없다는 뜻이다
public class Child extends People {
public Child() {
super("sally", "doctor");
}
}
위의 코드처럼 부모 클래스 생성자의 매개변수를 확인해서 super 생성자를 따로 만들어 호출해야 한다
public class Child extends People {
public int age;
public Child(String name, String job, int age) {
super("name", "job");
this.age = age;
}
}
super 생성자는 맨 첫줄에 와야한다
public class ChildExample {
public static void main(String[] args) {
Child c = new Child("Sally", "doctor", 10);
System.out.println(c.name);
System.out.println(c.job);
System.out.println(c.age);
}
}
실행을 하면 부모 클래스의 생성자가 먼저 실행되는 것을 확인할 수 있다