Search

오버로딩과 오버라이딩

Tags
Java
Date
2023/11/10

개요

우아한 프리코스를 진행하면서 자바 기본기에 대한 중요성을 깨닫고 있습니다. 오늘은 오버라이딩과 오버로딩의 차이점에 대해 간단하게 서술해보고자 합니다.

1. 오버라이딩이란?

오버라이딩이란 부모 클래스로부터 상속받은 메서드를 자식 클래스에서 재정의하는 것을 말합니다.
상속받은 메서드를 그대로 사용할 수 있지만, 자식 클래스에서 상황에 맞게 변경해야 하는 경우 오버라이딩이 필요합니다.

1.1 오버라이딩의 조건

오버라이딩은 앞서 말했듯 “재정의”하는 것이므로, 오버라이딩 하고자 하는 메서드 이름, 파라미터, 리턴값이 모두 같아야 합니다.
프리코스 중 일부 코드를 가져와보겠습니다. 다음은 DiscountPolicy 라는 인터페이스인데요, 인터페이스는 모든 메소드가 추상 메서드로 구상되어 있어 자식 클래스에서 반드시 오버라이딩 해야 합니다.
public interface DiscountPolicy { String getDescription(); boolean isApplicable(DiscountContext discountContext); int calculateDiscount(DiscountContext discountContext); }
Java
복사
그렇다면 위 코드를 어떻게 오버라이딩 할까요? 오버라이딩의 예시는 다음과 같습니다.
public class ChristmasDiscountPolicy implements DiscountPolicy { private static final int START_DAY = 1; private static final int END_DAY = 25; private static final int START_DISCOUNT_CRITERION = 1000; private static final int DAILY_INCREMENT_CRITERION = 100; private final String description = "크리스마스 디데이 할인"; @Override public String getDescription() { return description; } @Override public boolean isApplicable(DiscountContext discountContext) { int visitDay = discountContext.getVisitDate().getDay(); return visitDay >= START_DAY && visitDay <= END_DAY; } @Override public int calculateDiscount(DiscountContext discountContext) { if (!isApplicable(discountContext)) { return 0; } int cumulativeDay = discountContext.getVisitDate().getDay() - START_DAY; return START_DISCOUNT_CRITERION + (cumulativeDay * DAILY_INCREMENT_CRITERION); } }
Java
복사
부모 클래스에서 정의된 getDescription(), isApplicable(), calculateDiscount() 에 대해서 재정의 한 것이 보이시나요?
오버라이딩은 @Override 어노테이션과 함께 사용합니다.

2. 오버로딩이란?

오버로딩이란 클래스 내에 같은 이름을 가진 메소드가 있더라도 메소드의 매개변수의 개수, 타입, 반환 타입을 다르게하여 메소드를 정의하는 것을 의미합니다.

2.1 오버로딩 조건

오버로딩의 조건은 매개변수의 개수, 타입이 달라야 하며 반대로 메소드 이름은 같아야 합니다.
주의할 점은 반환 타입만 다른 것은 오버로딩을 할 수 없습니다. 또한, 메소드 말고도 생성자에서도 오버로딩이 가능합니다.
예를 들어, 생성자만 다르게 오버로딩 한 코드입니다.
public class Student { private final String name; private final int age; public Student(){ this.name = "홍길동"; this.age = 21; } public Student(String name){ this.name = name; this.age = 24; } public Student(String name, int age){ this.name = name; this.age = age; } } ... public static void main(String [] args) { Student student1 = new Student(); // 홍길동, 21 Student student2 = new Student("홍길순"); // 홍길순, 24 Student student3 = new Student("홍박사", 27); // 홍박사, 27 }
Java
복사