Inheritance

똘이주인·2021년 5월 18일
0

상속(Inheritance)

상속(Inheritance)이란 물려준다는 의미, 어떤 객체가 있을 때 그 객체의 필드(변수)와 메소드를 다른 객체가 물려 받을 수 있는 기능을 상속이라고 한다.

이때 상속받는 클래스를 자식 클래스, 하위 클래스 또는 서브(sub) 클래스 라고 부르고

상속을 해주는 클래스를 부모 클래스, 상위 클래스 또는 슈퍼(super) 클래스 라고 한다.

//상속은 extends라는 키워드를 사용하며 상속의 형태는 다음과 같다.

자식클래스 extends 부모클래스

//Car 를 상속받은 Bus 를 class로 표현하는 방법
public class Parent{

    }

    public class Child extends Parent{

    }

자바에서는 자식 클래스가 여러 부모로부터 다중 상속을 받는 것은 불가능 즉,

1개의 부모 클래스로부터의 단일 상속만 허용 된다.  하지만 부모 클래스는 여러 개의 자식 클래스에게 상속이 가능

상속의 사용

자바에서의 상속은 대대손손 이루어질 수 있음.

Class Parent{                    // 부모클래스
}

Class Child extends Parent{      // 부모클래스로부터 상속받은 자식클래스
			...
}

Class GrandChild extends Child{  // 자식클래스로부터 상속받은 손자클래스
			...                        // 부모,자식 클래스 모두 상속받음
}

Super

부모 클래스로부터 상속받은 필드나 메소드를 자식 클래스에서 참조하는 데 사용하는 참조 변수

super 참조 변수를 사용하여 부모 클래스의 멤버에 접근할 수 있습니다.

this와 마찬가지로 super 참조 변수를 사용할 수 있는 대상도 인스턴스 메소드뿐이며, 클래스 메소드에서는 사용할 수 없다.

//예제
class Parent { int a = 10; }

class Child extends Parent {

		int a = 20;

    void display() {

        System.out.println(a);
        System.out.println(this.a);
        System.out.println(super.a);

    }
}

public class Inheritance02 {
    public static void main(String[] args) {

        Child ch = new Child();

        ch.display();
    }
}
// 실행결과는 20           20           10 이 나온다.

Super()

this() 메소드가 같은 클래스의 다른 생성자를 호출할 때 사용된다면,

부모의 생성자를 임의로 호출하지 않으면, 부모 class의 기본 생성자가 자동으로 호출한다.

super() 메소드는 부모 클래스의 생성자를 호출할 때 사용

class Parent{
    Parent(){
        System.out.println("Parent 생성자");
    }
    Parent(int a){
        System.out.println(a);
    }
}

class Child extends Parent{
    Child(){
        super();
        System.out.println("Child 생성자");
    }
    Child(int a){
        super(a);
        System.out.println("a = " + a);
    }
}

public class Ex01 {
    public static void main(String[] args) {
        // Child 클래스의 Child(int a) 를 호출하면
        // 부모 클래스 Parent클래스의 Parent(int a) 를 호출합니다.
 
        /* 결과:
         * 20
         * a = 20
         *  
         */
        new Child(20);
    }
}

오버라이딩(Overriding)

부모가 가지고 있는 메소드와 똑같은 모양의 메소드를 자식이 가지고 있는 것이다. 즉 오버라이딩이란 메소드를 재정의 하는 것

오버라이딩 조건

  • 이름이 같아야 한다.

  • 매개변수가 같아야한다.

  • 리턴타입이 같아야 한다.

  • 자식의 접근제한자는 부모의 접근제한자보다 작을수없다.

    (private < package < protected < public)

//run 메소드를 가지고 있는  Parent클래스 
    public class Parent{
        public void run(){
            System.out.println("Parent의 run메소드");
        }
    }

    //Parent 를 상속받는 Child 클래스 
    public class Child extends Parent{

    }

    public class Test{
        public static void main(String args[]){
            Child child = new Child();
            child.run();  // Parent의 run메소드가 실행된다. 
        }
    }

//-------------------------------------------------------------------------------------

// Child 클래스에 부모가 가지고 있는 메소드와 모양이 같은 메소드를 선언

public class Child extends Parent{
        public void run(){
            System.out.println("Child의 run메소드");
        }
    }

    public class Test{
        public static void main(String args[]){
            Child child = new Child();
            child.run();  // Child의 run메소드가 실행된다. 
        }
    }   // 메소드를 오버라이드 하면, 항상 자식클래스에서 정의된 메소드가 호출

//-------------------------------------------------------------------------------------

// 오버라이딩 한다고 해서 부모의 메소드가 사라지는 것은 아니다.
// super 키워드를 이용하면, 부모의 메소드를 호출 할 수 있다.

public class Child extends Parent{
        public void run(){
            **super.run();**  // 부모의  run()메소드를 호출 
            System.out.println("Child의 run메소드");
        }
    }

0개의 댓글