자바

오버 로딩 과 오버 라이딩

코드 죄수 2022. 8. 3. 22:19

오버 로딩 (overloading)

동일한 함수명으로 다른 서비스를 받을 수 있는 것이다.

- 동일한 함수명으로 여러 개의 함수를 제공한다.

- 매개변수의 타입이 다르면 오버 로딩

- 매개변수의 개수가 다르면 오버 로딩

- 편하려고 사용한다. ( 다형성 )

- 같은 목적으로 사용하는 것 끼리만 만드는 것이 좋다.

- 같은 클래스 내에서 사용한다.

1. void print(int num) // 전달받은 정수를 출력하는 메서드

2. void print(String str) // 전달받은 문자열을 출력하는 메서드

위와 같이 메서드를 오버로딩 하고 

1. print(1); // 1이 출력됨

2. print("hello"); // hello가 출력됨

위와 같이 호출을 하면 매개변수에 따라 서로 다른 함수를 호출한다.

이렇게 사용하는 것을 오버 로딩이라한다.

 

오버 라이딩 ( overriding )

부모에게 물려받은 메서드가 자식에게 맞지 않아 재정의 한 것이다.

- 상속 관계 시 superclass의 메서드를 재정의 하는 것

- 메소드 선언부는 기존 메서드와 완전히 같아야 한다.( 이름, 타입, 매개변수 )

- 동적 바인딩을 하기 위해서 한다.

- 완전 재가공과 확장하는 방법이 있다.

- 부모 클래스의 메서드 보다 접근 제어자를 좁은 범위로 변경할 수 없다.

- 부모 클래스의 메서드 보다 더 큰 범위의 예외를 선언할 수 없다.

 

class Car{
	void myCar() { System.out.println("Car");
}

class Morning extends Car{
	void myCar() {System.out.println("Morning");
}

public class Test{
	public static void main(String[] args){
    	Car car = new Car();
        Morning morning = new Morning();
        car.myCar();
        morning.myCar();
    }
}

위와 같이 Car를 Morning이 상속 받았을 때 myCar라는 메서드가 겹쳐 있는데 메서드의 선언부인 타입, 이름, 매개변수를 동일시 함으로써 오버라이딩이 되었다.

 

이때 메인 클래스에서 각각의 객체의 myCar 함수를 호출하게되면 Car를 상속받은 Morning은 부모의 함수를 호출하지 않고 오버라이딩된 자신의 함수를 호출하는 모습을 볼 수 있다.