[Java] 오버 로딩과 오버 라이딩
Intro
이 글에서는 오버로딩과 오버라이딩의 특징과 차이점에 대해서 다룹니다.
오버로딩이란?
오버로딩이란 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 말한다.
자바에서는 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라도 매개변수의 개수 또는 타입이 다르면 같은 이름을 사용해서 메서드를 정의할 수 있다.
오버 로딩의 성립 조건
- 메서드 이름이 같아야 한다.
- 매개변수의 개수 또는 타입이 달라야 한다.
반환 타입은 오버 로딩에 아무런 영향을 주지 못한다는 것을 명심하자.
예시 코드
package overloadingtest;
public class OverloadTest {
int add(int a, int b) {
return a + b;
}
int add(int a, int b, int c) {
return a + b + c;
}
long add(long a, long b) {
return a + b;
}
double add(double a, double b, double c) {
return a + b + c;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
OverloadTest ot = new OverloadTest();
System.out.println(ot.add(1, 2));
System.out.println(ot.add(1, 2, 3));
System.out.println(ot.add(2147483648L, 2147483648L));
System.out.println(ot.add(1.23, 3.45, 4.56));
}
}
출력결과
3
6
4294967296
9.239999999999998
오버 라이딩이란?
오버라이딩이란 부모클래스에서 정의한 메서드를 자식 클래스에서 재정의해서 사용하는 것을 의미한다.
오버 라이딩의 성립 조건
- 메서드의 이름, 매개변수, 반환 타입이 동일해야 한다.
- 접근제어자는 부모 클래스의 메서드보다 더 제한적일 수 없다.
- 부모 메서드에 선언된 예외보다 더 많은 예외를 던질 수 없다.
이 밖의 특징
- @Override 애너테이션 : 오버라이딩임을 명시적으로 나타내기 위해 @Override를 사용한다.
- 실제 객체의 타입에 따라 호출되는 메서드가 결정된다.
예시코드
package overridingtest;
class Parent {
int data = 0;
public void print() {
System.out.println("Hello!");
}
public int add(int a, int b) {
return a + b;
}
}
public class OverridingTest extends Parent {
int data = 1;
//오버 라이딩
public void print() {
System.out.println("Nice to meet you!");
}
public int add(int c, int d) {
return (c + d) * 2;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
OverridingTest ot = new OverridingTest();
ot.print();
System.out.println(ot.add(1, 3));
}
}
출력 결과
Nice to meet you!
8
정리
구분 | 오버로딩(Overloading) | 오버라이딩(Overriding) |
---|---|---|
정의 | 같은 클래스 내에서 같은 이름의 메서드를 다른 매개변수로 정의하는 것. | 부모 클래스의 메서드를 자식 클래스에서 재정의하는 것. |
동작 시점 | **컴파일 타임(Compile-time)**에 호출 메서드가 결정됨. | **런타임(Runtime)**에 호출 메서드가 결정됨. |
메서드 이름 | 동일해야 함. | 동일해야 함. |
매개변수 | 매개변수의 개수나 타입이 달라야 함. | 매개변수는 완전히 동일해야 함. |
반환 타입 | 반환 타입이 달라도 성립 가능. | 반환 타입이 부모 메서드와 동일해야 함. |
애너테이션 | @Override 애너테이션 사용 불가. |
@Override 애너테이션 사용 가능. |
클래스 관계 | 같은 클래스 내에서 발생. | 부모-자식 클래스 간에 발생. |
주된 목적 | 메서드의 이름을 재사용하여 유사한 동작을 그룹화. | 부모 클래스의 동작을 자식 클래스에 맞게 재정의. |
댓글남기기