상속-(2)

Jiian·2022년 5월 16일

Java-Object-Oriented

목록 보기
7/7

해당 게시물은 "생활코딩 - JAVA 상속" 유튜브 강의를 정리한 내용입니다.
또한, 프로그래머스 자바 입문 강의 내용을 정리하였습니다.

super와 부모생성자

class가 인스턴스화 될때 생성자가 실행되면서 객체의 초기화를 한다. 그 때 자신의 생성자만 실행이 되는것이 아니고, 부모의 생성자부터 실행된다.

this

this는 현재 객체, 자기 자신을 나타낸다.


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; // 자기 자신, 즉 Cal의 sum을 실행한 뒤 v3 더하기 실행
    }
}

// Cal 클래스가 갖고 있는 모든 변수와 메소드를 상속받음
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); // 부모 클래스인 Cal의 sum을 가르키게 됨
    }


}

  • 다음과 같이 실행할 경우, class Cal3 extends Cal{} 에서 오류남
class Cal {
    int v1;
    int v2;
    Cal(int v1, int v2){
        this.v1 = v1;
        this.v2 = v2;
    }
}

class Cal3 extends Cal{

}

public class InheritanceApp{
    public static void main(String[] args){
        Cal c = new Cal(2,1);
        Cal3 c3 = new Cal3();
    }
}

➔ 자식은 반드시 부모의 생성자를 실행하게끔 강제되어 있기 때문

아래와 같이 고쳐줘야 함

class Cal {
    int v1;
    int v2;
    Cal(int v1, int v2){
        System.out.println("Cal3 상속받음");
        this.v1 = v1;
        this.v2 = v2;
    }
}

class Cal3 extends Cal{

    Cal3(int v1, int v2) {
        super(v1, v2); // 부모클래스의 생성자임
        System.out.println("Cal3 상속받음");
    }
}

public class InheritanceApp{
    public static void main(String[] args){
        Cal c = new Cal(2,1);
        Cal3 c3 = new Cal3(2,1);
    }
}

  • 추가 코드

class Cal {
    int v1;
    int v2;
    Cal(int v1, int v2){
        System.out.println("Cal3 상속받음");
        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 상속받음");
    }

    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()); // Cal3에서는 sum이 없으므로 Cal에서 sum()찾음
        System.out.println(c3.minus()); // Cal3에서는 miuns 있으므로, 자신이 가지고 있는 v1-v2 실행
    }
}
profile
Slow and Steady

0개의 댓글