본문 바로가기

Programming/Java

상속과 생성자 (기본생성자와 super)

반응형

 

package org.opentutorials.javatutorials.Inheritance.example3;
 
class Calculator {
    int left, right;
     
     
    // "여기"
    // 기본생성자를 명시적으로 선언해줘야 한다.
    // public Calculator(){}
    public Calculator(int left, int right){
        this.left = left;
        this.right = 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 {
    public SubstractionableCalculator(int left, int right) {
        this.left = left;
        this.right = right;
    }
 
    public void substract() {
        System.out.println(this.left - this.right);
    }
}
 
public class CalculatorConstructorDemo5 {
    public static void main(String[] args) {
        SubstractionableCalculator c1 = new SubstractionableCalculator(10, 20);
        c1.sum();
        c1.avg();
        c1.substract();
    }
}
package org.opentutorials.javatutorials.Inheritance.example3;
 
class Calculator {
    int left, right;
     
     
    // "여기"
    // 기본생성자를 명시적으로 선언해줘야 한다.
    // public Calculator(){}
    public Calculator(int left, int right){
        this.left = left;
        this.right = 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 {
    public SubstractionableCalculator(int left, int right) {
        // this.left = left; 사실 상위클래스와 같은 코드를 쓰고 있어 중복이다.
        // this.right = right;
        // 위와 같은 중복을 방지하기 위해 super() 생성자를 사용한다.
        // 상위클래스의 생성자를 의미하는 super()를 사용하므로써
        // 상위 생성자를 가져올 수 있고, 이는 하위클래스의 파라미터로 바로 사용된다.
        // 초기화 코드를 super보다 먼저 호출하면 안된다.
        super(left, right)
        
    }
 
    public void substract() {
        System.out.println(this.left - this.right);
    }
}
 
public class CalculatorConstructorDemo5 {
    public static void main(String[] args) {
        SubstractionableCalculator c1 = new SubstractionableCalculator(10, 20);
        c1.sum();
        c1.avg();
        c1.substract();
    }
}
반응형

'Programming > Java' 카테고리의 다른 글

ArrayList<datatype> al = new ArrayList<datatype>();  (0) 2022.01.30
overriding의 조건  (0) 2022.01.29
extends 상속  (0) 2022.01.29
자바 생성자  (0) 2022.01.29
유효범위 전역변수 지역변수  (0) 2022.01.29