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. 2021.09.02 완료
  2. 이마누
    완료
  3. Eunyoung Eunice Kang
    2021년 8월 14일 완료
  4. labis98
    20210814 good!!!
  5. super1Nova
    210808
  6. 초딩 개발자
    2021/07/22
  7. 싸알
    super -> 부모 호출
    this ->자기 자신 호출
  8. 김준형
    명쾌한 답변이 될지는 모르겠지만 최대한 자세히 설명해 보겠습니다!
    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을 가져다 쓸수있어요..
      }
      대화보기
      • 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나 어떤 클래스 내에 있는 메소드(혹은 변수)인지 가독성을 높이기 위해 명확하게 하기 위해 쓰는 것 아닐까요?
        대화보기
        • 20201213
        • 자바가 무섭지 않은 예솔
          super를 굳이 왜 써야하는건지 이해하기가 어렵네요ㅠㅠ
        • 안광민
          this = 자기자신, super = 부모를 가리킨다

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