Java 상속

별의개발자커비·2023년 2월 10일
0

Java

목록 보기
23/66
post-thumbnail

상속 예제1

  • Calculator를 하위 클래스 Substract-가 확장extend(=상속)하고 있어서 Sub 얘도 Cal의 것들을 사용할 수 있다.
  • 상속을 통해서 코드의 중복을 제거할 수 있었고, 또 부모 클래스을 개선하면 이를 상속받고 있는 모든 자식 클래스들에게 그 혜택이 자동으로 돌아간다. 다시 말해서 유지보수가 편리해진다는 것이다. (출처 생활코딩)
class Calculator {
    int left, right;
 
    public void setOprands(int left, int right) {
        this.left = left;
        this.right = right;
    }
    // 근데 위의 절차를 왜 해야하는 거지?
 
    public void sum() {
        System.out.println(this.left + this.right);
    }
 
    public void avg() {
        System.out.println((this.left + this.right) / 2);
    }
}
 
class SubstractionableCalculator extends Calculator { // Cal를 하위 클래스 Sub가 확장extend(=상속)하고 있어서 Sub 얘도 Cal의 것들을 사용할 수 있다.
    public void substract() {
        System.out.println(this.left - this.right);
    }
}
 
public class CalculatorDemo1 {
 
    public static void main(String[] args) {
 
        SubstractionableCalculator c1 = new SubstractionableCalculator(); // 여기서 c1은 인스턴스화 된 것
        c1.setOprands(10, 20);
        c1.sum();
        c1.avg();
        c1.substract();
    }
 
}

상속 예제2 (추가된)

자식 1

class MultiplicationableCalculator extends Calculator { //Calculator은 demo1에서 정의했음.
    public void multiplication() {
        System.out.println(this.left * this.right);
    }
}
 
public class CalculatorDemo2 {
 
    public static void main(String[] args) {
 
        MultiplicationableCalculator c1 = new MultiplicationableCalculator();
        c1.setOprands(10, 20);
        c1.sum();
        c1.avg();
        c1.multiplication();
    }
 
}

자식1의 자식

class DivisionableCalculator extends MultiplicationableCalculator {
    public void division() {
        System.out.println(this.left / this.right);
    }
}
 
public class CalculatorDemo3 {
 
    public static void main(String[] args) {
 
        DivisionableCalculator c1 = new DivisionableCalculator();
        c1.setOprands(10, 20);
        c1.sum();
        c1.avg();
        c1.multiplication(); 
        c1.division();
    }
 
}

@ 학원 예제

  • 자식 클래스는 부모 클래스에서 물려받은 멤버를 그대로 사용하거나,
  • 변경할 수 있고, 새로운 멤버로 추가할 수 있다. = 메소드 오버라이딩 method overriding
  • 근데, 오버라이딩 불가
    - private 메소드: 부모클래스 전용이므로 자식클래스에 상속 못됨
    • static 메소드: 클래스소속이라 자식클래스에 상속되지 않는다.
    • final 메소드: 더 수정 못하니까 당연히 자식클래스가 오버라이딩 못함
class 자식클래스이름 extend 부모클래스이름{
// 필드
// 메소드 
}
  • 다중 상속은 안 됨

예제1

//3 
package day1;

public class Box {
	public Box() {} // 생성자 건들일거면 기본생성자는 자동으로 만들어놓아라 
    // -> 안그러면 자식 클래스 비워놓고 생성할 때 오류생김 
    // -> 왜냐 자식클래스를 만들면 기본생성자가 자동으로 숨겨져서 만들어지는데, 
    // 자식이 기본생성자 호출할 때 자동으로 부모의 기본생성자도 호출되는데 
    // 그게 없어서 오류나는 것 
	public Box(int size) { 
		this.size = size ; 
		System.out.println("Box기본생성자");
	}

}
package day1;

public class ColorBox extends Box {
	public ColorBox() {
		// 이 앞에 부모의 기본생성자 호출이 숨어있음
		System.out.println("ColorBox 기본생성자");
	}
	public ColorBox(int a) {
		super();
		System.out.println("ColorBox매개변수생성자");
	}
	
}
package day1;

public class ColorBoxDemo {

	public static void main(String[] args) {
		// 기본생성자 호출
		ColorBox cb = new ColorBox(0) ; // 부모인 Box의 기본생성자가 같이 먼저 호출됨
		
	}

}

0개의 댓글