상속(inheritance)
는 재산 등을 친족에게 물려주는 행위를 말합니다. 쉽게 말해서 부모님이 자식에게 재산을 물려주는 것이죠.
객체지향 프로그래밍(자바)에서 상속
은 부모 클래스의 멤버를 자식 클래스에게 물려주는 것을 의미합니다. 상속
을 이용하면 코드의 중복을 없앨 수 있고 각 클래스의 유지보수를 쉽게 만들어준다는 장점이 있습니다.
부모 클래스는 슈퍼 클래스, 상위 클래스, 조상 클래스, 기반 클래스
자식 클래스는 서브 클래스, 하위 클래스, 자손 클래스, 파생 클래스같은 이름으로 불리기도 합니다.여기에서는 부모 클래스와 자식 클래스라는 용어를 사용하도록 하겠습니다.
상속
은 extends
키워드를 통해 한 가지 클래스만을 선택해 상속받습니다.
class 자식 클래스 extends 부모 클래스 {}
상속 관계에서 부모 클래스의 변경은 자식 클래스에 영향을 주지만, 반대로 자식클래스의 변경은 부모 클래스의 변경에 어떠한 영향도 주지 않습니다. 어떻게 보면 부모 클래스에서 시작해서 자식으로 갈수록 멤버가 늘어나게 됩니다. 따라서 이를 클래스의 확장이라고도 볼 수 있기에 extends
라는 키워드를 사용하는 것 입니다.
또한 상속
을 하게되면 멤버 변수(필드)와 메소드만을 상속받을 수 있고 생성자는 상속되지 않습니다.
다음은 상속의 예시입니다. 어떤 집단의 멤버를 나타내는 Member 클래스입니다. Member 클래스는 해당 인물의 이름인 멤버 변수 name만을 가지고 있습니다.
public class Member {
String name;
public Member() {}
}
Member 클래스를 학교에서 사용하기 위해 Student 클래스를 만들려고 합니다. 이때 모든 학생들은 이름이라는 공통된 속성을 갖고 있기에 name 속성을 가진 Member 클래스를 상속받습니다.
public class Student extends Member {
int grade;
public Student(String name, int grade) {
this.name = name;
this.grade = grade;
}
public void printStudentInfo() {
System.out.println("이름: " + name + "/n" + "학년: " + grade);
}
}
상속을 통해 Member 클래스로부터 name 멤버 변수를 받아오기 때문에 name을 선언하지 않고도 사용할 수 있습니다.
public static void main(String[] args) {
Student student = new Student("김사과", 1);
student.printStudentInfo();
}
상속
에서 자식 클래스만 생성하는 것 같지만 사실은 아닙니다. 내부적으로는 부모 클래스가 먼저 생성된 후 자식 클래스가 생성됩니다. 더 정확하게는 자식 클래스 생성자에서 부모 클래스 생성자를 호출하여 부모 클래스의 객체를 생성 후 자식 클래스를 생성
합니다.
자식 클래스에서 부모 클래스를 생성하는 메소드가 super()
입니다.
기본적으로 super()
는 적어주지 않아도 자식 클래스 생성자의 첫 줄에 숨겨져있어서 자동으로 수행됩니다. 이때 super()
가 호출하는 것은 부모 클래스의 기본 생성자입니다. 만약 특정 생성자를 호출하고 싶다면 super()
에 인수를 전달하면 해당 매개변수 개수와 일치하는 생성자를 찾아서 호출해줍니다.
조금 전에 만들었던 Member 클래스의 기본 생성자에 콘솔 출력 println()을 추가해준 코드입니다. 나머지는 그대로 사용했습니다.
public class Member {
String name;
public Member() {
System.out.println("Member 클래스 기본 생성자 호출");
}
}
이렇게 해두면 Member 클래스의 기본 생성자가 호출될 때 메세지가 호출됩니다.실행 코드에서는 어디에서도 Member를 호출한 적이 없는데도, Member클래스의 기본 클래스가 숨겨진 super()
에 의해 호출되었음을 볼 수 있습니다.
자바의 클래스 간의 관계도를 그리면 언제나 최상위 클래스로는 Object
가 존재합니다. 그리고 상속 관계에 속하지 않는 클래스는 이 Object 클래스를 상속하고 있습니다.
즉, 우리가 그동안 상속을 하지 않았던 클래스였더라도 자동적으로 Object를 상속하고 있었던 것 입니다.