JAVA

자바 상속 기초 2) super - 공부하는 도비

DOVISH WISDOM 2022. 4. 2. 18:26  
728x90
반응형

지난 피드에서 상속이 무엇인지, 왜 필요한지에 대해 설명했습니다.

 

2022.04.02 - [자바] - [자바] 상속 기초 1) - 공부하는 도비

 

[자바] 상속 기초 1) - 공부하는 도비

오늘은 상속 기본 개념을 알아보겠습니다. 우리가 어떤 프로그램 소스 파일을 가졌고, 그 소스 코드의 기본 동작에다가 추가하고 싶은 기능이 있다고 가정해볼게요. 가장 쉬운 방법은 소스 코드

yang-wistory1009.tistory.com

 

자바는 생성자라는 초기화 작업을 가능케 하는 특수한 메소드가 있는데, 상속을 하다 보니 부모 생성자와 자식 생성자 부분에서 문제가 생긴다는 걸 발견했습니다. 

 

우선, 무슨 문제가 발생하는 지 코드를 통해서 알아보겠습니다. 

 

위의 코드를 실행 시키면, 아래와 같은 오류가 발생합니다. 

 

부모 클래스에는 매개변수를 가지고 있는 생성자를 선언하였고, 자식 클래스에서도 매개변수를 가지고 있는 생성자를 선언하였습니다. 

 

자식 클래스가 제일 처음 동작할 때, 부모 클래스의 기본 생성자를 우선적으로 호출하게 되어있는데, 부모 클래스에서 매개변수를 가진 생성자를 가질 때, (기본 생성자가 아닐 때) 오류가 발생하게 됩니다.  

 

자바는 사용자가 생성자를 선언하면 기본생성자를 만들어주지 않기 때문에, 위와 같이 부모 클래스에 명시적으로 기본 생성자를 선언하라는 오류(must explicitly invoke another constructor)가 발생합니다. 

 

따라서, 위의 코드를 올바르게 동작하게 하기 위해선 부모 클래스에 기본 생성자를 추가해주면 됩니다.

 

하지만, 위의 코드를 잘 보면 부모 클래스의 생성자 내용과 자식 클래스의 생성자 내용이 동일하다는 걸 확인할 수 있습니다. 즉, 코드의 중복이 발생하고 이를 해결하기 위해서 "super"라는 용어가 나오게 되었습니다.

 

super는 부모 클래스를 의미하는데, 다음과 같이 사용됩니다.

 

자식 클래스의 생성자 안에서, super(매개변수) 를 주면 부모 클래스의 생성자를 호출해서 객체를 초기화할 수 있도록 합니다. 

 

이렇게 해서 자바의 상속에 따른 생성자 변화를 알아보았습니다. 

 

package Inferitance;

class Calculator {
	int left, right;
	
	public Calculator(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 SubstractionalbeCalculator extends Calculator {
	public SubstractionalbeCalculator(int left, int right)
	{
		super(left, right);
	}
	public void sub()
	{
		System.out.println(this.left - this.right);
	}
}
public class CalculatorDemo {
	public static void main(String args[])
	{
		SubstractionalbeCalculator subc = new SubstractionalbeCalculator(50, 30);
	
		subc.sum();
		subc.avg();
		subc.sub();
	}
}