기록하는 공간
오버로딩과 오버라이딩 본문
오버로딩과 오버라이딩은 이름이 비슷하여 서로 혼동하기 쉽지만 그 차이는 명확하다.
오버로딩과 오버라이딩
- 오버로딩(overloading)
- 기존에 없는 새로운 메서드를 정의하는 것(new)
- 오버라이딩(overriding)
- 상속받은 메서드의 내용을 변경하는 것(change, modify)
오버로딩과 오버라이딩의 차이를 하나씩 살펴보자.
1. 오버로딩(overloading)
1.1 오버로딩이란?
- 기존에 없는 새로운 메서드를 정의하는 것
- 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 ‘메서드 오버로딩(method overloading)’ 또는 ‘오버로딩(overloading)’이라고 한다.
- 오버로딩이 성립하기 위한 조건이 있다.
- 메서드 이름이 같아야 한다.
- 매개변수의 개수 또는 타입이 달라야 한다.
1.2 오버로딩의 예
void println()
void println(boolean x)
void println(char x)
void println(int x)
void println(double x)
void println(int[] x)
.
.
.
이와 같이 메서드 이름이 같고 매개변수의 개수 또는 타입이 다른 것을 ‘오버로딩’ 이라고 한다.
다른 예시들도 살펴보자
int add(int a, int b) { return a + b; }
int add(int x, int y) { return x + y; }
다음 예시는 매개변수의 이름이 다른 경우이다. 이 경우에는 오버로딩으로 간주하지 않는다. 그 이유는 매개변수의 이름이 다르면 메서드 내에서 사용되는 변수의 이름이 달라질 뿐이지 아무런 의미가 없다.
int add(int a, int b) { return a + b; }
long add(int a, int b) { return (long)(a + b); }
다음 예시는 메서드를 호출 했을 때 매개변수의 타입과 개수가 일치하기 때문에 어떤 메서드가 호출된 것인지 결정할 수 없기 때문에 오버로딩으로 간주하지 않는다.
long add (int a, long b) { return a + b; }
long add (long a, int b) { return a + b; }
마지막으로 이 경우에는 호출 시 매개변수의 값에 의해 호출될 메서드가 구분될 수 있기 때문에, 중복된 메서드가 아니다. 그러므로 오버로딩으로 간주한다.
1.3 오버로딩의 장점
- 오버로딩을 통해 여러 메서드들이 하나의 이름으로 정의될 수 있다.
- 하나의 이름만 기억하면 되므로 기억하기도 쉽고 이름도 짧게 할 수 있어서 오류의 가능성을 줄일 수 있다.
- 메서드의 이름이 같은 것을 보고 같은 기능을 할 것이라는 예측이 쉽다.
- 메서드의 이름을 절약할 수 있다.
- 하나의 이름으로 여러 개의 메서드를 정의할 수 있으니, 메서드의 이름을 짓는데 고민을 덜 수 있는 동시에 사용되었어야 할 메서드 이름을 다른 메서드의 이름으로 사용할 수 있기 때문이다.
2. 오버라이딩(overriding)
2.1 오버라이딩이란?
- 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것.
- 자손 클래스 자신에 맞게 변경해야 하는 경우에는 조상의 메서드를 오버라이딩 해야한다.
- 오버라이딩이 성립하기 위한 조건이 있다.
- 이름이 같아야 한다.
- 매개변수가 같아야 한다.
- 반환타입이 같아야 한다.
2.2 오버라이딩의 예
class Point {
int x;
int y;
String getLocation() {
return "x :" + x + ", y" + y;
}
}
class Point3D extends Point {
int z;
@Override
String getLocation() {
return "x :" + x + ", y :" + y + ", z :" + z;
}
}
다음 예시와 같이 부모 클래스의 메서드를 자식 클래스에서 재정의 하는 것이다.
2.3 오버라이딩 주의점
- 조상 클래스의 메서드를 자손 클래스에서 오버라이딩할 때
- 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
- 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.
- 인스턴스메서드를 static메서드로 또는 그 반대로 변경할 수 없다.
마지막으로 오버로딩과 오버라이딩을 다음 코드를 보고 구분 해보자
class Parent {
void parentMethod() {}
}
class Child extends Parent {
void parentMethod() {} // 오버라이딩
void parentMethod(int i) {} // 오버로딩
void childMethod() {}
void childMethod(int i) {} // 오버로딩
void childMethod() {} // 에러 -> 중복정의
}
끝으로 오버로딩과 오버라이딩의 차이점을 알아보았다.
처음 접했을 때 이름이 비슷해 같은 기능을 할 줄 알았지만,
공부하면서 확연히 다른 기능을 한다는 것을 배울 수 있었다.
'자바' 카테고리의 다른 글
assertThatThrownBy와 assertThatCode는 무엇인가 (0) | 2023.10.31 |
---|