언어/Java
오버로딩/오버라이딩
아. 이렇게 하면 될거 같은데..
2024. 1. 25. 01:29
728x90
오버로딩(Overloading)
같은 이름의 메서드를 여러개 정의 하는것
오버로딩 조건
- 메서드 이름이 동일해야 한다.
- 매개변수 타입, 개수, 순서가 달라야 한다.
- 반환 타입은 오버로딩에 영향을 주지 않는다.
대표적인 예로는 println() 메서드가 있다
- java.lang.Object
-
- java.io.OutputStream
-
- java.io.FilterOutputStream
-
- java.io.PrintStream
PrintStream메서드는 위의 상속 구조를 가지고 있다
println 메서드를 사용해 보면 String타입이든, int타입이든, char타입이든, 공백이든지 출력해준다.
이는 오버로딩의 예로 아래의 java.doc를 확인해보면 자세히 알 수 있다.
오버라이딩(Overriding) - 메서드 재정의
조상클래스에 정의된 메서드를 자식 클래스에서 적합하게 수정하는 것
오버라이딩 조건
- 메서드 이름이 같아야 한다.
- 매개 변수의 개수, 타입, 순서가 같아야 한다
- 리턴 타입이 같아야 한다.
- 접근 제한자는 부모 보다 범위가 넓거나 같아야 한다.
- 조상보다 더 큰 예외를 던질 수 없다.
<오버라이딩 예시>
// 부모 클래스
class Animal {
void makeSound() {
System.out.println("동물이 소리를 낸다");
}
}
// 자식 클래스
class Dog extends Animal {
// 부모 클래스의 makeSound 메서드를 오버라이딩
@Override
void makeSound() {
System.out.println("멍멍");
}
// 자식 클래스의 추가 메서드
void fetch() {
System.out.println("개가 물건을 가져옵니다");
}
}
// 메인 클래스
public class Main {
public static void main(String[] args) {
Animal genericAnimal = new Animal();
genericAnimal.makeSound(); // 부모 클래스의 메서드 호출
Dog myDog = new Dog();
myDog.makeSound(); // 오버라이딩된 자식 클래스의 메서드 호출
myDog.fetch(); // 자식 클래스의 추가 메서드 호출
// 다형성을 이용한 호출
Animal anotherDog = new Dog(); // 부모 클래스의 참조 변수에 자식 클래스의 인스턴스 할당
anotherDog.makeSound(); // 자식 클래스의 메서드가 호출됨 (다형성)
}
}
<출력 결과>
동물이 소리를 낸다
멍멍
개가 물건을 가져옵니다
멍멍
왜? makeSound() 메서드를 실행하면 멍멍이 나올까?
=> 부모클래스의 메서드를 호출 하였어도, 자식이 Override 했기 때문
====> 자식이 해당 메서드를 최신화 하였다.
728x90
반응형