자바에서 다형성을 지원하는 오버로딩과 오버라이딩이 있습니다.
다형성이란?
하나의 클래스나 함수가 다양한 방식으로 동작하는 것을 의미하며,
대표적으로 오버로딩과 오버라이딩이 있습니다.
하나의 참조 변수로 여러 타입의 객체를 참조할 수 있는 것또한 의미합니다. 즉 조상타입의 참조변수로 자손의 객체를 다룰 수 있는 것이 다형성의 기본 개념입니다.
오버로딩이란?
메서드의 이름은 같고 매개변수의 유형과 개수가 다르도록 하는것을 의미합니다.
리턴값이 다르고 매개변수가 같은 경우는 성립되지 않습니다.
Overloading.java
public class Overloading {
public void overload(){
System.out.println("오버로딩 예제");
}
public void overload(int num){
System.out.println("오버로딩 예제(int num) :" + num );
}
public void overload(String name, int num) {
System.out.println("오버로딩 예제(String name, int num) : " + name + "과 " + num);
}
}
Main.java
public class Main {
public static void main(String[] args) {
Overloading over = new Overloading();
over.overload();
over.overload(1);
over.overload("안녕",2);
}
}
결과
이러한 오버로딩을 사용하는 이유는,
매개변수의 타입과 상관 없이 같은 기능을 하는 메소드를 하나의 이름으로 사용할 수 있기 때문입니다. 예컨대 저희가 많이 사용하곤 하는 println()메소드에 숫자와 문자를 인자값으로 넣었을때 각기 다른 타입(int, String...etc)으로 출력되는 것처럼, 하나의 메소드 명으로 같은 기능을 이용할 수 있습니다.
즉 프로그래머 입장에서 메소드의 네이밍의 고민을 줄여주고, 메소드 이름의 재사용성을 높입니다.
오버라이딩이란?
상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의해서 사용하는 것을 의미합니다.
자식 클래스에서 오버라이딩하고자 하는 메소드의 이름, 매개변수, 리턴 값이 모두 같아야합니다.
또한 부모의 접근 제어자보다 축소된 범위를 가질 수 없습니다.
(public > protected > package-private > private)
Parent.java
public class Parent {
void override() {
System.out.println("부모 클래스의 override()메소드입니다.");
}
}
Child.java
public class Child extends Parent{
@Override
public void override() {
System.out.println("자식 클래스의 override()메소드입니다.");
}
}
Main.java
public class Main {
public static void main(String[] args) {
Parent parent = new Parent();
Child child = new Child();
parent.override();
child.override();
}
}
결과
Overriding을 사용하는 이유는 자식 클래스가 부모 클래스의 메소드를 상속받았을때 다른 기능을 수행하고자입니다.
이때 가장 대표적인 예는 Object Class의 toString()메소드입니다.
모든 클래스는 Object클래스를 기본적으로 상속받기 때문에, toString()메소드가 존재하는데요,
새롭게 생성한 클래스를 Object클래스의 toString과는 다른 값을 출력하게 만들어야하는 경우가 많은데
그럴때마다 메소드 오버라이딩을 이용해 Object클래스의 toString()메소드를 재정의해주었던 것이지요,
정리하자면 오버로딩과 오버라이딩의 차이는 다음과 같습니다.
오버로딩은 동일한 클래스에 동일한 메소드명의 매개변수와 리턴 타입이 상이한 메소드를 추가하는 것이고,
오버라이딩은 상속받은 메소드를 재정의하는 것입니다.
구분 | Overriding | Overloading |
접근 제어자 | 부모 클래스 메소드의 접근 제어자보다 넓은 범위의 접근 제어자를 자식 클래스 메소드에서 설정할 수 있음 | 모든 접근 제어자 사용 가능 |
리턴형 | 동일해야 함 | 달라도 되지만, 매개변수가 같은 경우는 X |
메소드명 | 동일해야 함 | 동일해야 함 |
매개변수 | 동일해야 함 | 달라야만 한다. |
적용범위 | 상속 관계 | 같은 클래스 내에서만 |
'Language > Java' 카테고리의 다른 글
클래스와 객체 (0) | 2021.07.24 |
---|---|
인터페이스와 추상클래스 (0) | 2021.07.18 |
어노테이션 (0) | 2021.07.03 |
GC에 대해 (0) | 2021.06.24 |
JVM의 구조와 자바의 구동 원리 (2) | 2021.06.16 |