객체지향 언어 Java의 중요 개념 중 하나인 '다형성'을 지원하는 방법으로 오버로딩과 오버라이딩이 있습니다. 개념은 다르지만 이름부터 비슷한 이 두 개의 단어를 이번 포스팅에서 예제를 통해 확실히 구분하도록 하겠습니다.
Java의 다형성이란?
다형성의 사전적 의미는 다음과 같습니다.
다형성이란, 그 자체의 의미를 표준 국어사전에서 찾아보면, '같은 종의 생물이면서도 어떤 형태나 형질이 다양하게 나타나는 현상' 이라 정의함
위의 내용을 프로그래밍 관점으로 실제 예시를 들어보도록 하겠습니다.
위의 이미지를 보면, 세 개의 차량 모두 차라는 공통점을 가지고 있지만, 모양과 기능은 제각각이고 그에 따라 차량의 가격도 상이합니다. 코드를 보겠습니다.
//공통
class CAR {
void light_On() {} //불키기
void light_Off() {} //불끄기
}
class ElectronicCar extends CAR {
void autonomous_Driving() {} //자율 주행
void automated_Car_Park_System() {} //자동 주차
}
위와 같은 CAR 클래스와 ElectronicCar 클래스가 정의되어 있는 것을 알 수 있습니다. 하지만 ElectronicCar 클래스를 보면 CAR 클래스와 상속관계를 맺고 있는 것을 알 수 있습니다. 이렇듯 자바에서는 클래스 간의 상속 관계를 가져 새로운 클래스를 만들 수 있으며, 부모 클래스의 메서드 또한 사용할 수 있다는 것이 바로 객체 지향언어 자바의 다형성이라고 할 수 있습니다.
자바에서 다형성에 속하는 여러 개념이 있지만 이번 포스팅에선 대표적으로 오버로딩과 오버라이딩에 대해서만 알아보도록 하겠습니다.
오버로딩(Overloading) 이란?
오버로딩(Overloading)의 사전적인 의미는 과적재이다. 그렇다면 무엇을 적재할 수 있는 건지 알아보자.
하나의 클래스는 상태와 동작을 가질 수 있다. 하지만 개발하면서 필요한 타입의 매개변수가 유연하게 사용될 경우가 발생한다. 이러한 경우에 같은 이름의 메서드에 매개변수만 다르게 하여 클래스에 적재할 수 있다. 이것이 바로 오버로딩(Overloading)이다. 예제 하나를 확인해 보겠습니다.
class OverLoadingTest {
public void test() {
System.out.println("매개변수X");
}
public void test(int count) {
System.out.println("매개변수의 개수는" + cont);
}
}
public class OverLoading {
public static void main(String[] args) {
OverLoadingTest olt = new OverLoadingTest();
olt.test();
olt.test(5);
}
}
//매개변수X
//매개변수의 개수는 5
하지만 위와 같이 오버로딩(Overloading)을 사용하기 위해서는 다음의 조건을 만족시켜야 합니다.
- 오버로딩(Overloading)할 메서드의 매개변수의 타입과 개수는 달라야 한다.
- 오버로딩(Overloading)할 메서드의 반환형은 같아야 한다.
오버라이딩(Overriding)이란?
객체 지향 언어 JAVA의 또 다른 다형성 지원 방법인 오버라이딩(Overriding)에 대해서도 알아보겠습니다. 사실 오버라이딩(Overriding)은 앞서 설명한 오버로딩 시에 발생할 수 있는 문제의 해결법으로 많이 사용됩니다. 위의 예제에는 오버로딩한 메서드가 몇 개 없지만, 프로그램이 커짐에 따라 오버로딩해야 할 메서드가 많아진다면 일일이 오버로딩을 해야 할 것입니다. 여기에 추상화라는 개념이 들어가는데 부모 클래스의 메서드를 추상화시켜, 자식 클래스에서 재정의하여 사용하는 것을 오버라이딩(Overriding)이라고 합니다. 예제 하나를 확인해 보겠습니다.
class OverRidingParent {
public void test() {
System.out.println("부모 메서드");
}
}
class OverRidingSon extends OverRidingParent {
public void test() {
System.out.println("자식 메서드 오버라이딩");
}
}
public class Overriding {
public static void main(String[] args) {
OverRidingSon ors = new OverRidingSon();
ors.test();
}
}
//자식 메서드 오버라이딩
오버로딩과 같이 오버라이딩에서도 아래의 조건을 만족시켜야 합니다.
- 메서드명과 매개변수가 같아야 한다.
- 반환형이 같아야 한다.
정리하자면, 오버로딩은 결과적으로 새로운 메서드의 생성이고, 오버라이딩은 부모로부터 상속받은 메서드를 재정의 하는 것입니다.
'Languages > Java' 카테고리의 다른 글
[Java]do while, while문은 어떤 상황에서 사용할까? (2) | 2023.07.02 |
---|---|
[Java]Stream 살펴보기_(2)Filter를 사용한 데이터 추출하기 (2) | 2023.06.24 |
[Java]Static의 사용을 지양해야하는 이유(정적 변수, 정적 메서드) (1) | 2023.06.18 |
[Java]일반적인 for문과 이후의 등장한 향상된 for문 알아보기 (2) | 2023.06.06 |
[Java]문자열 내 특정 문자 포함 여부 확인 및 위치 찾기(contains, indexOf) (3) | 2023.05.07 |