[JAVA]메서드 - 오버로딩

Inung_92·2023년 2월 5일
0

JAVA

목록 보기
6/15
post-thumbnail

오버로딩이란?

📖하나의 클래스내에서 메서드명 중복 금지 원칙을 고수하며 개발의 효율성을 높이기 위해 사용하는 메서드 정의 기법

Java에서 클래스 내에는 다양한 메서드를 정의할 수 있다. 이 때 메서드의 중복금지를 준수하여야하는데 이때 메소드명 중복 원칙을 고수하며 같은 메서드명을 사용할 수 있는 것이 오버로딩이다.

⚡️ 메서드 시그니처(method signature)

오버로드의 핵심은 바로 메서드의 시그니처에 있다. 메서드 시그니처는 메서드의 선언부에 명시되는 매개변수 리스트를 가르키는 말이다. 즉, 메서드명 / 반환타입 / 매개변수 리스트가 같다면 메서드 시그니처가 같은 것이므로 완전히 동일한 메서드라고 판단이 가능하다.
오버로딩은 메서드명은 같지만 메서드 시그니처를 다르게 적용함으로써 동일한 메서드명을 클래스내에서 정의하여 사용할 수 있는 것이다.

⚡️ 오버로딩 조건

그렇다면 오버로딩을 사용하기 위해서는 어떤 조건들을 충족하여야 하는지 알아보자.

  • 매개변수의 타입 및 개수가 동일해서는 안됨
  • 메서드명은 동일하게 사용
  • 반환타입 및 여부 변경 가능
  • 접근제한자를 자유롭게 변경가능

위의 조건들을 충족하면 오버로딩을 사용하는데 지장이 없을 것이다. 하지만 사용하다보면 조금 헷갈리는 부분이 발생한다. 아래 코드를 통해 알아보도록 하자.

🖥️ 매개변수 없이 오버로딩 적용

//5를 반환받는 두 종류의 메서드 선언
public int getFive(){ //int형 반환타입
	return 5;
}

public String getFive(){ //String형 반환타입
	return "5";
}

위의 코드와 같이 메서드의 매개변수 없이 오버로딩을 적용하는 것은 불가능하다. 오버로딩은 메서드의 시그니처 즉, 매개변수 리스트를 보유하고 있어야하며, 해당 매개변수 리스트가 차이를 가짐으로써 적용할 수 있는 메서드 정의 기법이기 때문이다.

🖥️ 반환타입은 다르나 매개변수가 동일

//int 반환타입 메서드
public int getFive(int a, int b) {
	return a+b;
}
//String 반환타입 메서드
public String getFive(int a, int b) {
	return Integer.toString(a+b);
}

위 코드는 반환 타입은 다르지만 매개변수의 개수 및 타입이 동일한 경우이다. 이러한 경우는 반환타입이 같건 다르건 매개변수에 차이를 두어야 올바른 코드로 동작이 가능하다.


오버로딩 예시

Java에서 오버로딩을 가장 잘 대표하는 메서드는 우리가 정말 자주 사용하는 println() 메서드이다. println()은 우리가 출력하고자하는 모든 타입의 데이터를 반환해준다. 아래 코드를 보자.

String str = "test";
System.out.print(str);

int num = 5;
System.out.print(num);

boolean flag = true;
System.out.print(flag);

Object obj = new Object();
System.out.print(obj);

기본 자료형부터 객체 자료형까지 다양한 타입을 매개변수로 받아 해당 타입의 맞는 결과를 출력해주는 것이다.
이 외에도 생성자 메서드 등이 오버로딩이 적용된 메서드라고 할 수 있다.

마지막으로 일반 클래스의 메서드에서 오버로딩을 적용한 예시를 보자.

🖥️ 오버로딩 예시

//class 정의
public class Calculator{

	public int sum(int a, int b){
    	return a+b;
    }
    public int sum(int a, int b, int c){
    	return a+b+c;
    }
    public int sum(int a, double b){
    	return a+b;
    }
}

//메서드 호출
public class TestCalculator{
	public static void main(String[] args){
    	Calculator calculator = new Calculator();
        
        sum(5, 5); //int + int
        sum(4, 5, 10); // int + int + int
        sum(4, 3.14); //int + bouble
    }
}

예시는 범위가 굉장히 좁게 사용되었지만 오버로딩을 사용하면 상황에 맞게 메서드 활용이 가능하다.


마무리

이번 게시글에서는 메서드의 시그니처를 수정하여 한개의 메서드명으로 복수의 메서드를 정의하는 기법인 오버로딩에 대해서 알아보았다.
오버라이드와 헷갈릴 수 있으니 마지막으로 오버라이드와의 차이를 알아보고 마무리하도록 하자.

그럼 이만.👊🏽

profile
서핑하는 개발자🏄🏽

0개의 댓글