Java 상속

this & super

수업소개

자기자신을 의미하는 this와 부모를 의미하는 super 키워드를 통해서 원하는 대상을 정확하게 지정하는 방법을 살펴봅시다. 

 

 

 

강의

 

 

 

소스코드

https://github.com/egoing/java-inheritance/commit/850ff16f2aee1a5fe20cacfd7c7ce33264c9628a

class Cal{
    public int sum(int v1, int v2){
        return v1+v2;
    }
    // Overloading
    public int sum(int v1, int v2, int v3){
        return this.sum(v1,v2)+v3;
    }
}
class Cal3 extends Cal{
    public int minus(int v1, int v2){
        return v1-v2;
    }
    // Overriding
    public int sum(int v1, int v2){
        System.out.println("Cal3!!");
        return super.sum(v1,v2);
    }

}
public class InheritanceApp {
    public static void main(String[] args) {
        Cal c = new Cal();
        System.out.println(c.sum(2,1));
        System.out.println(c.sum(2,1,1));

        Cal3 c3 = new Cal3();
        System.out.println(c3.sum(2,1));
        System.out.println(c3.minus(2,1));
        System.out.println(c3.sum(2,1));
    }
}
class Cal2{
    public int sum(int v1, int v2){
        return v1+v2;
    }
    public int minus(int v1, int v2){
        return v1-v2;
    }
}

 

댓글

댓글 본문
  1. this. 자기자신의
    super. 부모의

    오버로드하고 오버라이딩할때 그것을 좀더 연관지어서 계승하여 발전시킬때
    this 와 super 로 연관짓는다.
  2. 육도
    2022.05.14 완료
  3. 나연
    2022년 2월 23일 (수) 완료

    `this`: 자기 자신의 인스턴스
    `super`: 자신의 부모

    ```java
    @Override
    public int add(int value1, int value2) {
    System.out.println("ChildCalculator");
    return super.add(value1, value2);
    }
    ```

    ```java
    class Calculator {

    public int add(int value1, int value2) {
    return value1 + value2;
    }

    // Overloading
    public int add(int value1, int value2, int value3) {
    return this.add(value1, value2) + value3;
    }

    }
    ```
  4. 열정jk
    220220 감사합니다
  5. 주간식당메뉴
    2021.12.01.
  6. 2021.09.02 완료
  7. 이마누
    완료
  8. Eunyoung Eunice Kang
    2021년 8월 14일 완료
  9. labis98
    20210814 good!!!
  10. super1Nova
    210808
  11. 초딩 개발자
    2021/07/22
  12. 싸알
    super -> 부모 호출
    this ->자기 자신 호출
  13. 김준형
    명쾌한 답변이 될지는 모르겠지만 최대한 자세히 설명해 보겠습니다!
    Caffee님 말씀대로 return this.sum(v1,v2) +v3; 일때는 Cal3!!가 나오고, return v1+v2+v3; 하면 4만 출력이 됩니다.
    우선 return this.sum(v1,v2) +v3; 이 과정부터 알아보겠습니다.
    우선 System.out.println(c3.sum(2, 1, 1));이걸 실행하면
    Cal의 자식인 Cal3에서 찾죠? 근데 변수가 3개인 것이 없기 때문에 부모 클래스인 Cal로 이동하여 찾게 됩니다.
    Cal로 왔으면
    public int sum(int v1, int v2, int v3){
    return this.sum(v1,v2)+v3;
    } 이것을 실행하게 되죠! 우선 this.sum(v1,v2)은 Cal 에서는 v1+v2입니다 그쵸? 근데 Cal3에서 v1+v2를 오버라이딩했고,
    System.out.println("Cal3!!");
    return super.sum(v1,v2); 이걸로 오버라이딩 된겁니다! (근데 왜 오버라이딩한 걸로 계산하냐? 라고 의문이 들수있습니다. 근데 애초에 저희가 호출한 것은 c3 즉 cal3를 호출했기 때문에 오버라이딩된 System.out.println("Cal3!!");
    return super.sum(v1,v2); 이걸로 계산하는 게 맞습니다.그리고 +v3 즉 +1을 해서
    Cal3!! 4가 출력된 것을 알 수 있습니다.


    즉 간단하게 정리해드리면, Cal3에서는 변수 3개인 것이 없어서 Cal로 이동
    public int sum(int v1, int v2, int v3){
    return this.sum(v1,v2)+v3;
    } 이걸 실행하는 중에 this.sum으로 인해 Cal에 있는 return v1+v2를 하게되는데, 저희가 호출한 것은 c3즉 Cal3이고 Cal3은 Cal의 public int sum(int v1, int v2){
    return v1+v2;
    } 이 부분을 오버라이딩해서 public int sum(int v1, int v2){
    System.out.println("Cal3!!");
    return super.sum(v1,v2);
    }이렇게 된 것입니다. 그러므로 this.sum일 때는 Cal3!!! 4가 출력이 되는 것이고

    그와 반대인 그냥 return v1+v2+v3;을 하면,
    Cal3에서 변수 3개인것을 찾고, 없어서 부모인 Cal로 이동합니다. 그리고 그냥 return v1+v2+v3이니,
    변수 2+1+1이 되어서 그냥 4만 출력이 되는 것입니다.

    그리고 return this.sum(v1, v2) + v3;에서 this를 뺀 return sum(v1,v2)+v3를 해도 똑같이 Cal3!! 4가 출력이 됩니다. this를 넣어줌으로 좀 더 명확히 분명히 한다고 생각하시면 될 것 같습니다.

    더 궁금하시거나, 이해가 가지 않으신 부분 질문주세요!
    대화보기
    • jeisyoon
      2021.05.03 this와 super - OK

      this : 자기 Class의 것. super : 자기 부모 Class의 것

      Child Class 가 Parent Class를 overriding 하였으나 어떤 필요에 의해 Parent Class의 method 나 Variable를 호출 할 때 앞에 super를 붙여 사용하면 된다.
    • 레이
      2021.04.18
    • 금도끼은도끼
      상속은 부모걸 그대로 물려받은것구 super는 부모걸 가공해서 사용하거나 자식거와 구별하기위해써요

      첫번째거 예 부모에 sum() 있는데
      자식에도 sum()을 새로만들어서 부모거에다가 + 추가로 인자를 더할때사용
      자식 sum(){ super.sum() + this.새로추가할인자 } 이렇게요...

      두번째거 예제 자식과 구별하기위해
      부모 클래스{
      int x=10; }
      자식 클래스{
      int x=100;
      여기서 this.x 라고하면 100을 나타내는거구요.. super.x 라고하면 부모x값즉 10을 가져다 쓸수있어요..
      }
      대화보기
      • jason
        1. 상속을 받았는데 super를 사용하는 이유에 대해서 잘 모르겠네요
        혹시...overriding되었으나, 부모에게 물려받은 것을 사용하고 싶어서 그럴까요?
      • Caffee
        public int sum(int v1, int v2, int v3) {
        return this.sum(v1, v2) + v3;
        으로 변경하고,
        System.out.println(c3.sum(2, 1, 1));
        를 실행시키면,
        Cal3!!!
        4
        가 출력되는데, 전체 흐름이 궁금합니다.

        Cal3에 갔는데, 매개변수인 sum function이 없어서, 부모 클래스의 sum으로 가게되고, this.sum(v1, v2)를 계산하기 위해 Cal의 sum(int v1, int v2)로 이동한다면, Cal3 클래스 안의 System.out.println("Cal3!!");가 실행되지 않을 것 같아서 질문드립니다. this.sum을 사용하지 않으면, 예상대로 Cal3!!이 출력되지 않네요.
      • 벼랑끝의나
        this나 super나 어떤 클래스 내에 있는 메소드(혹은 변수)인지 가독성을 높이기 위해 명확하게 하기 위해 쓰는 것 아닐까요?
        대화보기
        • oyuiw
          20201213
        • 자바가 무섭지 않은 예솔
          super를 굳이 왜 써야하는건지 이해하기가 어렵네요ㅠㅠ
        • 안광민
          this = 자기자신, super = 부모를 가리킨다

          완료
        • 싱와
          this 는 자기자신 클래스 내에 있는 메소드를 지칭할때,
          super는 부모 클래스 내에 있는 메소드를 지칭할때 쓰기!!
        • 콜라
          감사합니다
        • 빽토리얼
          this: 자신 클래스 내의 메서드, 필드를 지칭할 때 사용
          super: 부모 클래스 내의 메서드, 필드를 지칭할 때 사용
        • 넘무
          감사합니다
        • thebluerat
          2020년 6월 25일 목요일
        • hyuna lee
          감사해요.
          머리나빠서 여기만5번 봤어요.
          근데 마지막 멘트에 this는 자기자신 sum은 부모라고 하셨는데 super가 부모인데 잘못말씀하신건지요?
        graphittie 자세히 보기