13. Method Overriding (메소드 오버라이딩) [ JAVA ]

duck-ach·2022년 8월 1일
0

JAVA

목록 보기
13/27

메소드 오버라이딩(Method Overriding)

Method Overriding(메소드 오버라이딩)이란, Super Class(슈퍼 클래스)의 메소드를 Sub Class(서브 클래스)에서 재정의 하는 것을 의미한다.

만약, 부모 클래스(Super Class)로부터 물려받은 메소드를 사용하지 못하는 경우 메소드 오버라이딩(Method Overriding)이 필요하다.
예를들어, 꼬깔콘 고소한 맛이 있다. 꼬깔콘 군옥수수맛꼬깔콘 매콤달콤맛을 만들기 위해서는 꼬깔콘 고소한 맛을 상속받되, 맛을 바꿔야한다.
이렇게 물려받을 메소드를 사용할 수 없을 때 메소드의 형식을 물려받아 내용물을 바꾸는 것을 오버라이딩(Overriding)이라고 한다.

오버라이딩이 이루어지기 위해서는 간단한 규칙이 존재한다.

  1. 오버라이드의 핵심은 Super클래스(부모클래스)와 Sub클래스(자식클래스)간에 똑같은 메소드가 있어야 한다.
  2. 오버라이딩을 정의해 준 곳 위에는 @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();
	}
	
	
}
profile
자몽 허니 블랙티와 아메리카노 사이 그 어딘가

0개의 댓글