상속은 부모가 가지는 재신을 자식에게 물려주는 행동을 말하며, 자바에서는 부모 클래스가 가지는 멤버 변수, 멤버 메소드를 자식 클래스에게 물려주는 행동을 의미한다.
상속은 부모 클래스에 있는 100% 모든 내용을 복사해서 자식 클래스에 붙여넣기 하는 것으로 이해할 수 있다. 이때 중요한 것은 넘겨준다는 것이 복사 붙여넣기를 의미한다는 점이다.
이러한 코드 재사용의 상속의 특징으로 인해 비용 절감이 가능해진다.
💡상속 관계에 있는 클래스 호칭
상속을 어떤 목적으로 하느냐에 따라 부르는 말이 조금씩 달라진다.
1. 부모 클래스 <- 자식 클래스
2. 슈퍼 클래스 <- 서브 클래스
Parent 클래스가 위에 있고, Child 클래스가 아래에 있기 때문에 Parent 클래스를 슈퍼 클래스, Child 클래스를 서브 클래스라고 부른다.
3. 기본 클래스 <- 확장 클래스
4. 기본 클래스 <- 파상 클래스
💡상속의 종류
자바는 다중 상속을 허용하지 않는다. 다중 상속은 개발 과정을 복잡하게 하여 개발자들을 힘들게 하는 기술 중에 하나였는데, 자바나 C#같은 언어들은 다중 상속을 지원하지 않게 되었다.
다만 인터페이스에 한해서 다중 상속을 허용한다.
1. 단일 상속
자식 클래스 기준으로 부모 클래스가 1개이다.
2. 다중 상속
자식 클래스 기준으로 부모 클래스가 2개 이상이다.
💡상속 관계 구축 (부모 자식 관계)
부모 자식 관계를 표시하는 방법으로 부모가 자식을 보고 자기 자식이라고 가리키거나 자식이 부모를 보고 자기 부모라고 가리키는 방법을 생각할 수 있다. 이때 부모 클래스부터 만들어지고, 자식 클래스를 만들어지므로 나중에 태어난 자식 클래스가 부모 클래스를 가리키는 방법으로 사용하고 있다.
관계를 표시하는 방법은 자식 클래스 뒤에 extends를 쓰고, 부모 클래스가 될 클래스의 이름을 쓰면 된다. 여기서 extends는 확장이라는 의미지만, 통상적으로 상속이라고 부른다.
그럼 Parent 클래스와 Child 클래스를 만들고, 두 클래스를 부모 자식 관계로 묶어보도록 하자.
public class Ex_Inheritance {
public static void main(String[] args) {
Parent p = new Parent();
p.a = 10;
p.b = 20;
Child c = new Child();
c.a = 10; // 부모 클래스가 물려 준 멤버 변수 a
c.b = 20; // 부모 클래스가 물려 준 멤버 변수 b
c.parentMethod(); // 부모 클래스가 물려 준 멤버 메소드
}
}
// 부모 클래스
class Parent {
public int a;
public int b;
public void parentMethod() {
System.out.println("부모가 구현한 메소드");
}
}
// 자식 클래스
class Child extends Parent {
public int c;
public int d;
public void childMethod() {
System.out.println("자식이 구현한 메소드");
}
}
클래스 안의 멤버변수는 private로 만들어야 하긴 하지만, 그러면 getter와 setter도 만들어야 하므로 간단하게 설명하기 위해 public으로 선언하였다.
그리고 이와 같이 부모가 물려준 것 외에도 자식 클래스가 따로 멤버를 구현할 수 있는데, 자식 클래스는 겉으로 보기에 멤버가 변수 c, d, 메소드 childMethod()까지 3개만 있는 듯 하지만, 사실은 부모가 물려준 것까지 합하면 6개이다.
💡상속의 활용
// 요구사항 (회원 클래스)
// 1. 일반 회원
// - 이름
// - 아이디
// - 암호
// - 이메일
// 2. 관리자 회원
// - 이름
// - 아이디
// - 암호
// - 등급
// 부모 클래스
class Member {
public String name;
public String id;
public String pw;
}
// 일반 회원
class User extends Member {
public String email;
}
// 관리자 회원
class Administrator extends Member {
public String name;
public String id;
public String pw;
public String lv;
}
일반 회원과 관리자 회원 클래스를 만드는데 이름(name), 아이디(id), 암호(pw) 멤버 변수가 회원으로서 가지는 공집합이다. 공통적인 부분을 상속을 이용하여 재사용할 수 있게 바꿔야 한다.
이 코드를 통해 알 수 있는 점은 부모는 자식을 여러 명 가질 수 있고, 부모가 가질 수 있는 자식 수에는 제한이 없다는 점이다.
상속의 중복 사용
class AAA {
public int a = 10;
}
class BBB extends AAA {
public int b = 20;
}
class CCC extends BBB {
public int c = 30;
}
class DDD extends CCC {
public int d = 40;
}
이전에는 부모와 자식에서 끝났는데, 그 밑에 세대가 하나 더 생겼다. 그러자 조부모, 부모, 자식 관계가 형성되었다.
이처럼 자식 클래스가 부모 클래스가 되는 것이 가능하며, 세대와 상관없이 계속 물려받을 수 있다.