본문 바로가기
Programming/JAVA

생활코딩 JAVA 상속

by DONGKU 2020. 7. 2.

출처: 생활코딩 JAVA 상속


상속

상속을 이용하면 기존의 클래스를 수정하지 않고도, 유지보수가 쉬운 클래스를 만들 수 있음
재사용성 유지보수편의성 가독성 코드의양감소

caculateApp.java

class Cal {
    public int sum(int v1, int v2) {
        return v1 + v2;
    }
}
class Cal3 extends Cal{  // Cal을 상속받은 Cal3

}
public class calculate {

    public static void main(String[] args) {

        Cal c = new Cal();
        System.out.println(c.sum(2,1));

        Cal3 c3 = new Cal3();
        System.out.println(c3.sum(2,1));
    }

}

기능의 개선과 발전

Overriding, 상속이 존재하는 근본적인 원인 중 하나

class Cal {
    public int sum(int v1, int v2) {
        return v1 + v2;
    }
}
class Cal3 extends Cal{  // Cal을 상속받은 Cal3
    // 부모가 갖고있지 않은 메소드를 추가
    public int minus(int v1, int v2) {  
        return v1 - v2;
    }
    // Overriding, 부모가 갖고있는 메소드를 재정의(덮어쓰기)
    public int sum(int v1, int v2) {  
        System.out.println("Cal3!!");
        return v1 + v2;
    }
}
public class calculate {

    public static void main(String[] args) {

        Cal c = new Cal();
        System.out.println(c.sum(2,1));  // 3

        Cal3 c3 = new Cal3();
        System.out.println(c3.sum(2,1));   // Cal3!!  3 , 재정의된 채로 출력
        System.out.println(c3.minus(2,1));  // 1
        System.out.println(c3.sum(2, 1));  // Cal3!!  3,  재정의된 채로 출력
    }

}

Overriding vs Overloading


class Cal {  
public int sum(int v1, int v2) {  
return v1 + v2;  
}  
// Overloading, 자바는 같은 이름의 메소드를 여러개를 과적할 수 있다. 어떻게? 형태만 다르게!  
// v3 추가  
public int sum(int v1, int v2, int v3) {  
return v1 + v2 + v3;  
}  
}  
class Cal3 extends Cal{ // Cal을 상속받은 Cal3  
public int minus(int v1, int v2) {  
return v1 - v2;  
}  
public int sum(int v1, int v2) {  
System.out.println("Cal3!!");  
return v1 + v2;  
}  
// 자식클래스에서 Overloading될 경우, 부모클래스가 가지고 있지 않은 기능을 추가하면서 부모클래스가 가지고 있는 클래스 중에 이름이 같은 것과 함께 공존  
// public int sum(int v1, int v2, int v3) {  
// return v1 + v2 + v3;  
// }  
}  
public class calculate {


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));
}
}

this & super

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


class Cal {  
public int sum(int v1, int v2) {  
return v1 + v2;  
}  
public int sum(int v1, int v2, int v3) {  
return this.sum(v1,v2) + v3; // this는 자기 자신을 가리킴  
}  
}  
class Cal3 extends Cal{  
public int minus(int v1, int v2) {  
return v1 - v2;  
}  
public int sum(int v1, int v2) {  
System.out.println("Cal3!!");  
return super.sum(v1,v2); // 부모(super) 클래스의 sum을 호출  
}  
}  
public class calculate {

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 Cal {  
int v1,v2;  
Cal(int v1, int v2) { // 생성자로 int v1, int v2 넣어줌  
System.out.println("Cal init!!");  
this.v1 = v1; this.v2 = v2; // 매개변수로 들어온 값을 this를 통해 자기자신의 v1, v2 에 넣어줌  
}  
public int sum() {return this.v1+v2;}

앞으로..

}
// 상속받은 클래스의 부모가 생성자가 있다면 자식은 반드시 부모 생성자를 실행 시키도록 강제하고 있다!
class Cal3 extends Cal{

Cal3(int v1, int v2) {
    // super는 부모클래스의 생성자 // 생성자를 만들어서 부모 클래스를 반드시 호출해야된다
    super(v1, v2);  // Cal init!! 출력 (부모클래스 호출)
    System.out.println("Cal3 init!!");
}
public int minus() {return this.v1-v2;}

}  
public class calculate {

public static void main(String[] args) {

    Cal c = new Cal(2,1);  // 입력값 넣어줌
    Cal3 c3 = new Cal3(2,1);
    System.out.println(c3.sum()); // 3, c3엔 sum이 없으므로 부모 클래스에서 호출
    System.out.println(c3.minus()); // 1
}

}

앞으로..

상속을 하면 기능이 급격히 늘어 클래스들간의 호환성이 떨어지게 되고 클래스를 다른 클래스로 교체하는 것이 어려워짐
이런 맥락에서 자식 클래스를 부모 클래스로써 동작하도록 규제하는 테크닉
-> Polymorphism, 다형성

클래스 또는 메소드 그리고 변수를 사용자들이 아무거나 건드리지 못하게 제한하는 기능
-> Access Modifiers, 접근제어자

더이상 상속하지 못하게, 오버라이딩 하지 못하게, 변수 수정을 못하게
-> Final

클래스를 상속해서 사용하려는 사용자에게 어떤 특정한 메소드는 꼭 구현하라고 강제하고싶을 때, 상속자가 직접 구현해야하는 기능을 구현토록 강제할 수 있음
-> Abstract

댓글