본문 바로가기
Programming/Java

[F-Lab 모각코 챌린지 10일차] TIL : 자바의신 10장

by 구튼탁 2023. 6. 12.
728x90

학습 목표


  • 자바의 상속
  • 다형성
  • 형변환

학습 결과 요약


 

학습 내용


상속 개념

  • 한 클래스가 다른 클래스를 확장(extend) 하는 것으로 상속을 하면 확장 대상 클래스의 public , protected 로 선언된 모든 필드와 메서드에 모두 접근 가능하다. 단, private, default 접근 제한을 갖는 모든 필드와 메서드는 상속 대상에서 제외 된다.
  • 확장한 클래스를 자식 또는 하위 클래스라고 부르며 확장 당한 클래스를 부모 또는 상위 클래스라한다.
  • 상속 선언 방법
    class Child extends Parent {
    
    }
    
  • extends 예약어 뒤에 확장할 클래스 이름을 적는다. 다중 상속은 불가능하다.
  • 상속을 하면 코드 재사용이 가능하다.

 

상속 관계 생성자

  • 객체는 인스턴스화 해야 사용 가능하다. 그럼 상속 관계에 있는 두 클래스는 어떻게 객체화 될까?
    • 자식 객체를 생성하면, 부모 객체가 먼저 생성되고 자식 객체가 그 다음에 생성된다.
     

Parent 를 상속하는 Child 객체를 생성하면 child 참조 변수는 Child 객체를 참조하고,

Child 객체에서 Parent 객체를 참조하고 있다.

부모 객체의 잠조값은 자식 객체의 인스턴스 변수 중 하나에 저장된다고 한다.

  • 자식 클래스의 생성자가 호출되면, 부모 클래스의 기본 생성자를 자동으로 호출한다. 컴파일 할 때super(); 코드가 자동으로 생기기 때문이다.
  • 이처럼 자식 생성자에서는 부모의 기본 생성자를 찾기 때문에 부모 클래스에 기본 생성자는 없고, 매개 변수 생성자만 존재한다면 컴파일 에러가 발생한다.
    • 이때 컴파일 에러를 피하려면
      • 부모 클래스에 기본 생성자 추가
      • 자식 클래스의 생성자에서 매개 변수 있는 생성자 명시적 지정으로 해결해야 한다.
  • super 생성자는 반드시 자식 클래스의 생성자에서 가장 첫줄에 선언되어야만 한다.

 

public class Parent {

    public Parent() {
        System.out.println("Parent Constructor");
    }

    public void printName() {
        System.out.println("Parent printName()");
    }
}
public class Child extends Parent {
    public Child() {
        System.out.println("Child Constructor");
    }
}
public class InheritancePrint {

    public static void main(String[] args) {
        Child child = new Child();
        child.printName();
    }
}
// 출력 결과
Parent Constructor
Child Constructor
Parent printName()

 

 

메서드 재정의

  • 앞서 자식 클래스는 부모 클래스의 public, protected 로 선언된 모든 필드와 메서드에 접근이 가능하다 했다.
    여기서 부모 클래스의 메서드가 자식 클래스에 적절하지 않으면 자식 클래스에서 내용을 수정할 방법이 있다.
  • 메서드 재정의를 통해 가능하다.
  • 메서드 재정의란 부모 클래스에 선언된 메서드를 자식 클래스에 동일한 메서드 시그니처로 메서드 내용을 재정의 한다.
  • 그럼 자식 객체에서 재정의된 메서드를 호출하면 오버라이딩된 자식 메서드가 호출 된다.
  • 경우에 따라 다시 부모의 메서드를 호출이 필요한 경우가 발생하는데, 이때는 super 키워드로 부모의 메서드를 호출하면 된다.

 

상속 금지

  • 특정 클래스는 상속을 하지 못하도록 막는 장치가 있을까?
  • final 의 의미는 해당 선언이 최종 상태고, 결코 수정될 수 없음을 뜻한다.
  • 클래스 선언부에 final 키워드를 지정하면 이 클래스는 최종적인 클래스이므로 상속할 수 없는 클래스가 된다.

 

오버라이딩 금지

  • 메서드 선언시 final 을 선언하면 역시 최종적인 메서드이므로 오버라이딩할 수 없는 메서드가 된다.
  • 자식 클래스가 부모 클래스의 메서드를 재정의할 때 final 메서드는 재정의 불가능하다.
728x90

댓글