오버라이딩(Overriding)과 오버로딩(Overloading)
다형성과 오버로딩, 오버라이딩
다형성이란 하나의 메서드나 클래스가 있을 때 그것이 다양한 방법으로 동작하는 것을 말하며, 자바에서는 주로 오버라이딩(Overriding)과 오버로딩(Overloading)을 통해서 다형성을 지원한다.
오버로딩(Overloading) / 확장
같은 이름의 메서드를 여러 개 가지면서 매개변수의 유형과 개수가 다르도록 사용하는 것이다.
오버라이딩(Overriding) / 재정의
상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의 해서 사용하는 것이다.
오버로딩(Overloading)
Overload의 사전적인 의미는 과적하다인데, 부담을 많이 지우다 라는 뜻을 가지고 있다. 자바에서는 원래 한 클래스 내에 같은 이름의 메서드를 둘 이상 가질 수 없다.
하지만 아래 조건만 지킨다면 하나의 클래스에 같은 이름의 메서드를 여러 개 정의하여 구현하는 것이 가능하다. 오버로딩의 대표적인 메서드로는 println()
메서드를 들 수 있다.
오버로딩 조건
한 클래스 내에서 메서드 명이 동일해야 한다.
매개변수의 개수 또는 타입이 달라야 한다.
매개변수는 같고 리턴타입이 다른 경우 오버로딩이 성립되지 않는다.
(리턴 타입은 오버로딩을 구현하는데 아무런 영향을 주지 않는다.)
오버로딩 장점
메서드 오버로딩을 사용함으로써 메서드에 사용되는 이름을 절약할 수 있다.
메서드를 호출할 때 전달해야 할 매개 변수의 타입이나 개수에 대해 크게 신경 쓰지 않고, 호출할 수 있게 된다.
오버로딩 사용 예시
1번 조건과 2번 조건을 성립하는 예는 아래 코드와 같다.
public class Main {
public static void main(String[] args) {
Overloading ol = new Overloading();
ol.print(1);
ol.print("a");
ol.print(4, 3);
ol.print(4, "H");
}
static class Overloading {
// 메서드명 print(매개변수 한개) 기준
void print(int a) {
System.out.println(a);
}
// 메서드명 동일(매개변수 타입변경)
void print(String a) {
System.out.println(a);
}
// 메서드명 동일(매개변수 개수 변경)
void print(int a, int b) {
System.out.println(a - b);
}
// 메서드명 동일(매개변수 타입 개수 변경)
void print(int a, String s) {
System.out.println(a + s);
}
}
}
그러면 조건 3의 예시를 살펴보자.
public class Main {
public static void main(String[] args) {
Overloading ol = new Overloading();
System.out.println(ol.print(1, 2));
System.out.println(ol.print(3.5, 4.5));
}
static class Overloading {
// 리턴타입이 달라도 오버로딩은 성립된다.
int print(int a, int b) {
return a > b ? a: b;
}
// 매개변수는 같지만 리턴타입이 다른 경우
// void print(int a, int b) {
// return a > b ? a: b;
// }
// 리턴타입이 다른경우는 상관 없다.
double print(double a, double b) {
return a > b ? a : b;
}
}
}
위 주석된 부분에서 반환 타입만 다르게 할 경우 오류가 난다. 즉, 오버로딩이 성립될 수 없다.
오버라이딩(Overriding)
Override의 사전적 의미는 “~위에 덮어쓰다”, “~에 우선하다”라는 뜻을 가지고 있다.
상속 받은 부모 클래스에서 이미 정의된 메서드를 자식 클래스에서 재정의 하는 것을 말한다.(private
제외)
자식 클래스에서 메서드를 재정의하면 부모 클래스의 메서드가 아닌 자식 클래스의 메서드가 실행된다. 즉, 재정의 된 메서드가 우선권을 가진다. @Override
라는 어노테이션을 사용하는데, 이 어노테이션은 오버라이딩을 검증하는 기능을 한다. 오버라이딩의 대표적인 예로는 toString()
메서드가 있다.
오버라이딩 조건
부모 클래스의 메서드와 메서드 이름이 동일해야 한다.
매개변수의 타입, 개수, 순서가 일치해야 한다.
리턴 타입이 동일해야 한다.
접근 제허자는 부모 클래스의 메서드와 같거나 더 넓은 범위여야 한다.
부모 메서드의 예외와 같거나 예외의 개수를 줄일 수 있다.
오버라이딩 사용 예시
public class Overriding {
public static void main(String[] args) {
Person p = new Person();
Heo h = new Heo();
p.print();
h.print();
}
}
class Person {
void print() {
System.out.println("Person 클래스의 print() 매서드");
}
}
public class Heo extends Person{
@Override
public void print() {
System.out.println("HEO 클래스의 print() 메서드");
}
}
오버라이딩(Overriding)과 오버로딩(Overloading)의 차이점
정의
한 클래스내에 동일한 메서드명으로 작성
상속 받은 부모 클래스에 정의되어 있는 메서드를 자식 클래스에서 재정의
접근 제어자
모든 접근 제어자 사용 가능
부모 클래스의 메서드의 접근 제어자와 같거나 더 넓은 범위
리턴(반환)형
달라도 됨
동일해야 함
메서드 명
동일해야 함
동일해야 함
매개변수
타입, 개수, 순서가 달라야만 함
타입, 개수, 순서가 동일해야 함
적용 범위
한 클래스 내에서
상속관계일 때
참고 자료
Last updated