언어/Java

오버로딩/오버라이딩

아. 이렇게 하면 될거 같은데.. 2024. 1. 25. 01:29
728x90



오버로딩(Overloading)

같은 이름의 메서드를 여러개 정의 하는것

 

오버로딩 조건

  • 메서드 이름이 동일해야 한다.
  • 매개변수 타입, 개수, 순서가 달라야 한다.
  • 반환 타입은 오버로딩에 영향을 주지 않는다.

대표적인 예로는 println() 메서드가 있다

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
반응형