ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 상속(Inherit) / 오버라이딩(Overriding)
    개발/자바JAVA 2024. 1. 30. 17:01

    ▶상속 

      : 다른 클래스가 가지고 있는 멤버(필드, 메소드)들을 새로 작성할 클래스에서 직접 만들지 않고 상속을 받음으로써

        새 클래스가 자신의 멤버처럼 사용할 수 있는 기능.

         쉽게 말해, 코드를 물려주는 것이다.

        목적?

       : 클래스의 재사용, 연관된 일련의 클래스들에 대한 공통적인 규약을 정의하기 위함.

      

     

       뭔소린가 하니...

     

         장점 

         :  보다 적은 양의 코드로 새로운 클래스 작성이 가능.

            코드를 공통적으로 관리하기 때문에 코드의 추가 및 변경 용이

            코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여함.

     

     

     

     

    이해를 돕기위해 

     

    위 예제 class (vo)들을 만들어 준다.

     

    Main 클래스를  만들어서  출력을 해본다.

     

    여기까지는 우리가 알고 있는 객체와 메소드를 이용한 기본적인 방법이다.

     

    기존 방법은 매 코드마다 중복된 코드들이 계속 반복적으로 나오고 있다.

    brand, pCode, pName, price가 계속 반복되는 것을 확인 할 수 있는데, 중복된 코드들을 작성할 경우 실수할 가능성도 있을뿐 아니라, 수정이나 유지보수 시 매번 일일이 찾아서 수정해야하는 번거로움이 생긴다.

     

    만약 price의 타입이나 변수명을 바꾼다 가정해보면,

    각 클래스마다 변수명, 생성자, getter/setter... 생각만해도 귀찮다.


    그래서 상속이라는 개념을 적용시켜서

    -->매 클래스마다 중복된 "필드", "메소드" 들을 단 한번 또하나의 클래스로(부모 클래스) 정의한다.

    --> 해당 부모 클래스를 가져다 쓴다. --> 코드의 중복을 줄인다!!

     

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------

     

    위 예시를 상속으로 바꿔보자.

     

     

        위 Desktop, Tv, SmartPhone의 vo클래스들을 공통적으로 기술했던 요소들만 추출해서

        하나의 Product클래스에 로 묶어준다.

      

        ※ Product 클래스 ( == 부모클래스 == 상위클래스 == 슈퍼클래스)

     

     

    1. product(부모) 클래스에 공통적인 요소들을 만들어준다.

     

     

     

    2.  클래스 선언부에

     

    다음과 같이 extends Product(부모클래스)를 적어주면 

    Desktop 클래스가 Product 클래스를 상속한다는 뜻이 된다.

     

    상속을 한다면 Product 클래스에 있는 필드, 생성자, getter/setter, information 메소드가 정의되어 있다.

     

    마찬가지로 Tv, SmartPhone 클래스도 동일하게 해주면 된다.

     

     

    3.  super.

     

    생성자도 만들어줘야 하는데, product클래스에서 넘어온 필드들도 생성자로 초기화 해야한다.

    하지만, 

    이렇게 this. 으로 접근하려다 보니 빨간줄이 뜬다.

    --> this. 은 해당 이 클래스의 객체의 주소를 담고 있다.  하지만 private 이기 때문에 외부에서 직접 접근이 불가한 것임.

     

    -->super. 은 해당 부모클래스의 객체의 주소를 담고 있다. 단, 얘도 private일 경우 외부에서 직접 접근이 불가하다.

     

     

     

              ※super( ) : 부모 객체의 생성자를 호출하는 메소드로 기본적으로 후손 생성자에 부모 생성자 포함
                                 후손 객체 생성 시에는 부모부터 생성이 되기 때문에 후손 클래스 생성자 안에는
                                 부모 생성자를 호출하는 super() 줄에 존재 (부모 생성자가 가장 먼저 실행되어야 하기
                                 때문에 명시적으로 작성 시에도 반드시 줄에만 작성)
                                 매개변수 있는 부모 생성자 호출은 super(매개변수, 매개변수) 넣으면

     

                 super. : 상속을 통한 자식 클래스 정의 해당 자식 클래스의 부모 객체를 가리키는 참조변수
                              자식 클래스 내에서 부모 클래스 객체에 접근하여 필드나 메소드 호출 사용

     

     

     

     

     4.   해결방법

     

           (1) 일단 부모클래스의 접근제한자를 protected로 바꿔서 접근시켜보겠다.(권장x)

     

              ※부모클래스로 받은 변수들은 super. 으로 접근한다.  

                 단 본인 클래스의 변수는 this로 접근하자!!

     

     

           (2) 부모클래스의 public 접근제한자인 setter메소드를 호출해서 대입해보자.

     

     

      

     

             (3) 부모클래스의 매개변수 생성자를 호출하는 방법.(추천)

     

                                부모클래스에 정의되어있는 매개변수 생성자를 super()에 받아온다.

                                  ※ super()은 제일 첫 줄에 기술해야한다!!

     

     

     

     

              이렇게하면 Desktop 클래스가 Product의 상속을 완료했다.

     

    Tv와 SmartPhone도 마찬가지로 해주자.

     

     

     

     

     

     

            6. 메인메소드로 출력

     

     

     

     

                          부모클래스의 메소드를 호출했더니, 딱 부모에 있는 필드까지의 정보만 출력된다.

     

                           -->  자식클래스의 allInOne, mobileAgency, inch를 출력하려면

                                   부모클래스의 information 메소드를 자식클래스에 있는 필드도 추가되도록 재정의 해야한다.

                       

                               Desktop 자식클래스에 information을 재정의 해주면

     

                                    재정의한 Desktop 클래스의 allInOne정보만 잘 나온다.

     

     

     

                                                                  Tv, SmartPhone클래스는 좀 더 쉽게 메소드 자체를 불러와서 재정의

     

     

                                                                                         

                                                                                            잘나온다.

     

     

      ◎ 상속의 특징

      1. 클래스간의 상속은 오직 "단일 상속" 이여야만 함.

          즉, 부모클래스는 최대 1개.(부모가 여러개인 상황을 "다중 상속" 이라고 함)

           하지만, 상속의 연속 구조는 가능!! (부모의 부모의 부모의 부모의.....)

     

          > 사실... 명시되어있지는 않지만, 자바에서의 모든 클래스(내가 만든, 남이만든) 는 Object 클래스의 후손임.

                           즉, Object 클래스에 정의된 필드, 메소드 들을 어느 클래스던지 내 맘대로 다 가져다 쓸 수 있다.

                                Object 클래스에 정의된 메소드가 맘에 안들면 오버라이딩을 통해 재정의 또한 가능하다.

     

     

     

    ▶ 오버라이딩(Overriding)

      : 자식 클래스가 상속 받은 부모 메소드를 재작성 하는 것

        부모가 제공하는 기능을 후손이 일부 고쳐 사용하겠다는 의미로, 자식 객체를 통한 실행 시 후손 것이 우선권을 가짐.

                                                                                                                                                                           (동적바인딩)

          ◎성립조건

              부모클래스의 메소드와 자식클래스의 메소드 비교

              1. 부모메소드의 메소드명  동일

              2. 매개변수의 개수, 타입, 순서 동일(단, 매개변수명과는 무관)

              3. 리턴타입 동일 

              4. 부모메소드의 접근제한자보다 같거나 공유 범위가 더 커야함, private접근제한자는  메소드 오버라이딩 불가

     

         

            ◎ 특징

     

               1. 메소드 헤드라인 위에 반드시 Annotation, @Override 표시

                   생략가능, 하지만 헷갈리기도 하고, 실수를 한다면 오버라이딩 오류로 알려주지 않는다.

                   그니까  써라 그냥.

     

               2. 접근 제어자를 부모 것보다 같거나 넓은 범위로 변경 가능

               3. 부모 메소드의 예외처리 클래스 처리범위보다 좁은 범위로 예외처리 클래스 수정 가능

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    ※  toString()메소드 : Object클래스에 정의된 메소드 중 하나. > 해당 참조 자료형 타입의 풀클래스명 + @ + 해당 객체의                                      16진수 형태의 주소값을 문자열 형태로 반환하게끔 정의되어있음.

     

       - ->출력문 안에 참조 변수명을 제시해서 바로 출력하고자 할 때 

     

    원래는 주소값이 뜬다.

     

    하지만 Object의 자식클래스인 Book클래스 내에서  toString( )메소드를 재정의해서 해당 객체의 모든 필드값을 하나의 문자열로 연이어서 합쳐서 반환해주는 용도   로 변경 (즉, 기존의 information 메소드 역할을 대체하도록 변경)

     

     

                             이렇게 book 클래스에 toString( ) 오버라이딩을 정의한다면.

    이렇게 원하는 값이 출력된다.

    '개발 > 자바JAVA' 카테고리의 다른 글

    추상클래스(Abstract Class)  (0) 2024.02.02
    다형성(Polymorphism)  (1) 2024.01.31
    객체배열  (0) 2024.01.29
    메소드(Method) / 오버로딩(Overloading)  (1) 2024.01.29
    생성자(Constructor)  (0) 2024.01.26
Designed by Tistory.