다른 클래스의 멤버 변수나 멤버 메서드를 자기 것처럼 물려받아 사용하는 개념이다.
자식 클래스의 객체를 생성하면 부모 클래스의 객체도 같이 생성되며, 부모 클래스의 요소(멤버 변수, 멤버 메서드)를 자기 것처럼 사용할 수 있다.
// 부모 클래스
class SuperClass {
int memberC = 300;
int memberD = 400;
public void superMethod() {
System.out.println("SuperClass의 superMethod 호출");
}
}
// SuperClass를 상속받는다.
class SubClass extends SuperClass {
int memberA = 100;
int memberB = 200;
public void subMethod() {
System.out.printf("memberA : %d\n", memberA);
System.out.printf("memberB : %d\n", memberB);
System.out.printf("memberC : %d\n", memberC);
System.out.printf("memberD : %d\n", memberD);
subMethod2();
superMethod();
}
public void subMethod2() {
System.out.println("SubClass의 subMethod2 호출");
}
}
// 상속에서의 생성자
// 클래스의 객체를 생성하면 생성자가 자동으로 호출된다.
// 이 때, 생성자에서 부모 클래스의 생성자를 자동으로 호출해주며
// 자동으로 호출되는 생성자는 매개변수가 없는 생성자이다.
class SuperClass2 {
public SuperClass2() {
System.out.println("SuperClass2의 기본 생성자");
}
public SuperClass2(int a1) {
System.out.printf("SuperClass2의 매개변수 하나 있는 생성자 : %d\n", a1);
}
}
class SubClass2 extends SuperClass2 {
public SubClass2() {
System.out.println("SubClass2의 기본 생성자");
}
// 만약 매개변수가 있는 생성자를 선택해 객체를 생성한다고 하더라도
// 부모의 생성자 호출을 명시하지 않으면 부모의 생성자 중 매개변수가 없는
// 기본 생성자가 호출된다.
// 만약 부모의 생성자를 선택하고 싶다면 super를 사용한다.
public SubClass2(int a1) {
// 부모의 생성자를 명시적으로 지정한다.
// 이게 없으면 부모 생성자중 기본 생성자가 호출된다.
super(a1);
System.out.printf("SubClass2의 매개변수 하나 있는 생성자 : %d\n", a1);
}
}
1번 내용은 쉽게 알 수 있는 내용이고 2번 내용은 중요하니 밑에서 설명하겠다.
객체 지향에서 다형성의 의미는 생성된 객체의 형태가 다양하다는 의미로 사용한다.
부모 클래스가 가지고 있는 메서드를 자식 클래스에서 다시 구현한 것을 가르킨다.
// SubClass를 가지고 객체를 만들어 SubClass형 변수에 담았기 때문에
// 객체 전체(부모 포함)에 접근할 수 있다.
SubClass sub1 = new SubClass();
// SubClass를 가지고 만든 객체의 ID를 부모클래스 타입의 변수에
// 담았기 때문에 접근할 수 있는 영역은 부모의 영역으로 제한된다.
SuperClass super1 = sub1;
super1.superMethod1();
// SuperClass 타입의 변수이기 때문에 부모의 메서드가 호출되어야 한다.
// 하지만 Overriding을 해서 자식클래스에 재 구현한 메서드가 호출된다.
class SuperClass {
public void superMethod1() {
System.out.println("SuperClass의 superMethod1입니다.");
}
}
class SubClass extends SuperClass {
// 부모 클래스의 메서드를 overriding 한다.
public void superMethod1() {
System.out.println("SubClass의 superMethod1 입니다");
}
}
위에 상속을 하는 이유 2번을 설명하면 부모 클래스형 참조 변수를 통해 객체에 접근하면 부모 클래스의 영역에 접근을 하지만 호출하려는 메서드가 Overriding 된 경우에는 자식 클래스에 재 정의한 메서드가 호출이 된다.
예를 들어보면 버튼을 클릭하는 공통의 메서드를 실행하는데 이 버튼 클릭으로 구매를 하는지, 장바구니에 담는지 등에 따른 구분을 하는데 쓸 수 있다.