생활코딩

Coding Everybody

코스 전체목록

닫기

상속과 생성자

수업소개

생성자가 있는 클래스를 상속할 때 상위 클래스의 생성자를 실행해야 합니다. 그 방법에 대해서 알아봅니다. 

 

 

 

강의

 

 

소스코드

https://github.com/egoing/java-inheritance/commit/179c452c4b2a782f97fc395d7366af426d782e1e

class Cal{
    int v1,v2;
    Cal(int v1, int v2){
        System.out.println("Cal init!!");
        this.v1 = v1; this.v2 = v2;
    }
    public int sum(){return this.v1+v2;}
}
class Cal3 extends Cal{
    Cal3(int v1, int v2) {
        super(v1, v2);
        System.out.println("Cal3 init!!");
    }
    public int minus(){return this.v1-v2;}
}
public class InheritanceApp {
    public static void main(String[] args) {
        Cal c = new Cal(2,1);
        Cal3 c3 = new Cal3(2, 1);
        System.out.println(c3.sum()); // 3
        System.out.println(c3.minus()); // 1
    }
}

 

댓글

댓글 본문
  1. nextLevel
  2. 당당
    2023.04.23
  3. 자바뿌시기
    22.01.07
  4. 보통사람 박코딩
    할수있다
  5. 코딩드림
    221114
  6. 상속시 부모클래스에 생성자함수가있따면

    자식클래스는 반드시 부모클래스를 실행시켜야한다
    => suepr(~~);
  7. 코딩이취미다
    return this.v1+v2 -> return this.v1 + this.v2
    동일한 코드 입니다.
  8. 육도
    2022.05.14 완료
  9. 나연
    2022년 2월 23일 (수) 완료

    한 클래스를 제대로 계승했다면 그 클래스가 인스턴스로 만들어질 때 반드시 해야 하는 일들이 생성자에 들어 있음
    - 그러면 생성자를 계승하는 클래스도 실행을 해야 제대로 계승하는 것

    자바는 상속 받은 클래스의 부모가 생성자가 있다면 자식은 반드시 부모 생성자를 실행하도록 강제

    ```java
    class ChildCalculator extends Calculator {

    ChildCalculator(int value1, int value2) {
    super(value1, value2); // 부모 클래스의 생성자
    }

    }
    ```

    생성자가 있는 클래스를 상속 받았다면 그 클래스에 생성자를 만들어 반드시 부모 클래스 생성자를 호출해야 함
  10. 열정jk
    220220 감사합니다
  11. 주간식당메뉴
    2021.12.02.
  12. everdoit
    찾아보니 자식의 생성자 부분에서 super(v1,v2)는 parameter를 전달하여 부모 생성자를 호출하는 방식으로 이해했습니다.
  13. everdoit
    부모 class 에 생성자가 있다면 자식 class 에도 반드시 부모클래스에서 존재하는 생성자가 있어야 한다.
    잘 이해가 안가는 부분 : super(v1, v2); 가 갑자기 자식 클래스에서 부모클래스의 생성자로 나오는데 잘 이해가 안가네요
  14. 2021.09.02 완료
  15. 이마누
    완료
  16. Eunyoung Eunice Kang
    2021년 8월 14일 완료
  17. labis98
    20210814 good!!!
  18. super1Nova
    210808
  19. 초딩 개발자
    2021/07/22
  20. 정수리에 뉴럴링크
    한 10번 돌려보면서 이해했습니다 ㅋㅋ 머리가 안좋으면 몸이 고생이네요 ㅋㅋ
  21. jeisyoon
    2021.05.03 Inheritance & Constructor - OK

    Parent Class 에 Construct(생성자) 가 있으면 상속받은 Child에 반듯이 Construct를 상속하여야 한다.
    Constructor는 초기에 주입할 필요한 값을 전달하거나 초기에 작업을 수행 할 때 사용해야 하므로 Child에서도 반듯이 생성자가 있어야 하기 때문이다.
  22. 레이
    2021.04.18
  23. oyuiw
    20201213
  24. 안광민
    class Cal{
    int v1, v2;
    Cal(int v1, int v2) {
    this.v1 = v1; this.v2 = v2;
    System.out.println("Cal in it");
    }
    public int sum() {
    return this.v1+v2;
    }
    }

    class Cal2 extends Cal {
    Cal2(int v1, int v2) {
    super(v1, v2);
    System.out.println("Cal2 in it");
    }
    public int minus() {return this.v1-v2;}

    }

    public class InheritanceApp {

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

    부모 class에 constructor가 있다면 자식은 반드시 부모 constructor를 실행해야 한다. 즉, 부모와 매칭되는 생성자를 만들어야 한다.

    완료
  25. 싱와
    생성자가 있는 부모 클래스를 상속받으려면 생성자도 함께 상속 받아야 한다.

    Cal3(int v1, int v2) {
    super(v1, v2);

    해당 부분이 그부분, 하지만 이때는 this가 아닌, super를 써서 부모 클래스의 생성자임을 명확하게 하고, 부모에게서 상속받은 생성자임을 확실히 한다.

    생성자는 이전에도 배운 개념이지만, 초기화 하는 준비과정에서 일련의 과정들을 강제화시켜 사람들이 프로그래밍을 조금더 개발자의 의도에 맞게 쉽게 따라갈 수 있도록 하는것이다. (특정값을 집어넣어야만 작동되게 한다던지)

    상속에서도 생성자까지 상속하게 된다면 확장된 클래스에서도 초기에 세팅된 값을 쓰게 되므로 불필요한 사용자의 탐구가 줄어들게 되며, 상속된 클래스까지 그 값을 사용하게 되므로 효율성과 재확장성이 늘어남을 알 수 있다.

    super라는 것으로 부모의 생성자 인자를 받아왔기 때문에, 해당 상속 클래스에서 그 값이 그대로 쓰일 수 있는데,
    상속 클래스에서 새롭게 메소드를 작성했을때에 리턴값에 this 가 어디에 속해져있는지 조금 헷갈릴 수 있다.

    이 this는 부모에게서 상속받은 생성자의 인자값인데, 이것이 이미 상속되어 Cal3 이라는 클래스 내부의 값이 되었기 떄문에 Cal3에서의 this의 값으로 정의되어 표현된다. v1,v2의 값을 재정의할수도 있겠지만.. 생성자로서 상속받은 값을 굳이 재정의할 이유와 논리적인 이유가 없기에 그냥 쓰자. 생성자를 쓰는 이유가 그런것 아닌가? 굳이 재정의할 이유가..
  26. 콜라
    감사합니다
  27. 이정왓
    {this.v1+v2;}
    {this.v1-v2;} > 중괄호 안에 세미콜론 주의
  28. 이정왓
    this와 super 수업을 들으셨으면 알다시피 this는 자기 자신을 가리키는 코드입니다.
    this. 을 씀으로써 클래스의 멤버들을 쉽게 부르거나 정의할 수 있습니다. 이클립스에서 this. 쓰면 알아서 어떤 코드를입력할거냐고 물어보기도 하고 this.로 정의 하면 때문이죠.

    이건 제가 헷갈려서 써놓은건데 참고하셔도 괜찮을거 같아요.
    -
    초기작업을 위한 생성자를 만들고 생성자에 대한 매개변수를 int v1, int v2로 받았잖아요?
    그 매개변수를 this.v1 this.v2 로 대입을 해줌으로써 외부로부터 입력받은 값은 이제 Cal클래스, 즉 내 클래스의 매개변수이다 라고 딱 정의한거나 마찬가지라고 보시면 돼요.

    그래서 Cal 클래스의 sum 메소드에서는 따로 매개변수를 받을 필요없이 this.v1 + v2 로 return 값을 작성하면 되는거죠.

    그러면 그냥 v1+v2로 입력해도 되지 않으냐? 라고 생각 하실 수 있는데, Cal은 부모 클래스로서 자식클래스에게 본인의 멤버들을 상속합니다. 여기서 볼 수 있는 것은 자식의 minus 메소드입니다.
    Cal3생성자에서 매개변수로 받은 v1과 v2를 이제 super(v1, v2); 로 넘기면 부모클래스에 있는 생성자로 v1과 v2가 들어가게되는거겠죠? super는 부모 를 가리키는 말이니까.

    부모클래스인 Cal을 상속받으니 Cal3의 minus 메소드는 그러면 따로 "또 this로 정의할 필요없이" this.v1 - v2 로 리턴할 수 있게 되는겁니다.

    초기작업을 구축함으로써 서로서로 편리함을 주고받는 모습이라고 생각하시면 될거같아요!
    대화보기
    • 맘마단
      public int sum(){return this.v1+v2;} 여기서 this를 넣어주는 이유는 뭔가요 ?
    • hyuna lee
      감사합니다.
    • thebluerat
      2020년 7월 7일
    • 넘무
      감사합니다
    • 코딩하는라이언
      항상 잘 보고 있습니다
    버전 관리
    egoing
    현재 버전
    선택 버전
    graphittie 자세히 보기