개발 무지렁이

[Java] 상속관계와 Polymophism, 오버라이딩(Overriding) 본문

Backend/자바

[Java] 상속관계와 Polymophism, 오버라이딩(Overriding)

Gaejirang-e 2023. 3. 13. 17:55

상속


⚠️ Java는 다중상속이 안된다.
생성자(Constructor)private 요소제외부모 클래스의 모든 것을 상속받는다.

Why
확장은 용이하고,
재사용성이 높아지고,
코드가 간결해진다.


  📌 class A extends B
  = A is B
  = (1) A를 A라 부를 수 있다.
  = (2) A를 B라 부를 수 있다.
  (단, 부르는 호칭에 따라 접근에 제한이 생긴다.)

  ⚠️ Java의 모든 class는 Object(Java 최고조상)를 상속받는다.
  = 모든 객체를 Object라 부를 수 있다.

  📌 Polymophism(다형성)
  B b = new A();
  (상속관계에서, 의미적으로* 부모가 자식보다 크다.)

상속과 Polymophism


상속이 없으면 Polymophism을 얘기할 수 없다.

[멤버필드를 이용한 다형성.java]

class Car {
    public String carname;
    public int cost;

    protected void printAttributes() {
        System.out.println("carname: " + carname + "\tcost: " + cost);
    }
}

class EfSonata extends Car {
    EfSonata() {
        this.carname = "EfSonata";
        this.cost = 2500;
    }
}

class Excel extends Car {
    Excel() {
        this.carname = "Excel";
        this.cost = 1000;
    }
}

class Carnival extends Car {
    Carnival() {
        this.carname = "Carnival";
        this.cost = 4000;
    }
}

public class InheritanceExam {
    public static void main(String[] args) {
        Car car = new Car();
        EfSonata ef = new EfSonata();
        Excel ex = new Excel();
        Carnival ca = new Carnival();

        // Polymophism, 멤버필드를 이용한 다형성
        car.printAttributes(); // carname: null    cost: 0
        ef.printAttributes(); // carname: EfSonata    cost: 2500
        ex.printAttributes(); // carname: Excel    cost: 1000
        ca.printAttributes(); // carname: Carnival    cost: 4000
    }
}

[매개변수를 이용한 다형성.java]

class Car {
    public String carname;
    public int cost;

    Car(String carname, int cost) {
        this.carname = carname;
        this.cost = cost;
    }

    protected void printAttributes() {
        System.out.println("carname: " + carname + "\tcost: " + cost);
    }
}

class EfSonata extends Car {
    EfSonata() {
        super("EfSonata", 2500);
    }
}

class Excel extends Car {
    Excel() {
        super("Excel", 1000);
    }
}

class Carnival extends Car {
    Carnival() {
        super("Carnival", 4000);
    }
}

public class InheritanceExam {
    public static void main(String[] args) {
        Car car = new Car(null, 0);
        EfSonata ef = new EfSonata();
        Excel ex = new Excel();
        Carnival ca = new Carnival();

        // Polymophism, 멤버필드를 이용한 다형성
        car.printAttributes(); // carname: null    cost: 0
        ef.printAttributes(); // carname: EfSonata    cost: 2500
        ex.printAttributes(); // carname: Excel    cost: 1000
        ca.printAttributes(); // carname: Carnival    cost: 4000
    }
}

오버라이딩(Overriding)


재정의
상속관계에서 부모 클래스에 정의되어 있는 method를 자식클래스에서 재정의 한 것.

⚠️ Access modifier는 반드시 부모클래스의 Access modifier보다 크거나 같아야한다.


자식클래스가 생성될 때, 부모클래스의 기본생성자가 먼저 호출된다.


자식생성자의 첫줄에 super();생략된 것과 같다.

❓ 만약에 부모의 기본생성자가 없다면

: 부모클래스에서 인수가 있는 생성자를 작성해서,
부모의 기본생성자가 없다면, 자식생성자 구현부 첫줄에서 에러난다.

📖 해결방법
: 부모클래스에서 인수가 있는 생성자를 작성하고 싶다면,
먼저 기본생성자를 작성한다음 오버로딩(Overloading)하는 것을 권장한다.
(아니면 자식생성자에서 super(인수,...)를 호출해라)

❗super란: 상속관계에서 자식안에서 부모를 부를 때 사용하는 키워드이다.


📌 재정의된 method는 무조건 자식method가 호출된다.(부모타입의 참조변수에 넣었다하더라도)
Comments