어 나 갱수.

[Java] 오버로딩(Overloading) & 오버라이딩(Overriding) ✌️ 본문

Java

[Java] 오버로딩(Overloading) & 오버라이딩(Overriding) ✌️

김경수 2024. 2. 11. 16:38
728x90

오늘은 자바에서 많이 사용되는 오버로딩 & 오버라이딩에 대해 알아보겠습니다 !

 

자바에서는 다형성을 지원하는 방법으로 메서드 오버로딩과 오버라이딩이 있습니다.

  • 오버로딩 : 같은 이름의 메서드를 여러개 가지며 매개변수의 유형과 개수가 다르도록 하는 기술
  • 오버라이딩 : 상위클래스에서 가지고 있는 메서드를 하위클래스에서 재정의 하는 기술

오버로딩(Over loading)

자바에서는 원래 한 클래스에서 같은 이름의 메서드를 가지면 안된다.

하지만 오버로딩을 사용하게 된다면 하나의 클래스에서 같은 이름의 메서드를 가질 수 있습니다.

오버로딩은 같은 이름의 메서드를 여러개 정의하고, 각 메서드마다 매개변수의 유형과 개수를 다르게 하여 다양한 유형의 메서드를 구현할 수 있도록 합니다. 

public class Test {

    // 매개변수가 없는 overloadingTest() method
    void overloadingTest(){
        System.out.println("매개변수를 받지 않는 메서드");
    }

    // 매개변수로 int형 인자 2개를 요청하는 overloadingTest(int a, int b) method
    void overloadingTest(int a, int b){
        System.out.println("int형 인자 2개를 요청하는 메서드 "+ a + ", " + b);
    }

    // 매개변수로 String형 인자 1개를 요청하는 overloadingTest(String str) method
    void overloadingTest(String str){
        System.out.println("String형 인자 1개를 요청하는 메서드 " + d);
    }
}

 

 

오버로딩의 핵심은 같은 이름의 메서드를 다시 정의하지만, 매개변수의 유형과 개수가 달라야 한다는 점입니다.

 

오버로딩의 또 하나의 특징은 접근 제어자를 자유롭게 해줄 수 있다는 점 입니다. 

오버로딩 된 메서드들은 각각 public, private,  default, protected으로 다르게 지정해줘도 상관없습니다.

하지만 메서드 이름이 같고, 매개변수의 유형, 개수 등이 다르다고 모두 오버로딩된 메서드라고 말 할 수 없습니다.

 

오버로딩을 사용하는 이유

  • 같은 기능을 하는 메서드를 하나의 메서드 이름을 관리할 수 있기 때문입니다.
  • 메서드이름을 절약할 수 있기 때문입니다.

 

메서드 오버로딩의 대표적인 예로는 println()메서드가 있습니다.

println()메서드는 오버로딩 되어있기 때문에, int형 인자, String형 인자, boolean형 인자 모두 받아서 동작할 수 있습니다.

 

만약 println()메서드가 오버로딩으로 구현되지 않았다면, int형을 받는 메서드, String형을 받는 메서드, boolean형을 받는 메서드 이렇게 총 3개의 메서드를 만들어야 합니다. 오버로딩이 있기 때문에 하나의 이름을 사용해서 여러가지 타입의 값으로 메서드를 동작시킬 수 있습니다.

 

오버 라이딩(Over riding)

오버라이딩은 상위 클래스에서 정의한 메서드를 하위 클래스에서 재정의하는 것을 의미합니다.

오버라이딩은 메서드의 이름이 같고, 매개변수가 같고, 반환타입까지 같은 함수를 상속받은 하위 클래스에서 재정의하는 것이라고 생각하면 쉬울 것 같습니다.

public class Parent {
    public void overridingTest() {
        System.out.println("부모 메서드의 내용");
    }
}
public class Child extends Parent {
    @Override
    public void overridingTest() {
        System.out.println("부모 클래스의 메서드를 상속받아 내용을 재정의해서 사용");
    }
}

 

위에 코드에서는 Parent라는 상위 클래스에서 overridingTest라는 이름의 메서드를 정의하였습니다.

Parent클래스를 상속받은 Child 클래스에서 overridingTest메서드를 재정의 할 수 있습니다.

 

주의할 점은 final이 지정된 메서드는 오버라이딩할 수 없습니다. private 접근 제어자는 상속도 안되기 때문에 오버라이딩 또한 작동하지 않습니다.

 

인터페이스를 implements로 가져와서 구현체를 작성하는 경우에도 오버라이딩을 사용해서 메서드를 구현하게 되는데, 그런 상황에서도 접근제어자는 public을 사용해야 합니다.

 

오버라이딩 VS 오버로딩

오버로딩 : 기존에 없는 이름만 같은 메서드를 추가하는 것

오버라이딩 : 상속받은 메서드를 재정의 하는 것

 

  • 오버로딩은 모든 접근제어자를 사용할 수 있습니다. 하지만 오버라이딩은 부모 클래스의 메서드 접근제어자보다 넓은 범위여야 합니다.
  • 오버로딩에서는 반환타입이 달라도 되지만, 오버라이딩에서는 반환타입이 같아야 합니다.
  • 오버로딩과 오버라이딩 모두 메서드명은 같아야 합니다.
  • 오버로딩에서는 매개변수의 타입,개수 등이 달라야 하지만, 오버라이딩에서는 매개변수의 타입,개수 등이 모두 같아야 합니다.
  • 오버로딩은 같은 클래스내에서만 작동하고, 오버라이딩은 상속받은 클래스에서 작동합니다.
728x90