본문 바로가기

java

자바강의 7일차

1. 상속(inheritance)

     1-1) 상속의 정의와 장점

          - 상속이란 기존 클래스를 재사용하여 새로운 클래스를 작성하는 것이다.

          - 상속을 통해서 클래스를 작성하면 보다 적은 양의 코드로  새로운 클래스를 작성할 수 있고

            코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 매우 용이하다.

               => 코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여한다.

          - 상속을 구현하기 위해선 새로 작성하고자 하는 클래스의 이름 뒤에 상속받고자 하는 클래스의 이름을

            키워드 extends와 함께 써 주기만 하면 된다.

 

조상클래스 부모(parent)클래스, 상위(super)클래스, 기반(base)클래스
자손클래스 자식(child)클래스, 하위(sub)클래스, 파생된(derived)클래스

 

          - 생성자와 초기화블록은 상속되지 않으며 멤버만 상속된다.

          - 자손클래스의 멤버 개수는 조상클래스보다 항상 같거나 많다.

          - 자손클래스의 인스턴스를 생성하면 조상클래스의 멤버와 자손클래스의

            멤버가 합쳐진 하나의 인스턴스로 생성된다.

       1-2) 클래스간의 관계 - 포함관계

             - 상속이외에도 클래스를 재사용하는 또 다른 방법이 있는데 그것은 클래스간의 포함관계를 맺어주는 것이다.

             - 클래스간의 포함관계를 맺어 주는 것은 한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것을 뜻한다.

            - 클래스를 작성하는 데 있어서 상속관계를 맺어 줄 것인지 포함관계를 맺어줄 것인지 결정하는 것은 때때로 혼란스럽다.

            

                        상속관계              '~은 ~이다 (is ~a)'

                        포함관계              '~은 ~을 가지고 있다 (has ~a)'

 

                ex)

                        원(Circle), 점(Point)

                        원(Circle)은 점(Point)이다.                      Circle is a Point 

                        원(Circle)은 점(Point)을 가지고 있다.      Circle has a Point ==> 포함관계

 

   1-3) 단일상속

           - 다른 객체지향언어인 C++에선 다중상속을 허용하지만 자바에서는 오직 단일 상속만을 허용한다.

           - 예를 들어 Tv클래스와 VCR클래스가 있을 때 두 클래스로부터 상속을 받는 TVCR클래스를 작성할 수 없다.

             만약 다중상속이 허용된다고 할 때 두 클래스 모두 power()라는 메소드가 있다면 어느 조상클래스의 power()를

             상속받게 되는 것일까?

           - 자바에서는 다중상속의 이러한 문제점을 해결하기 위해 다중상속의 장점을 포기하고 단일상속만 허용된다.

                      ==> 이럴 때 포함관계를 사용할 수 있다.

 

       1-4) Object클래스 - 모든 클래스의 조상

            - Object클래스는 모든 클래스 상속계층도의 최상위에 있는 조상클래스이다.

            - 다른 클래스로부터 상속받지 않는 모든 클래스들은 자동적으로 Object클래스로부터

              상속받게 함으로써 이것을 가능하게 한다.

            - 자바의 모든 클래스들은 Object클래스의 멤버들을 상속받기 때문에 Object클래스에

              정의된 멤버들은 사용할 수 있다.

 

2. 오버라이딩(overriding)

       2-1) 오버라이딩이란?

               - 조상클래스로부터 상속받은 메소드의 내용을 변경하는 것을 오버라이딩이라고 한다.

               - 상속받은 메소드를 그대로 사용하기도 하지만, 자손 클래스 자신에 맞게 변경해야 하는 경우가 많다.

                     ==> 이럴 때 조상의 메소드를 오버라이딩이라고 한다.

       2-2) 오버라이딩의 조건

                - 자손클래스에서 오버라이딩하는 메소드는 조상클래스의 메소드의 이름, 매개변수, 반환타입이 같아야 한다.

                ① 접근제어자는 조상 클래스의 메소드보다 좁은 범위로 변경할 수없다.

                - 만일 조상 클래스의 정의된 메소드의 접근 제어자가 protected라면 이를 오버라이딩하는 자손 클래스의

                  메소드는 접근제어자가 protected 또는 public이어야 한다.(대부분은 같은 범위의 접근 제어자를 사용한다.)

 

                 ② 조상클래스의 메소드보다 많은 수의 예외를 선언할 수 없다.

                 ③ 인스턴스메소드를 static  메소드 또는 그 반대로 변경할 수 없다.

 

        2-3) 오버로딩 vs 오버라이딩

               - 오버로딩은 기존에 없는 새로운 메소드를 추가하는 것이고, 오버라이딩은 조상으로부터 상속받은 메소드의

                 내용을 변경하는 것이다.

 

               * 오버로딩 (overloading)        기존에 없는 새로운 메소드를 정의하는것 ( new )

               * 오버라이딩 (overriding)       상속받은 메소드의 내용을 변경하는 것 (change, modify)

 

        2-4) super

               - super는 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는 데 사용되는 참조변수이다.

               - 멤버변수와 지역변수의 이름이 같을 때 this를 붙여서 구별했듯이 상속받은 멤버와 자신의 멤버와

                 이름이 같을 때는 super를 붙여서 구분할 수 있다.

               - 조상클래스로부터 상속받은 멤버도 클래스 자신의 멤버이므로 super대신 this를 사용할 수 있다.

               - 그래도 조상 클래스의 멤버와 자손클래스의 멤버가 중복 정의되어서 서로 구별해야 하는 경우에만

                 super를 사용하는 것이 좋다.

 

          2-5) super()

               - this()와 마찬가지로 super() 역시 생성자이다.

               - this()는 같은 클래스의 다른 생성자를 호출하지만 super()는 조상클래스의 생성자를 호출하는데 사용된다.

               - 자손클래스의 인스턴스를 생성하면, 자손의 멤버와 조상의 멤버가 합쳐진 하나의 인스턴스가 생성된다.

               - 이 때 조상클래스의 멤버의 초기화작업이 수행되어야 하기 때문에 자손 클래스의 생성자에서 조상 클래스의

                 생성자가 호출되어야 한다.

               - 생성자의 첫줄에서 조상클래스의 생성자를 호출해야 하는 이유는 자손클래스의 멤버가 조상클래스의 멤버를

                 사용할수도 있으므로 조상의 멤버들이 먼저 초기화 되어 있어야 한다.

           

 

'java' 카테고리의 다른 글

자바강의 9일차  (0) 2024.01.19
자바강의 8일차  (0) 2024.01.15
자바강의 6일차  (1) 2024.01.13
자바강의 5일차  (0) 2024.01.10
자바강의 4일차  (0) 2023.12.30