Java 상속

상속과 생성자

수업소개

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

 

 

 

강의

 

 

소스코드

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. 안광민
    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를 실행해야 한다. 즉, 부모와 매칭되는 생성자를 만들어야 한다.

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

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

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

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

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

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

    이 this는 부모에게서 상속받은 생성자의 인자값인데, 이것이 이미 상속되어 Cal3 이라는 클래스 내부의 값이 되었기 떄문에 Cal3에서의 this의 값으로 정의되어 표현된다. v1,v2의 값을 재정의할수도 있겠지만.. 생성자로서 상속받은 값을 굳이 재정의할 이유와 논리적인 이유가 없기에 그냥 쓰자. 생성자를 쓰는 이유가 그런것 아닌가? 굳이 재정의할 이유가..
  3. 콜라
    감사합니다
  4. 이정왓
    {this.v1+v2;}
    {this.v1-v2;} > 중괄호 안에 세미콜론 주의
  5. 이정왓
    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 자세히 보기