[JAVA] 상속에서의 생성자

정연진·2021년 4월 1일
0
post-custom-banner

public class Exam {
	private int kor;
	private int eng;
	private int math;
	
	public Exam() {
		this(10,10,10);//오버로드 생성자 호출
	}
	
	//오버로드 생성자 (오버로드생성자 있으면 기본생성자 안만들어줌.기본생성자는 만들어주는게 좋음)
	public Exam(int kor, int eng, int math) {
		this.kor=kor;
		this.eng=eng;
		this.math=math;
	}
	
	public int total(int ext) {
		return kor+eng+math;
	}

	public int total() {
		return kor+eng+math;
		
	}
	public float avg() {
		return total()/3.0f;
	}
}

위 클래스를 상속받는 NewExam 클래스를 만들어 주었다.

package ex7.상속.IS_A;

public class NewExam extends Exam {// 부모를 가지는 클래스는 두개의 객체를 생성한다. super: 부모객체를 지칭함
	private int com;

	public NewExam() {
		super(); // super의 생성자 호출(생략가능), 부모클래스의 기본생성자 자동으로 호출됨
		com=10;
	}
	

	@Override
	public int total() {
		// TODO Auto-generated method stub
		return super.total() + com;
	}

	@Override
	public float avg() {
		// TODO Auto-generated method stub
		return total() / 4.0f;
	}

}

자식 클래스의 생성자가 호출 될 때 가장 먼저 부모 클래스의 기본 생성자가 호출된다.
이는 super();로 호출할 수 있고 생략이 가능하다.

NewExam 클래스를 변경해 보았다.

package ex7.상속.IS_A;

public class NewExam extends Exam {// 부모를 가지는 클래스는 두개의 객체를 생성한다. super: 부모객체를 지칭함
	private int com;

	public NewExam() {
		//super();
		this(1,1,1,1); //오버로드 생성자 호출	
	}
	
	public NewExam(int kor, int eng, int math,int com) {
		super(kor,eng,math);
		this.com=com; //여기까지 오기 전에(내꺼 건드리기전에) super호출 안됐었다면 super()기본생성자 자동으로 호출됐을 것임..근데지금은 아님 super(k,e,m)가 호출됐기 때문에
	}

	@Override
	public int total() {
		// TODO Auto-generated method stub
		return super.total() + com;
	}

	@Override
	public float avg() {
		// TODO Auto-generated method stub
		return total() / 4.0f;
	}

}

네 개의 매개변수를 갖는 오버로드 생성자를 추가하였다.
또한 그 안에서 부모 클래스의 오버로드 생성자를 호출 하였다.

이 때 기본생성자에서 자동으로 호출 되던 부모클래스의 기본생성자는 어떻게 되는 걸까?
답은 호출되지 않는다. 이다.

public NewExam() {
		//super();
		this(1,1,1,1); //오버로드 생성자 호출	
	}
	
	public NewExam(int kor, int eng, int math,int com) {
		super(kor,eng,math);
		this.com=com; //여기까지 오기 전에(내꺼 건드리기전에) super호출 안됐었다면 
        		      //super()기본생성자 자동으로 호출됐을 것임..
        		      //근데지금은 아님 super(k,e,m)가 호출됐기 때문에
	}

주석을 보면 알 수 있듯이
this.com = com; 이 코드를 수행하기 전까지 (선생님은 내꺼 건드리기전에 라고 표현하셨음) 부모 클래스의 생성자가 호출되지 않았었다면 자동으로 super()가 호출 되었을 것이다.
super()는 자식 생성자의 맨 첫줄에 위치해야하기 때문이다.
하지만 위 코드에서는 오버로드 생성자(super(kor,eng,math);)가 호출되었기 때문에 super()는 호출되지 않는 것이다!!

또 한 가지 주의할 점은
부모클래스의 매개변수를 갖는 (오버로딩된) 생성자는 자식객체가 생성될때 자동으로 호출되지 않는다. 명시적으로 호출해주어야 한다.

profile
열공해욧
post-custom-banner

0개의 댓글