✔️ 다형성 이란 하나의 함수, 클래스가 다양한 방법으로 동작하는 것을 말한다. Java에서는 주로 오버로딩(Overloading)과 오버라이딩(Overriding) 을 통해서 다형성을 지원한다.
✔️ 함수가 여러개의 동일한 이름을 가지며 매개변수의 유형 과 개수 가 다르게 설정되어 사용하는 것을 의미한다.
✔️ 오버로딩은 함수 오버로딩 과 생성자 오버로딩 이 있으며 실제 적용되는 것은 같다. 같은 이름의 함수를 여러 개 정의하고, 매개변수의 유형과 개수를 다르게 하여 다양한 유형의 호출에 응답할 수 있게 하는 방식이다.(일반적으로 하나의 클래스 안에 동일한 이름의 함수를 작성하게 되면 에러가 발생한다.)

➤ 오버로딩 예제
public class Overloading {
public void overloading() {
System.out.println("매개변수 없는 함수");
}
public void overloading(int a, int b) {
System.out.println("int형 인자 2개를 요청하는 함수: " + a + ", " + b);
}
public void overloading(String str) {
System.out.println("String형 인자 1개를 요청하는 함수: " + str);
}
}
public class App {
public static void main(String[] args) throws Exception {
Overloading old = new Overloading();
old.overloading();
old.overloading(2, 3);
old.overloading("문자형 오버로딩 함수");
}
}
➤ 오버로딩 특징
✔️ 오버로딩의 특징은 접근 제어자를 자유롭게 지정할 수 있다.
➤ 오버로딩을 사용하는 이유
✔️ 많이 사용하는 println() 함수는 오버로딩 되어 있기 때문에 int형, String형, boolean형, char형 인자 모두 받아서 동작할 수 있다.
✔️ 만약 오버로딩을 이용하지 않는다면 printlnInt(), printlnString() 등 각각 함수의 이름을 따로 만들어줘야 한다.
✔️ 상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의해서 사용하는 것을 의미한다.
✔️ 상위 클래스가 가지고 있는 멤버 변수가 하위 클래스로 상속되는 것처럼 상위 클래스가 가지고 있는 함수도 하위 클래스로 상속되어 하위 클래스에서 사용할 수 있다.
class Parent {
public void overriding() {
System.err.println("부모 메서드 내용");
}
}
class Child extends Parent{
@Override
public void overriding() {
super.overriding();
System.err.println("부모 클래스의 함수를 상속받은 함수");
}
}
public class App {
public static void main(String[] args) throws Exception {
Parent parent = new Parent();
parent.overriding();
Child child = new Child();
child.overriding();
}
}
➤ 오버라이딩 특징
➤ @Overrde 어노테이션❗️
✔️ @Override 어노테이션이 적용되지 않은 상태에서는 전에 오버라이드 한 메서드가 업데이트 이후 그냥 추가적인 메서드로 인식되어 컴파일 오류가 발생하지 않는다. 이때 @Override 어노테이션을 적용함으로써 의도적으로 컴파일 오류를 일으켜 작동방식이 바뀌는 것을 대비할 수 있다.
✔️ 또한 @Override를 표시함으로써 코드 리딩 시에 해당 메서드가 오버라이딩하였다는 것을 쉽게 파악할 수 있다는 장점이 있다.