[JAVA]다형성, 오버로딩, 오버라이딩의 차이

Inung_92·2023년 3월 5일
2

JAVA

목록 보기
12/15
post-thumbnail

기본개념

⚡️ 다형성(Polymorphism)이란?

📖객체지향 프로그래밍 언어의 핵심 개념 중 하나로 하나의 변수나 객체가 여러 가지 형태를 가질 수 있는 것을 의미

다시 말해 같은 코드에서 하나의 메소드나 변수가 다양한 타입의 객체에 대해 동작할 수 있도록 하는 것이다. 여기서 중요한 부분은 우리가 다형성에 대해 배울 때 하나의 자료형이 여러가지 자료형으로 변환될 수 있다고 배운다. 하지만 엄밀히 따지자면 메소드가 여러가지 자료형을 인수로 받아서 동작하는 것도 다형성이라고 할 수 있는 것이다.

⚡️ 오버로딩(Overloding)이란?

📖같은 클래스 내에서 동일한 이름의 메소드를 매개변수의 개수나 자료형이 다른 여러 개의 메소드로 정의할 수 있는 메소드 정의 기법

오버로딩은 하나의 클래스 내에서 같은 이름으로 다양한 기능을 수행하는 메소드를 정의하는 기법이다. 여기서 중요한 부분은 매개변수로 다양한 자료형을 받을 수 있으며, 자료형에 따라 메소드의 결과를 다르게 가져올 수 있기도 하다.

⚡️ 오버라이딩(Overriding)

📖상속 또는 구현 관계에 있는 상위 객체의 메소드를 하위 객체 또는 구현 객체가 재정의하여 사용하는 메소드 정의 기법

오버라이딩은 상위 객체가 가지고 있는 메소드의 시그니처를 그대로 받아와 재정의하여 사용한다. 이로 인해 하위 클래스는 상위 클래스와 동일한 인터페이스를 제공하며, 상위 클래스와는 다른 기능을 제공할 수 있다.


차이점

다형성을 구현하기 위해서는 상속, 인터페이스, 오버로딩, 오버라이딩 등의 기능을 활용 할 수 있는데 이번 게시글에서는 오버로딩과 오버라이딩이 다형성과는 어떤 차이가 있는지 알아보자.

⚡️ 다형성

다형성은 객체지향 프로그래밍의 핵심 개념 중 하나이다. 즉, 다형성이라는 것은 어떠한 구체적인 기술보다는 하나의 개념으로 정의된다. 이 말은 여러가지 수단을 통해 다형성이 적용된다고 볼 수도 있을 것이다.

그렇다면 오버로딩과 오버라이딩은 어떤지 알아보자.

⚡️ 오버로딩과 오버라이딩

오버로딩과 오버라이딩은 기본적으로 다형성을 구현할 수 있는 하나의 수단이라고 할 수 있다. 또는 다형성을 대표하는 하나의 형태라고도 할 수 있는 것이다.

이 말의 의미는 다음과 같다.

  • 다형성은 직접 코드에 작성하거나 기술할 수 있는 것이 아닌 개념이다.
  • 오버로딩은 다른 메소드 시그니처를 통해 여러가지 자료형을 인수로 받을 수 있다.
  • 오버라이딩은 상속 관계의 객체 간의 메소드를 재정의 함으로써 동일한 시그니처를 가진 메소드를 자료형에 적합하게 사용할 수 있다.

즉, 오버로딩과 오버라이딩은 직접 코드에 적용하여 다형성을 구현할 수 있는 하나의 형태이자 수단이다.

그렇다면 어떻게 다형성을 구현하는지 간단한 예시를 통해 알아보자.

🖥️ 오버로딩

기본적으로 오버로딩은 같은 클래스 또는 인터페이스내에서 동일한 메소드 명으로 다양한 기능을 동작하게 하고 싶을 경우 사용한다. 기본적으로 자바 컴파일러는 메소드를 호출할 때 전달되는 매개변수의 자료형과 개수를 기준으로 알맞은 오버로딩 메소드를 선택한다. 이 말은 다양한 형태의 자료형을 매개변수로 오버로딩된 메소드가 다룰 수 있다는 것이다.

오버로딩의 대표적인 예시인 println() 메소드에 대한 아래 예시를 보자.

public class Test{
	public static void main(String[] args){
    	System.out.println("Hi"); //String
        System.out.println(55); //int
        System.out.println(true); //boolean
        System.out.println(5.5); //doulbe
    }
}

println()은 매개변수로 수많은 자료형을 전달받고, 이에 해당하는 결과를 출력해준다. 이렇게 메소드가 다양한 형태의 자료형에 대해서 동작하는 것도 다형성이 적용된 사례 중 하나이다.

🖥️ 오버라이딩

오버라이딩은 상속 또는 구현 관계에서의 메소드를 재정의하는 기법을 의미한다.상속을 통해 하위 객체를 상위 객체의 자료형으로 다룰 수 있다. 이것만으로도 다형성을 이미 적용받고 있으며, 오버라이딩된 메소드를 사용함으로써 다형성을 더욱 강화할 수 있는 것이다.

아래 예시를 보자.

//슈퍼클래스
public class Animal{
	public void makeSound(){
    	System.out.println("동물 소리");	
    }
}

//서브클래스
public class Cat extends Animal{
	public void makeSound(){
    	System.out.println("고양이 소리");	
    }
}

public class Test{
	public static void main(String[] args){
    	Animal animal = new Cat();
        animal.makeSound();
    }
}

//실행결과
"고양이 소리"

위 예시처럼 Animal 자료형의 참조변수로 Cat의 인스턴스에 접근 할 수 있으며, Cat클래스에서 오버라이딩한 메소드를 호출하여 사용할 수 있다.


마무리

이번 게시글에서는 다형성과 오버로딩, 오버라이딩의 차이에 대해서 알아보았다.
기본적으로 다형성은 하나의 큰 개념이라면 오버로딩과 오버라이딩은 해당 개념을 구현하거나 적용받을 수 있는 수단이자 방법이 되는 것이라 이해할 수 있다.

다형성은 클래스의 상속에만 국한되는 것이 아니라 인터페이스 구현을 통해 더욱 강화할 수 있다. 인터페이스는 다중 구현을 지원하기 때문에 하나의 자료형이 다양한 인터페이스의 자료형으로 구현이 가능하다는 점이 핵심이다.

규모가 큰 프로젝트로 갈수록 다형성의 필요성을 더욱 절실히 실감하고 있다. 다형성을 구현할 수 있는 방법을 설계단계부터 세심하고 면밀하게 검토해보면 실제로 코드를 작성할 때 코드의 간소화와 유지보수성의 향상을 기대하며 작성할 수 있을 것이라 생각된다.

그럼 이만.👊🏽

profile
서핑하는 개발자🏄🏽

2개의 댓글

comment-user-thumbnail
2024년 4월 13일

예제 소스에서 예상 결과가 나오려면 Cat 클래스를 선언하는 과정에서 "extends Animal"을 적어야 할 것 같습니다.

1개의 답글