ch10 : 상속

목차

상속

  • 상속을 하게 되면 부모 클래스에 선언된 public, protected로 선언된 모든 변수, 메서드를 사용할 수 있다.

  • 자바 클래스는 단일 상속만 가능하다.

  • 상속을 사용하는 이유 : 자식에서 부모의 기능을 재사용 + 확장하기 위해

상속과 생성자

  • 자식의 생성자가 호출되면, 자동으로 부모클래스의 매개변수 없는 생성자가 실행된다.

  • 상속 받으려면,

    1. 부모 클래스의 기본 생성자가 존재해야 한다.

    2. 만약 부모 클래스에 매개변수 있는 생성자만 있다면, super을 통해서 부모 클래스의 생성자를 선택해도 된다. → 이때, 매개변수는 null이 아닌 명확한 값을 넘겨주어야 한다!

super()을 통해서 부모 클래스의 메소드에 접근할 수 있다.

오버라이딩

  • 부모 클래스의 메서드를 자식클래스에서 재정의하는 것

  • 이때, 접근 제어자, 리턴 타입, 메소드명, 매개변수 타입/갯수가 동일해야 한다.

  • 주의

    • 자식클래스에서 리턴 타입을 동일하게 오버라이딩 해야 된다.

    • 접근 제어자는 자식에서 같거나, 더 넓은 권한이어야 한다.

      • ex) 부모에서 priavte이면, 자식은 public일 수 있다. 반대는 안됨!

참조자료형의 형변환

  • Parent obj = new Child(); 가능 → 객체를 자식으로 생성하면, 자식객체는 부모의 메소드를 사용할 수 있다.

  • Child obj = new Parent(); 컴파일 에러 → 객체를 부모로 생성하면, 자식의 메소드들을 사용할 수 없다.

    • 이 경우 명시적 형변환이 필요하다.

    • 다만, 부모 객체를 자식클래스로 억지로 형변환 하는 경우, 컴파일 에러는 피할 수 있으나, 실제로 생성된 부모객체가 자식 클래스의 메소드를 사용하려면 예외가 발생한다.

명시적 형변환을 사용하는 이유

  • 실제로는 자식 클래스 객체인데, 부모 클래스에 담겨있던 경우, → 다시 자식 클래스로 형변환하기 위해 사용할 수 있다.

    ...
    Child child = new Child();
    Parent parent = child;
    Child child = (Child) parent; // 실제로는 Child 객체 이다.
    ...
  • 사용하는 경우

    • 일반적으로 여러 개의 값을 처리(배열)하거나, 매개 변수로 값을 보낼 땐 보통 부모 클래스의 타입으로 보낸다.

    • 그렇지 않으면, 여러 값을 한번에 보낼 때 각 타입별로 구분해서 메소드를 만들어야 하기 때문이다.

  • 이때 실제 타입이 부모 클래스인지 자식클래스인지 구분하기 위해 instanceof로 구분한다.

    • instanceof로 타입 점검할 경우, 하위에 있는 자식부터 확인해야 한다.

    • 객체 instanceof 클래스(타입)

    • ex) if (parentArr[0] instanceof Parent) 로 실제 클래스를 확인한다.

다형성

✏️ 형 변환을 하더라도, 실제 호출되는 것은 원래 객체에 있는 메서드가 호출된다. 
즉 부모 클래스로 선언되더라도, 실제 실행될 때는 실제 객체의 메소드가 실행된다.

Last updated