✅ 오버로딩이란?
: 한 클래스 내에 동일한 이름의 메소드를 여러개 정의하는 것
*동일한 이름의 메소드를 정의한다 해서 무조건 오버로딩은 아니다
✔ 오버로딩의 조건
- 메소드 이름이 동일
- 매개변수의 개수 or 타입이 달라야함
<코드>
class OverloadingTest {
public static void main(String[] args) {
OverloadingMethods om = new OverloadingMethods();
om.print();
System.out.println(om.print(3));
om.print("Hello!");
System.out.println(om.print(4, 5));
}
}
class OverloadingMethods {
public void print() {
System.out.println("오버로딩1");
}
String print(Integer a) {
System.out.println("오버로딩2");
return a.toString();
}
void print(String a) {
System.out.println("오버로딩3");
System.out.println(a);
}
String print(Integer a, Integer b) {
System.out.println("오버로딩4");
return a.toString() + b.toString();
}
}
<결과>
오버로딩1
오버로딩2
3
오버로딩3
Hello!
오버로딩4
45
👌반드시 알고 갈 것들
- '리턴 값'만 다르게 지정하는 것은 오버로딩할 수 없다는 것이다.
- 접근 제어자도 자유롭게 지정가능(public, default, protected, private)
- 접근 제어자만 다르게 한다고 오버로딩은 불가능
- 오버로딩은 매개변수의 차이로만 구현 가능
그래서 오버로딩을 왜 쓸까?
- 같은 이름의 메소드를 하나의 이름으로 사용 가능
- 메소드의 이름을 절약 가능
✅오버라이딩이란?
: 부모 클래스로부터 상속받은 메소드를 자식 클래스에서 재정의하는 것
필요에 따라 변경할 경우 오버라이딩을 한다.
단, 오버라이딩하고자 하는 메소드의 이름, 매개변수의 값, 리턴값이 모두 같아야한다
<코드>
public class OverridingTest {
public static void main(String[] args) {
Person person = new Person();
Child child = new Child();
Senior senior = new Senior();
person.cry();
child.cry();
senior.cry();
}
}
class Person {
void cry() {
System.out.println("흑흑");
}
}
class Child extends Person {
@Override
protected void cry() {
System.out.println("잉잉");
}
}
class Senior extends Person {
@Override
public void cry() {
System.out.println("훌쩍훌쩍");
}
}
//코드 출처 : https://hyoje420.tistory.com/14
<결과>
흑흑
잉잉
훌쩍훌쩍
✔ 오버라이딩의 조건
- 부모 클래스의 메소드와 이름이 같아야한다
- 부모 클래스의 메소드와 매개변수가 같아야한다
- 부모 클래스의 메소드와 반환타입이 같아야 한다
부모 클래스의 메소드를 오버라이딩하는 것은 내용만의 새로 정의하는 것이므로
선언부는 부모의 것과 완벽히 동일해야한다.
1. 자식 클래스에서 오버라이딩하는 메소드의 접근 제어자는 부모 클래스보다 좁게 설정 불가능
위에서 볼 수 있듯이 부모클래스의 접근제어자는 default로 설정되어 있다. 여기서 자식 클래스들은 default보다 같거나 더 넓은 범위의 접근제어자만 설정할 수 있으므로 default, protected, public 이 세 개의 접근 제어자는 사용이 가능
2. 예외(Exception)는 부모 클래스의 메소드 보다 많이 선언할 수 없다.
부모에서 IOException을 던진다고 하면 자식에서는 Exception자체를 던질 수는 없음.
궁금하면 눈팅보단 바로 테스트를 해보자
3. static메소드를 인스턴스의 메소드로 또는 그 반대로 바꿀 수 없다.
부모 클래스의 static메소드를 자식에서 같은 이름으로 정의할 수 있지만 이것은 다시 정의하는 것이 아니라 같은 이름의 static메소드를 새로 정의하는 것이다.
👀 한줄 요약
오버로딩(Overloading)은 확장의 개념
오버라이딩(Overriding)은 재정의의 개념
구분 | 오버로딩 | 오버라이딩 |
메소드 이름 | 동일 | 동일 |
매개변수, 타입 | 다름 | 동일 |
리턴 타입 | 상관없음 | 동일 |
오타, 오류 지적 감사합니다
봐주셔서 감사합니다.
'Language & Framework & GIT > JAVA' 카테고리의 다른 글
[언어공부] 코테를 위한 JAVA 뽀개기 #3 (0) | 2022.10.28 |
---|---|
[JAVA] this / super (0) | 2022.10.22 |
[언어공부] 코테를 위한 JAVA 뽀개기 #2 (0) | 2022.10.22 |
[언어공부] 코테를 위한 JAVA 뽀개기 #1 (0) | 2022.10.20 |
Java_Optional<T> isPresent(), ifPresent() 사용하기 (0) | 2022.08.21 |
댓글