[JAVA] 오버로딩(overloading)과 오버라이딩(overriding)의 차이점을 알아보자
목차
1. 영어 문법적 해석
2. 오버로딩과 오버라이딩에 대한 각각에 대한 분석
3. 오버로딩과 오버라이딩에 차이점 분석
4. 예제분석
텍스트 추가
텍스트 추가
1. 영어 문법적 해석
자바를 포함한 여러 프로그래밍 언어를 공부하다보면 그 근원이 외국이다보니 영어를 분석하면 해당 개념에 대한 대략적인 이해를 할 수가 있다.
먼저 아래 오버로딩을 네이버에서 검색해볼 때 아래와 같은 뜻으로 확인된다.
- 오버로딩(overloading) : 과적
한 클래스 내에서 동일한 이름의 메소드를 둘 이상 정의하는 것은 허용되지 않는다.
그러나 매개변수의 선언이 다르면 가능하다. 그리고 이것을 메소드 오버로딩이라한다.
- 오버라이딩(overriding) : 다른 무엇보다 더 중요한, 최우선시 되는(쉽게 무효화된다고 이해)
상위 클래스에 정의된 메소드를 하위 클로스에서 다시 정의하는 행위를 가르켜 메소드 오버라이딩이라고 하는데, 여기서 말하는 오버 라이딩은 무효화 시키다의 뜻으로 해석된다.
2. 오버라이딩과 오버로딩의 각각의 분석
- 0열 선택0열 다음에 열 추가
- 1열 선택1열 다음에 열 추가
- 0행 선택0행 다음에 행 추가
- 1행 선택1행 다음에 행 추가
오버로딩(overloading) |
오버라이딩(overridng) |
- 메소드의 이름, 메소드의 매겨변수 정보 를 참조하여 메소드를 찾게된다. - 동일한 이름인 메소드가 둘 이상 존재하여도 매개변수의 정보가 다르다르다면 문제되지않는다. - 구체적으로 매개변수의 정보가 다르다는 뜻은 매겨변수의 수 또는 형(type)이 달라야 한다. - 예를 들어 void naver(int a), void naver(int a, int b), void naver(double a)와 같이 매개변수의 정보가 다르다면 선언시 문제가되지않는다. |
- 상위 클래스에 정의된 메소드를 하위 클래스에 다시 정의하는 행위를 가르켜 메소드 오버라이딩이라한다. - 메소드의 이름, 메소드의 반환형, 메소드의 매개변수 선언 -> 이 세가지가 같아야 오버라이딩이 성립된다. |
※오버라이딩에 대해서 자세히 일아보자
오버로딩의 경우 상기 표에 설명된 것과 같이 간단하게 설명이 가능하지만 오버라이딩의 경우 간단한 소스코드 분석과 함께 설명이 가능할 것 같다.
아래 소스코드를 살펴보자.
class Cake{
public void yummy(){
System.out.println("Yummy Cake");
}
}
// extends : 상위 클래스 참조시 사용!
class CheeseCake extends Cake{
public void yummy(){
System.out.println("Yummy Cheese Cake);
class YummyCakeOverriding {
public static void main(String[] args) {
Cake c1 = new CheeseCake();
CheeseCake c2 = new CheeseCake();
c1.yummy();
c2.yummy();
}
}
위의 CheeseCake 클래스는 아래와 같다.
// extends : 상위 클래스 참조시 사용!
class CheeseCake extends Cake{
public void yummy(){
System.out.println("Yummy Cheese Cake);
해당 클래스는 Cake를 상속하면서 Cake에 정의된 yummy메소드에 정의된 다음 세가지가 같은 메소드를 정의하였다.
- 메소드의 이름, 메소드의 반환형, 메소드의 매개변수 선언
-> 이 세가지가 같아야 메소드 오버라이딩이 성립된다.
즉 Cake의 yummy 메소드를 CheeseCake의 yummy 메소드가 오버라이딩 하였다. 그리고 오버라이딩을 하면 참조 변수 형에 상관없이 오버라이딩 한 메소드가(CheeseCake의 yummy 메소드가) 오버라이딩된 메소드(Cake의 yummy 메소드를) 대신하게 된다.
상기 코드의 c1의 경우 Cake형 참조 변수이니 위 문장의 경우 Cake의 yummy 메소드가 호출되어야 한다고 생각 할 수 있다. CheeseCake 인스턴스를 참조하고 있는 상황이라도 말이다. 그러나 Cake의 yummy 메소드는 오버라이딩(무효화)되었기 때문에 이 경우에는 CheeseCake의 yummy 메소드가 대신 호출된다.
오버로딩과 오버라이딩의 차이점?!
3. 오버로딩과 오버라이딩의 차이점 분석
자 드디어 마지막이다. 오버로딩과 오버라이딩의 차이점을 간단히 생각하면 아래와 같다.
- 오버로딩은 메소드 이름은 같으나 매개변수가 달라야한다.
- 오버라이딩은 상위 클래스의 정의를 하위 클래스에 다시 정위하는 행위
메소드 이름, 반환형, 매개변수 이 세가지가 모두 같아야한다.
위와 같은 차이만 알아도 오버로딩과 오버라이딩을 햇갈리지않게 구분할 수 있을 것 같다.
* 위 글은 윤성우 선생님의 열혈 자바 책을 참조하여 작성하였습니다.
4. 예제분석
class Box {
public void wrap() {
System.out.println("Simple Wrapping");
}
}
class PaperBox extends Box {
public void wrap() {
System.out.println("Paper Wrapping");
}
}
class GoldPaperBox extends PaperBox {
public void wrap() {
System.out.println("Gold Wrapping");
}
}
class Wrapping {
public static void main(String[] args) {
Box box1 = new Box();
PaperBox box2 = new PaperBox();
GoldPaperBox box3 = new GoldPaperBox();a
wrapBox(box1);
wrapBox(box2);
wrapBox(box3);
}
public static void wrapBox(Box box) {
box.wrap();
}
}
*위의 예제 결과를 보면 알 수 있다시피 wrap이 오버라이딩되어 아래와 같이 각 클래스의 wrap이 호출되는 것을 확인할 수 있다.
wrapBox에 매개변수가 Box box가 되어도 전달된 매개변수의 인스턴스의 각 메소드가 호출되는 것이 확인 가능하다.