Languages/Java

[Java]다형성을 지원하는 방법 오버로딩과 오버라이딩 개념 잡기

MoonSta 2023. 6. 24. 15:42

 객체지향 언어 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();
  }
}
//자식 메서드 오버라이딩

 

오버로딩과 같이 오버라이딩에서도 아래의 조건을 만족시켜야 합니다.

  • 메서드명과 매개변수가 같아야 한다.
  • 반환형이 같아야 한다.

 정리하자면, 오버로딩은 결과적으로 새로운 메서드의 생성이고, 오버라이딩은 부모로부터 상속받은 메서드를 재정의 하는 것입니다.