[목차]
- overriding란
- overriding의 제약사항
overriding란
- 자식클래스에서 재정의 하게 되면 이 메소드를 호출하게 되면 부모 클래스를 무시하게 되고
- 자식클래스를 호출하는 것이 오버라이딩이라고 합니다.
// overriding 오버라이딩 사용법
packge org.opentutorials.javautorials.overriding.example1;
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);
}
}
// Sum이라고 하는 메소드를 갖고 있지 않습니다
// 부모의 Calculator의 자바는 sum메소드를 찾게 됩니다.
// Calculator 상속받은 SubstractionableCalculator 클래스가 가 부모가 이미 갖고 있는 메소드인
// sum을 재정의(overriding)을 하고 있는 것 입니다.
/*
SubstractionableCalculator의 sum을 호출하게 되면 부모의 Calculator를 사용하게 될까요?
아니면 SubstractionableCalculator 사용하게 될까요?
*/
/*
SubstractionableCalculator의 sum메소드 실행
*/
class SubstractionableCalculator extends Calculator {
public void sum() {
System.out.println("실행 결과는 " +(this.left + this.right)+"입니다.");
}
public void substract() {
System.out.println(this.left - this.right);
}
}
public class CalculatorDemo {
public static void main(String[] args) {
SubstractionableCalculator c1 = new SubstractionableCalculator();
c1.setOprands(10, 20);
// sum이라는 매소드 호출 하게 되면 SubstractionableCalculator의 매소드
c1.sum();
c1.avg();
c1.substract();
}
}
// 결과값: 실행 결과는 30입니다.
overriding의 제약사항
- 메소드의 리턴 형식이 같아야 합니다.
메소드의 이름
메소드 매개변수의 숫자와 데이터 타입 그리고 순서
메소드의 리턴 타입
- 메소드의 형태를 정의하는 사항들을 메소드의 서명이라고 합니다.
- 부모와 자식이 똑같은 코드를 갖고 있어서 중복성을 띄우고 있습니다.
package org.opentutorials.javatutorials.overriding.example1;
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 int avg() {
return ((this.left + this.right) / 2);
}
}
class SubstractionableCalculator extends Calculator {
public void sum() {
System.out.println("실행 결과는 " +(this.left + this.right)+"입니다.");
}
public int avg() {
return ((this.left + this.right) / 2);
}
public void substract() {
System.out.println(this.left - this.right);
}
}
public class CalculatorDemo {
public static void main(String[] args) {
SubstractionableCalculator c1 = new SubstractionableCalculator();
c1.setOprands(10, 20);
c1.sum();
c1.avg();
c1.substract();
}
}
- 중복을 제거 하는 방법
- 자식 매소드가 부모 매소드를 호출하기 위해서는 super라는 키워드를 사용합니다.
package org.opentutorials.javatutorials.overriding.example1;
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);
}
// return이 되면 자식의 avg에 치환이 됩니다.
// 부모클래스에서 변경을 하면 자식클래스도 같이 변경 됩니다.
//
public int avg() {
return ((this.left + this.right) / 2);
}
}
class SubstractionableCalculator extends Calculator {
public void sum() {
System.out.println("실행 결과는 " +(this.left + this.right)+"입니다.");
}
public int avg() {
// super: 현재 클래스의 부모클래스를 의미합니다.
// super.avg();부모클래스의 소속되는 avg 평균 값을 의미
// 부모 객체가 가지고 있는 avg 메소드를 호출하는 것 입니다.
// 이 뒤에다가 추가 하고 싶은 걸 추가하면 됩니다.
return super.avg();
}
public void substract() {
System.out.println(this.left - this.right);
}
}
public class CalculatorDemo {
public static void main(String[] args) {
SubstractionableCalculator c1 = new SubstractionableCalculator();
c1.setOprands(10, 20);
c1.sum();
c1.avg();
c1.substract();
}
}