반응형
상속
- 자식 클래스는 부모 클래스의 모든 속성을 상속 받고 사용 가능함
- 상속 받은 메소드는 필요에 따라 자식 클래스에서 따로 재정의 할 수 있음 (메소드 오버라이딩)
- 자식 클래스 정의 방식은 '자식클래스이름 extends 부모클래스'로 정의
- 자식 클래스 호출시 부모 클래스도 함께 호출 됨
- 자식 클래스에서 상속 받은 인스턴스 변수는 자식 클래스마다 각각의 이름 공간을 가짐
- 부모 클래스의 메소드 호출시에는 super 키워드를 사용
조부모 / 부모 / 자식 클래스 정의
package ParentsClass;
// 조부모 클래스
public class GrandParent {
protected String gpMsg;
// 호출시 조부모 클래스 생성자 생성 메시지 출력
public GrandParent() {
System.out.println("---The GrandParent constructor has been created.");
}
public void print() {
System.out.println("GrandParent : " + gpMsg);
}
}
// 부모 클래스
public class Parent extends GrandParent {
protected String pMsg;
// 호출시 부모 클래스 생성자 생성 메시지 출력
public Parent() {
System.out.println("---The Parent contructor has been created.");
}
// print 메소드 오버라이딩
public void print() {
super.print(); // 부모 클래스 GrandParent의 print 메소드 호출
System.out.println("Parent : " + pMsg);
}
}
// 자식 클래스
public class Child extends Parent{
public String cMsg;
// 호출시 조부모 클래스 생성자 생성 메시지 출력
public Child() {
System.out.println("---The Child constructor has been created.");
}
// print 메소드 오버라이딩
public void print() {
super.print(); // 부모 클래스 Parent의 print 메소드 호출
System.out.println("Child : " + cMsg);
}
}
메인 클래스에서의 호출
public class ParentsMain {
public static void main(String[] args) {
GrandParent gp = new GrandParent();
gp.gpMsg = "Hello";
gp.print();
// ---The GrandParent constructor has been created.
// GrandParent : Hello
Parent p = new Parent();
p.gpMsg = "Hello";
p.pMsg = "World!";
p.print();
// ---The GrandParent constructor has been created.
// ---The Parent contructor has been created.
// GrandParent : Hello
// Parent : World!
Child c = new Child();
c.gpMsg = "Hello";
c.pMsg = "World!";
c.cMsg = "Bye~";
c.print();
// ---The GrandParent constructor has been created.
// ---The Parent contructor has been created.
// ---The Child constructor has been created.
// GrandParent : Hello
// Parent : World!
// Child : Bye~
}
}
상속 받은 인스턴스 변수는 각각의 독립된 값을 가짐
- 조부모 클래스의 gpMsg 변수의 값을 넣어도 부모 클래스에서의 gpMsg 변수의 값은 null
public class ParentsMain {
public static void main(String[] args) {
GrandParent gp = new GrandParent();
gp.gpMsg = "Hello";
gp.print();
// ---The GrandParent constructor has been created.
// GrandParent : Hello
Parent p = new Parent();
p.pMsg = "World!";
p.print();
// ---The GrandParent constructor has been created.
// ---The Parent contructor has been created.
// 중요!!! GrandParent : null
// Parent : World!
}
}
상속의 다양성
- 자식 클래스는 상속 받은 메소드를 각각 다르게 재정의하여 클래스마다의 다양성을 나타낼 수 있음
- 이를 오버라이딩(Overriding)이라고 함
- 오버라이딩 : 부모 클래스에서 상속받은 메소드를 재정의하는 것
// 상속의 다양성 예시 (메소드 오버라이딩, Method Overriding)
// 부모 클래스
public class ClassDiversity {
void hello() {
System.out.println("HelloWorld!");
}
}
// 자식 클래스
// 부모 클래스에서 상속 받은 속성을 재정의하여 다른 형태로 사용 할 수 있음
public class Diversity extends ClassDiversity {
// 메소드 오버라이딩 (Method Overriding)
void hello() {
System.out.println("Bye!!!");
}
// 메인 실행 함수
public static void main(String[] args) {
ClassDiversity cd = new ClassDiversity();
cd.hello(); // HelloWorld!
Diversity d = new Diversity();
d.hello(); // Bye!!!
}
}
반응형