오버로딩과 오버라이딩은 이름이 비슷해서 그런지, 차이점이 무엇인지 아느냐는 질문을 종종 받곤 한다.
이 개념들은 자바에서 다형성(Polymorphism)을 지원하는 방법이기도 하다.

오버라이딩(Overriding)

상속(Inheritance) 받은 부모 클래스의 메소드를 자식 클래스가 재정의하여 사용하는 것

메소드의 이름, 매개 변수의 타입 및 개수, 리턴 타입이 같아야 한다.

상속 받은 메소드의 기능 외에 다른 기능을 필요로 할 때 주로 사용된다.

예를 들어 자식인 스마트폰이 핸드폰이라는 부모 클래스를 상속 받았다고 가정해보자.
통화 기능에 있어서 핸드폰은 기지국을 거친 통화만 가능했다. 그러나 스마트폰은 인터넷을 통한 VoIP 통화가 가능해졌다.
이럴 때 핸드폰의 통화 기능을 오버라이딩하여 인터넷 통화 기능을 추가해 재정의하는 것이 오버라이딩이다.

코드로 살펴보자면 아래와 같다.
매우 억지로 짠 코드지만 양해를 바란다

public class Cellphone{
	...
	public void PhoneCall(){
		return baseStation;
	}
}

public class Smartphone extends Cellphone{
	...
	@Override
	public void PhoneCall(){
		if(this.callType == VoIP)
			return internet protocol;
		else
			return baseStation;
	}
}

오버로딩(Overloading)

같은 이름을 가진 메소드의 매개변수를 다르게 하여 사용하는 것

메소드의 이름이 같아야 하고 매개 변수의 타입이나 개수가 달라야 한다. 리턴 타입은 상관이 없다.
매개 변수의 타입이 다르거나 개수가 다른 것을 통해 컴파일러가 메소드를 찾아낸다.

대표적인 예로 자바에서 System.out.println이 있다.
println에는 int형, String형 등 다양한 형을 매개 변수로 주더라도 콘솔에 프린트 되는 기능은 같다.

오버로딩은 이러한 경우처럼 비슷한 기능을 가졌으나 매개 변수로 받아야 하는 타입이 다른 경우에 주로 사용한다.