- 학습 목표 1 : 자바의 오버로딩과 오버라이딩 공부하기
자바의 한 클래스 내에 이미 사용 중인 이름을 가진 메소드를 추가로 정의하는 것
- 메소드 이름은 같지만 매개변수의 개수나 타입이 다르다.
- 반환 값만 다르게 지정하는 것은 오버로딩이 아니다.
- 접근 제어자를 자유롭게 지정할 수 있다.
- 즉, 오버로딩은 매개변수의 타입, 개수, 순서의 차이로만 구현할 수 있다.
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();
}
}
class OverloadingTest {
public static void main(String[] args) {
OverloadingMethods om = new OverloadingMethods();
om.print(); // 오버로딩1
System.out.println(om.print(3)); // 오버로딩2 3
om.print("Hello!"); // 오버로딩3 Hello!
System.out.println(om.print(4, 5)); // 오버로딩4 45
}
}
-
사용하는 이유
- 같은 기능을 하는 메소드에 대해 같은 이름을 부여할 수 있다.
- 메소드 이름을 절약할 수 있다.
→ 개발자가 일관된 이름을 사용하여 메소드를 호출할 수 있다.
부모 클래스로부터 상속받은 메소드를 자식 클래스에서 재정의하는 것
- 메소드 시그니처(메소드 이름, 매개변수, 반환 타입)가 같아야 한다.
- 자식 클래스에서 오버라이딩하는 메소드의 접근 제어자는 부모 클래스의 메소드보다 좁은 범위로 지정할 수 없다.
- static 메소드는 오버라이딩할 수 없다.
- 부모 클래스에서 선언한 예외보다 더 많은 종류의 예외를 throws 할 수 없다.
class Parent {
void print() {
System.out.println("부모 클래스의 메소드");
}
}
class Child extends Parent {
@Override
void print() {
System.out.println("자식 클래스의 메소드");
}
}
class OverridingTest {
public static void main(String[] args) {
Parent p = new Parent();
p.print(); // 부모 클래스의 메소드
Child c = new Child();
c.print(); // 자식 클래스의 메소드
}
}
-
사용하는 이유
- 부모 클래스의 메소드를 자식 클래스에서 재정의하여 사용할 수 있다.
- 다형성을 구현할 수 있다.
-
@Override
란?- 컴파일러에게 이 메소드가 오버라이딩된 메소드임을 알려주는 역할을 한다.
- 만약 오버라이딩된 메소드가 부모 클래스의 메소드와 시그니처가 다르다면 컴파일 에러가 발생한다.
구분 | 오버로딩(Overloading) | 오버라이딩(Overriding) |
---|---|---|
정의 | 같은 이름의 메소드를 여러 개 정의하는 것 | 부모 클래스로부터 상속받은 메소드를 자식 클래스에서 재정의하는 것 |
메소드 이름 | 같음 | 같음 |
매개변수 | 다름 | 같음 |
반환 타입 | 상관 없음 | 같음 |
접근 제어자 | 상관 없음 | 부모 클래스의 메소드보다 좁은 범위로 지정할 수 없음 |
static | 상관 없음 | 오버라이딩할 수 없음 |
예외 | 상관 없음 | 부모 클래스의 메소드보다 더 많은 종류의 예외를 throws 할 수 없음 |
적용 범위 | 같은 클래스 내 | 부모 클래스와 자식 클래스 사이 |
- 스크럼 중 완료한 작업:
오버로딩과 오버라이딩 공부하기
- 오버로딩과 오버라이딩의 개념을 이해하고, 각각의 특징을 정리할 수 있었다.
- @Override가 어떤 용도인지 알게 되었다. 아래의 메소드에 기능을 추가하는 키워드(?)라고 생각했는데, 단순히 오버라이딩된 메소드임을 알려주는 역할을 한다는 것을 알게 되었다.
- 어노테이션(Annotation)에 대해 추가 공부가 필요할 것 같다!