웹개발/JAVA

[JAVA] 상속( inheritance ), 오버라이딩( overriding )

ss__jae2 2022. 1. 20. 00:16
반응형

1. 상속( inheritance )

  • 상속의 정의와 장점
    • 상속이란 기존 클래스를 재사용하여 새로운 클래스를 작성하는 것이다.
    • 상속을 통해서 클래스를 작성하면 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있고 코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 매우 용이하다.
      ==> 코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여한다.
    • 상속을 구현하기 위해선 새로 작성하고자 하는 클래스의 이름 뒤에 상속받고자 하는 클래스의 이름을 키워드 extends와 함께 써 주기만 하면 된다.

      조상클래스 부모( parent )클래스, 상위( super )클래스, 기반( base )클래스
      자손클래스 자식( child )클래스, 하위( sub )클래스, 파생된( derived )클래스
    • 생성자와 초기화 블록은 상속되지 않으며 멤버만 상속된다.
    • 자손클래스의 멤버 개수는 조상클래스보다 항상 같거나 많다.
    • 자손클래스의 인스턴스를 생성하면 조상클래스의 멤버와 자손클래스의 멤버가 합쳐진 하나의 인스턴스로 생성된다.
  • 클래스 간의 관계 - 포함관계
    • 상속 이외에도 클래스를 재사용하는 또 다른 방법이 있는데 그것은 클래스 간에 포함관계를 맺어주는 것이다.
    • 클래스 간의 포함관계를 맺어 주는 것은 한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것이 좋다.
    • 클래스를 작성하는 데 있어서 상속관계를 맺어 줄 것인지 포함관계를 맺어줄 것인지 결정하는 것은 때때로 혼란스럽다.

      상속관계 '~은 ~이다.( is - a )'
      포함관계 '~은 ~을 가지고 있다.( has - a )'
      원( Circle ), 점( Point )
      원( Circle )은 점( Point )이다. Circle is Point
      원( Circle )은 점( Point )을 가지고 있다. Circle has a Point ==> 포함관계
  • 단일 상속
    • 다른 객체지향 언어인 C++ 에선 다중 상속을 허용하지만 자바에서는 오직 단일 상속만을 허용한다.
    • 예를 들어 TV 클래스와 VCR클래스가 있을 때 두 클래스로부터 상속을 받는 TVCR클래스를 작성할 수 없다.
      만약 다중 상속이 허용된다고 할 때 두 클래스 모두 power()라는 메소드가 있다면 어느 조상클래스의 power()를 상속받게 되는 것일까?
    • 자바에서는 다중 상속의 이러한 문제점을 해결하기 위해 다중상속의 장점을 포기하고 단일 상속만 허용된다.
      ==> 이럴 때 포함관계를 사용할 수 있다.( 상속을 받으면서 포함관계를 하면 두 개의 클래스로부터 사용할 수 있다.

상속과 포함관계, 포함관계를 이용해 두 개 클래스사용

  • Object 클래스 - 모든 클래스의 조상
    • Object 클래스는 모든 클래스 상속계층도의 최상위에 있는 조상클래스이다.
    • 다른 클래스로부터 상속받지 않는 모든 클래스들은 자동적으로 Object 클래스로부터 상속받게 함으로써 이것을 가능하게 한다.
    • 자바의 모든 클래스들은 Object 클래스의 멤버들을 상속받기 때문에 Object 클래스에 정의된 멤버들을 사용할 수 있다.

2. 오버라이딩( overriding )

  • 오버라이딩이란?
    • 조상클래스로부터 상속받은 메소드의 내용을 변경하는 것을 오버라이딩이라고 한다.
    • 상속받은 메소드를 그대로 사용하기도 하지만, 자손 클래스 자신에 맞게 변경해야 하는 경우가 많다.
      ==> 이럴 때 조상의 메소드를 오버라이딩이라고 한다.
  • 오버라이딩의 조건
    • 자손클래스에서 오버라이딩하는 메소드는 조상클래스의 이름, 매개변수, 반환타입이 같아야 한다.
    • 접근제어자는 조상클래스의 메소드보다 좁은 범위로 변경할 수 있다.
      - 만일 조상 클래스의 정의된 메소드의 접근 제어자가 protected라면 이를 오버라이딩하는 자손 클래스의 메소드는 접근 제어자가 protected 또는 public이어야 한다.( 대부분은 같은 범위의 접근 제어자를 사용한다. )
    • 조상클래스의 메소드보다 많은 수의 예외를 선언할 수 없다.
    • 인스턴스 메소드를 static 메소드 또는 그 반대로 변경할 수 없다.
  • 오버로딩 VS 오버라이딩
    • 오버로딩 기존에 없는 새로운 메소드를 추가하는 것이고, 오버라이딩조상으로부터 상속받은 메소드의 내용을 변경하는 것이다.

      오버로딩( overloading ) 기존에 없는 새로운 메소드를 정의하는 것( new )
      오버라이딩( overriding ) 상속받은 메소드의 내용을 변경하는 것( change, modify )
  • super
    • super는 자손클래스에서 조상클래스로부터 상속받은 멤버를 참조하는 데 사용되는 참조변수이다.
    • 멤버변수와 지역변수의 이름이 같을 때 this를 붙여서 구별했듯이 상속받은 멤버와 자신의 멤버와 이름이 같을 때 super를 붙여서 구분할 수 있다.
    • 조상클래스로부터 상속받은 멤버도 클래스 자신의 멤버이므로 super대신 this를 사용할 수 있다.
    • 그래도 조상클래스의 멤버와 자손클래스의 멤버가 중복 정의되어서 서로 구별해야 하는 경우에만 super를 사용하는 것이 좋다.
  • super()
    • this()와 마찬가지로 super() 역시 생성자이다.
    • this()는 같은 클래스의 다른 생성자를 호출하지만 super()는 조상클래스의 생성자를 호출하는 데 사용된다.
    • 자손클래스의 인스턴스를 생성하면, 자손의 멤버와 조상의 멤버가 합쳐진 하나의 인스턴스가 생성된다.
    • 이때 조상클래스의 멤버의 초기화 작업이 수행되어야 하기 때문에 자손클래스의 생성자에게 조상클래스의 생성자가 호출되어야 한다.
    • 생성자의 첫 줄에서 조상클래스의 생성자를 호출해야 하는 이유는 자손클래스의 멤버가 조상클래스의 멤버를 사용할 수도 있으므로 조상의 멤버들이 먼저 초기화되어 있어야 한다.( 조상클래스에서 초기화 한 값을 쓰기 위해서는 조상에서 먼저 초기화 작업을 해야한다. )
    • 부모의 생성자가 먼저 초기화 되어 있어야 자식도 생성자를 생성할 수 있다.
    • 맨 처음에 아무것도 안 쓰면 자식은 부모의 기본 생성자로 초기화할 수 있다.
    • super(  ,  )로 기본 생성자 아닌 부모에서 작성한 다른 생성자로 초기화 할 수 있다.

반응형