💡오버로딩(Overloading) 이란?
- overload의 사전적인 의미는 과적하다. 부담을 많이 지우다 라는 뜻을 가지고 있다.
- 자바에서는 원래 한 클래스 내에 같은 이름의 메소드를 둘 이상 가질 수 없다. 하지만 아래 조건만 지킨다면 하나의 클래스에 같은 이름의 메소드를 여러 개 정의하여 구현이 가능하다.
- 메소드 오버로딩을 사용함으로써 메소드에 사용되는 이름을 절약할 수 있다.
- 메소드를 호출할 때 전달해야 할 매개 변수의 타입이나 개수에 대해 크게 신경 쓰지 않고 호출할 수 있게 된다.
- 오버로딩의 대표적인 메소드로는 println() 메소드를 들 수 있다.
오버로딩의 조건
① 한 클래스 내에서 메소드 명이 동일해야 한다.
② 매개변수의 개수 또는 타입이 달라야 한다.
③ 매개변수는 같고 리턴타입이 다른 경우는 오버로딩이 성립되지 않는다.
(리턴 타입은 오버로딩을 구현하는데 아무런 영향을 주지 않는다.)
오버로딩 사용 예
오버로딩 ①,②번의 조건을 성립하는 예는 아래와 같다.
class Overloading {
//메소드명 print(매개변수 한개) 기준
void print(int a) {
System.out.println(a);
}
//메소드명 동일 (매개변수 타입변경)
void print(String s) {
System.out.println(s);
}
//메소드명 동일 (매개변수 개수 변경)
void print(int a, int b) {
System.out.println(a * b);
}
//메소드명 동일 (매개변수 타입 개수 변경)
void print(String s, int a) {
System.out.println(s + a);
}
}
public class Test {
public static void main(String[] args) {
Overloading ol = new Overloading();
ol.print(1);
ol.print("a");
ol.print(2, 3);
ol.print("b", 4);
}
}
<출력 결과>
1
a
6
b4
우선 메소드명은 print로 모두 같다. 처음 매개변수는 int 타입으로 개수는 한 개다. 그리고 첫 번째와 두 번째는 매개변수 타입이 다르다. 이후 세 번째부터는 매개변수의 개수가 다르다. 이렇게 매개변수 타입과 개수가 달라야 오버로딩이 성립된다.
오버로딩 ③번 조건의 예는 아래와 같다.
class Overloading {
// 리턴타입이 달라도 오버로딩은 성립된다.
int print(int a, int b) {
return a > b ? a : b;
}
//매개변수는 같지만 리턴타입이 다른 경우
// void print(int a, int b) {
// }
//리턴타입이 다른경우는 상관없음
double print(double a, double b) {
return a > b ? a : b;
}
}
public class Test {
public static void main(String[] args) {
Overloading ol = new Overloading();
System.out.println(ol.print(2, 3));
System.out.println(ol.print(3.0, 5.5));
}
}
<출력 결과>
3
5.5
첫 번째로 선언된 메소드를 보면 반환 타입이 int 타입이다. 두번째는 매개변수는 같지만 반환타입만 다르게 했다. 이런경우에는 오류가 난다. 즉, 오버로딩이 성립되지 않는다. 그리고 세번째는 반환타입이 다르지만 오버로딩은 성립된다. 즉, 반환 타입은 오버로딩을 구현하는데 아무런 영향을 주지 않는다.
💡오버라이딩(Overriding) 이란?
- override의 사전적 의미는 '~위에 덮어쓰다', '~에 우선하다'라는 뜻을 가지고 있다.
- 상속받은 부모 클래스에서 이미 정의된 메소드를 자식 클래스에서 재정의 하는 것을 말한다. (단, private 제외)
- 자식 클래스에서 메소드를 재정의하면 부모 클래스의 메소드가 아닌 자식클래스의 메소드가 실행된다. 즉, 재정의된 메소드가 우선권을 가진다.
- @Override라는 어노테이션을 사용한다. 어노테이션(Annotation)을 사용하면 오버라이딩을 검증하는 기능을 한다.
- 오버라이딩의 대표적인 예로는 Object 클래스의 toString() 메서드이다.
오버라이딩 조건
① 부모 클래스의 메소드와 메소드 이름이 동일해야 한다.
② 매개변수의 타입, 개수, 순서가 일치해야 한다.
③ 리턴 타입이 동일해야 한다.
④ 접근 제한자는 부모 클래스의 메소드와 같거나 더 넓은 범위어야 한다.
⑤ 부모 메소드의 예외와 같거나 예외의 개수를 줄일 수 있다.
오버라이딩 사용 예
오버라이딩의 사용 예는 아래와 같다.
class Person {
void print() {
System.out.println("Person클래스의 print()메소드");
}
}
class Student extends Person {
@Override
public void print() {
System.out.println("Student클래스의 print()메소드");
}
}
public class Test {
public static void main(String[] args) {
Person p = new Person();
Student st = new Student();
p.print();
st.print();
}
}
<출력 결과>
Person클래스의 print()메소드
Student클래스의 print()메소드
부모 클래스인 Person클래스에서 메소드를 하나 선언해주었다. 접근제한자는 기재 하지 않으면 (default)값이다. 이제 자식 클래스인 Student 클래스에 Person클래스를 상속 받은 후 메소드 오버라이딩을 작성했다.
@Override라는 어노테이션을 기입한 후, ④조건에 따라 (default) 값보다는 큰 범위인 public을 사용했다. (protected도 사용 가능) 그리고 ①,②,③번의 조건을 맞춰 작성해 주었다.
그리고 ⑤번 조건은 부모 클래스에서 어떤 예외를 throws 한다고 하면, 자식 클래스에서는 그 예외보다 더 큰 범위의 예외를 throws 할 수 없다는 것이다.
💡오버로딩(Overloading)과 오버라이딩(Overriding)의 차이점
오버로딩과 오버라이딩은 이름은 비슷하지만 개념은 확실히 다르다. 두 개의 차이점을 아래 표로 정리했다.
구분 | 오버로딩 (Overloading) |
오버라이딩 (Overriding) |
정의 | 한 클래스내에 동일한 메소드명으로 기술하는 것 | 상속 받은 부모클래스에 정의되어 있는 메소드를 자식 클래스에서 재정의하는 것 |
접근 제어자 | 모든 접근 제어자를 사용할 수 있음 | 부모 클래스의 메소드의 접근제어자와 같거나 더 넓은 범위어야 함. |
리턴(반환)형 | 달라도 됨 | 동일해야 함 |
메소드명 | 동일해야 함 | 동일해야 함 |
매개변수 | 타입, 개수, 순서가 달라야만 함 | 타입, 개수, 순서가 동일해야 함 |
적용범위 | 한 클래스 내에서 | 상속관계일 때 |
📌Reference
https://hyoje420.tistory.com/14\
http://www.tcpschool.com/java/java_usingMethod_overloading
해당 글은 자바에 학습한 내용을 개인적으로 정리한 글입니다. 만약 틀린 부분이 있다면 댓글로 남겨주세요:D