Method Overriding(메소드 오버라이딩)이란, Super Class(슈퍼 클래스)의 메소드를 Sub Class(서브 클래스)에서 재정의 하는 것을 의미한다.
만약, 부모 클래스(Super Class)로부터 물려받은 메소드를 사용하지 못하는 경우 메소드 오버라이딩(Method Overriding)이 필요하다.
예를들어, 꼬깔콘 고소한 맛
이 있다. 꼬깔콘 군옥수수맛
과 꼬깔콘 매콤달콤맛
을 만들기 위해서는 꼬깔콘 고소한 맛을 상속받되, 맛을 바꿔야한다.
이렇게 물려받을 메소드를 사용할 수 없을 때 메소드의 형식을 물려받아 내용물을 바꾸는 것을 오버라이딩(Overriding)
이라고 한다.
오버라이딩이 이루어지기 위해서는 간단한 규칙이 존재한다.
- 오버라이드의 핵심은 Super클래스(부모클래스)와 Sub클래스(자식클래스)간에
똑같은 메소드
가 있어야 한다.- 오버라이딩을 정의해 준 곳 위에는
@Override
를 암묵적으로 정의해준다.
(2가지 이유 : 개발자 간에 코드를 빠르게 알아보기 위해서, Override를 정의하면 JAVA가 Override에 맞게 코드 검사를 해주어서)
간단한 예제로 오버라이드가 어떤식으로 이루어지는지 알아보도록 하자.
커피의 맛 표현하기
public class EspressoMain {
public static void main(String[] args) {
Espresso espresso = new Espresso();
espresso.taste(); // 쓰다.
Americano americano = new Americano();
americano.taste(); // 덜 쓰다.
CafeLatte cafelatte = new CafeLatte();
cafelatte.taste(); // 부드럽다.
}
}
public class Coffee {
public void taste() {
}
}
public class Espresso extends Coffee {
@Override // 오버라이딩
public void taste() {
System.out.println("쓰다.");
}
}
public class Americano extends Espresso{
private int extraWater;
@Override // 오버라이딩
public void taste() {
System.out.println("덜 쓰다.");
}
}
public class CafeLatte extends Espresso{
private int milk;
public void taste() { // 오버라이딩
System.out.println("부드럽다.");
}
}
이렇게 public void tast()
라는 메소드를 이용하여 커피의 각기 다른 맛들의 특징을 표현해보았다.
이렇게 공통적인 요소의 값만 바뀌어야 할 때 주로 오버라이딩을 사용한다.
다양한 도형의 넓이 구하기.
public class Main {
public static void main(String[] args) {
Circle circle = new Circle("도넛", 7.5);
circle.info();
Rectangle rectangle = new Rectangle("조금 기다란 네모", 3, 4);
rectangle.info();
Square square = new Square("높이와 길이가 같은 반듯한 네모", 5);
square.info();
}
}
public class Shape {
private String type; // 도형의 종류
public Shape(String type) {
this.type = type;
}
public double getArea() {
return 0;
}
public void info() {
System.out.println("도형의 종류 : " + type);
}
}
// 원의 넓이
public class Circle extends Shape {
private double radius;
public Circle(String type, double radius) {
super(type);
this.radius = radius;
}
@Override // 오버라이딩
public double getArea() {
return Math.PI * Math.pow(radius, 2);
}
@Override // 오버라이딩
public void info() {
super.info();
System.out.println("반지름 : " + radius);
System.out.println("넓이 : " + getArea());
}
}
public class Rectangle extends Shape {
private double width;
private double height;
public Rectangle(String type, double width, double height) {
super(type);
this.width = width;
this.height = height;
}
@Override // 오버라이딩
public double getArea() {
// return this.width * this.height;
return width * height; // 너비 * 높이
}
@Override // 오버라이딩
public void info() {
super.info();
System.out.println("너비 : " + width + " / 높이 : " + height);
System.out.println("넓이 : " + getArea());
}
}
public class Square extends Rectangle {
public Square(String type, double width) { // 매개변수는 너비 하나만
super(type, width, width); // 정사각형의 너비와 높이는 같으므로.
}
@Override // 오버라이딩
public double getArea() {
return super.getArea();
}
}