프론트엔드/정보처리기사

[정처기] 오버로딩과 오버라이딩에 대해서 알아보자

병걸 2023. 4. 24. 16:26

오버로딩(overloading)

오버로딩이란 하나의 함수가 하나의 기능만을 구현해야 한다는 뜻이다. 하지만 자바에서는 하나의 메소드 이름으로 여러 기능을 구현하기 떄문에 '과적하다' 라는 뜻의 이름이 붙여졌다.

 

오버로딩에는 조건이 있습니다. 메소드의 이름이 같고, 매개변수의 개수나 타입이 달라져야 합니다.

주의할 점은 ' 리턴 값만' 다른것은 오버로딩을 할 수 없다는 점입니다.

 

class OverloadingTest {

	public static void main(String[] args) {
		OverloadingMethods om = new OverloadingMethods();

		om.print();
		System.out.println(om.print(3));
		om.print("Hello!");
		System.out.println(om.print(4, 5));
	}
}

class OverloadingMethods {
	public void print() {
		System.out.println("오버로딩1");
	}

	String print(Integer a) {
		System.out.println("오버로딩2");
		return a.toString();
	}

	void print(String a) {
		System.out.println("오버로딩3");
		System.out.println(a);
	}

	String print(Integer a, Integer b) {
		System.out.println("오버로딩4");
		return a.toString() + b.toString();
	}

}

위의 코드를 예시로 들면 

print() 라는 같은은 이름을 가진 네개의 메소드가 매개변수의 개수와 타입을 다르게 지정하여 지정하는 것이 가능하다는 것을 보여주고 있습니다. 단, 리턴 값만 다르게 지정하는 것은 오버로딩을 할 수 없다는 점입니다.

즉 오버로딩은 매개변수의 차이로만 구현할 수 있다는 것이다. 매개변수가 다르다면 리턴 값은 다르게 지정할 수 있습니다.

오버로딩을 사용하는 이유로는 같은 기능을 하는 메소드를 하나의 이름으로 사용할 수 있으며, 메소드의 이름을 절약할 수 있습니다.

 

오버라이딩(overriding)

부모 클래스로부터 상속받은 메소드를 자식 클래스에서 재정의 하는 것을 오버라이딩이라고 한다. 상속받은 메소드를 그대로 사용할 수도 있지만, 자식 클래스에서 상황에 맞게 변경해야하는 경우에 사용된다.

 

오버라이딩은 부모 클래스의 메소드를 재정의하는 것으로, 자식 클래스에서는 오버라이딩하고자 하는 메소드의 이름, 매개변수, 리턴 값이 모두 같아야 합니다.

public class OverridingTest {

	public static void main(String[] args) {
		Person person = new Person();
		Child child = new Child();
		Senior senior = new Senior();
		
		person.cry();
		child.cry();
		senior.cry();
	}
}

class Person {
	void cry() {
		System.out.println("흑흑");
	}
}

class Child extends Person {
	@Override
	protected void cry() {
		System.out.println("잉잉");
	}
}

class Senior extends Person {
	@Override
	public void cry() {
		System.out.println("훌쩍훌쩍");
	}
}

위 코드와 같이 부모 클래스의 메소드를 오버라이딩하는 것은 내용만을 새로 정의하는 것이므로 선언부는 부모의 것과 완벽히 동일해야 하는 것을 볼 수 있다.


오버로딩과 오버라이딩에 대해서 정리해보자

오버로딩 - 기존에 없는 새로운 메소드를 추가하는 것

오버라이딩 - 상속받은 메소드를 재정의 하는 것

구분 오버로딩 (overloding) 오버라이딩 (overriding)
접근 제어자 모든 접근 제어자를 사용할 수 있다. 부모 클래스의 메소드의 접근 제어자보다 더 넓은 범위의 접근 제어자를 자식 클래스의 메소드에서 설정할 수 있다.
리턴형 달라도 된다. 동일해야 한다.
메소드명 동일해야 한다. 동일해야 한다.
매개변수 달라야만 한다. 동일해야 한다.
적용 범위 같은 클래스 내에서 적용된다. 상속관계에서 적용된다.

 

참고 - https://hyoje420.tistory.com/14