TIL_180417 Java 상속과 생성자, overriding/loading
상속과 생성자
- Class 자식클래스명 extends 부모클래스명 {}을 통해 상속 가능
- 자바는 객체 속에 기본적으로 자신의 이름(객체명)과 동일한 생성자를 만듬
- 직접적인 생성자를 만들 경우 암시적 생성자는 만들어 지지 않음
- 부모클래스와 자식클래스가 모두 매개변수를 언급하고 있을 시, 에러 발생
- -> 하위객체는 extends함으로써 자바가 만든 부모객체의 암시적 생성자를 따르게 되는데, 프로그래머가 직접 지정해줌으로써 따를 수가 없기에 에러 발생
상속과 생성자 에러 해결방안 2가지
1. 부모클래스에 암시적(기본) 생성자를 직접 삽입하기
|
|
2. 자식객체에 super 키워드 사용하기
super키워드란?
- super 키워드는 부모 클래스를 의미
- 여기에 ()붙이면 부모 클래스의 생성자를 의미하게 됨
- 이렇게 하면 부모 클래스의 기본 생성자가 없어져도 오류발생 X
자식 클래스의 생성자에서 super를 사용할 때 주의할 점
- 자식 클래스의 초기화문보다 super 키워드가 가장 먼저 사용되어야 함
-자식클래스는 부모클래스의 상속으로 인스턴스를 생성하기 때문에, 부모클래스의 초기화가 끝난 상태에서만 자식클래스의 초기화 진행이 가능12345678910111213141516171819202122232425262728293031323334public 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);}}class SubstractionableCalculator extends Calculator {public SubstractionableCalculator(int left, int right) {// 자식객체에 super키워드 사용super(left, right);}public void substract() {System.out.println(this.left - this.right);}}public class CalculatorConstructorDemo5 {public static void main(String[] args) {//setOperands 함수 호출 없이 객체 생성시 left 와 right 값을 설정하기 위해서SubstractionableCalculator c1 = new SubstractionableCalculator(10, 20);c1.sum();c1.avg();c1.substract();}}
Overriding
부모클래스의 메소드를 하위클래스에서 재정의하기 위해서는 몇가지 조건이 동일하여야 함
- 메소드 이름
- 리턴 타입
- 매개변수의 수, 타입, 순서
-> 이럴경우, 부모클래스와 하위클래스의 코딩이 중복됨
-> 중복을 피하기 위해서는 super 키워드 사용
오버라이딩 vs 오버로딩
오버라이딩은 하위클래스가 상속받은 부모클래스의 메소드를 새롭게 변경, 정의하여 사용하고자 할때 사용.
오버로딩은 같은 이름, 다른 매개변수의 메소드를 여러개 만들 수 있음 (eg. 같은 기능을 하는 하나의 메소드이나, 매개변수의 갯수에 따른 경우의 수와 같은 때에 적용)