오버로딩(Overloading)
자바의 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메소드가 존재해도 매개변수의 개수 또는 타입이 다르고 리턴 타입이 달라질 수 있는 함수를 오버로딩 함수라고 한다.
메소드의 이름이 같고, 매개변수의 개수나 타입이 달라야 한다. 주의할 점은 '리턴 값만' 다른 것은 오버로딩을 할 수 없다는 것이다.
// 옳은 예
class MethodOverloading {
public int getSum(int i, int j) {
return i + j;
}
public int getSum(int i, int j, int k) {
return i + j + k;
}
// 틀린 예
class MethodOverloadingFail {
public int getSum(int i, int j) {
return i + j;
}
public double getSum(int i, int j) {
return (double)(i + j);
}
}
이점
- 같은 기능을 하는 메소드를 하나의 이름으로 사용할 수 있다.
- 메소드의 이름을 절약할 수 있다.
오버라이딩(Overriding)
부모 클래스로부터 상속받은 메소드를 자식 클래스에서 재정의하는 것을 오버라이딩이라고 한다. 상속받은 메소드를 그대로 사용할 수도 있지만, 자식 클래스에서 조금 다르게 작동해야하는 경우 오버라이딩할 필요가 생긴다.
오버라이딩은 부모 클래스의 메소드를 재정의하는 것이므로, 자식 클래스에서는 오버라이딩하고자 하는 메소드의 이름, 매개변수, 리턴 값이 모두 같아야 한다.
public class OverridingTest {
public static void main(String[] args) {
Dog dog = new Dog();
Cat cat = new Cat();
dog.cry();
cat.cry();
}
}
class Animal {
void cry() {
System.out.println("(울음소리)");
}
}
class Dog extends Animal {
@Override
protected void cry() {
System.out.println("멍멍");
}
}
class Cat extends Animal {
@Override
public void cry() {
System.out.println("냐옹");
}
}
@Override
@ : 어노테이션(Annotation)
- 주석 중 하나인데 일반적인 주석과 다르게, 검증하는 기능을 함
여기서 사용된 @Override라는 어노테이션은 오버라이딩을 검증
코드상으로 검사했을 때 오버라이딩이 실제로 시행되지 않았다면 컴파일시 오류를 출력한다.
오버라이딩에서 접근 제어자를 설정하는 추가적인 규칙이 존재
자식 클래스에서 오버라이딩하는 메소드의 접근 제어자는 부모 클래스보다 더 좁게 설정할 수 없다.
-부모클래스의 접근제어자는 default로 설정되어 있다면, 자식 클래스들은 default보다 같거나 더 넓은 범위의 접근제어자만 설정할 수 있다
예외(Exception)는 부모 클래스의 메소드 보다 많이 선언할 수 없다.
- 부모 클래스에서 어떤 예외를 throws 한다고 하면, 자식 클래스에서는 그 예외보다 더 큰 범위의 예외를 throws할 수 없다
static메소드를 인스턴스의 메소드로 또는 그 반대로 바꿀 수 없다.
- 부모 클래스의 static메소드를 자식에서 같은 이름으로 정의할 수 있지만 이것은 다시 정의하는 것이 아니라 같은 이름의 static메소드를 새로 정의하는 것이다.
'CS > JAVA' 카테고리의 다른 글
| 자바 - 예외 처리 : try catch (0) | 2022.04.21 |
|---|---|
| 자바 - 추상클래스&인터페이스 (0) | 2022.04.21 |
| 자바 - 업캐스팅 & 다운캐스팅 (0) | 2022.04.13 |
| 자바 - 상속 (0) | 2022.04.10 |
| 자바 - static & final (0) | 2022.04.10 |