오버로딩은 Java에서 많이 쓰입니다. System.out.println()은 오버로딩의 대표적인 예입니다. println(int), println(String), println(double) 등 다양한 타입을 처리할 수 있습니다.
오늘은 오버로딩에 대해 자세히 알아보겠습니다!
오버로딩이란?
같은 이름의 메서드를 매개변수의 개수, 타입, 순서를 다르게 해서 여러 번 정의하는 것을 말합니다. 즉, 메서드 이름은 같지만, 인자(매개변수)의 구성만 다르면 자바는 각각을 다른 메서드로 인식합니다.
오버로딩을 사용하는 이유
- 기능은 유사하지만 처리 방식이 다양한 경우, 같은 이름의 메서드로 묶으면 더 직관적이고 관리가 쉬워집니다.
- 코드를 간결하고 직관적으로 사용할 수 있습니다.
사용 예시
예를 들어, print() 라는 이름의 메서드가 정수, 문자열 등 모두 출력하게 만들 수 있게 만든다면 아래와 같이 만들 수 있습니다.
public void print(int a) { ... }
public void print(String s) { ... }
public void print(double d) { ... }
→ 이렇게 정의된 print() 메서드는 입력 타입에 따라 자동으로 호출됩니다. 위 코드를 살펴보면 메서드명은 print로 같지만, 매개변수의 타입이 각각 다릅니다. 따라서 해당 메서드는 오버로딩에 해당합니다.
다음의 코드는 오버로딩일까요?
public int print(int a) { ... }
public String print(int a) { ... }
해당 코드는 매개변수는 같지만, 리턴 타입이 다른 경우입니다. 과연 오버로딩에 해당할까요?
❌ 리턴 타입만 다른 경우는 오버로딩이 아닙니다! 해당 코드는 메서드를 중복 선언한걸로 판단되어 에러가 발생합니다.
오버로딩의 조건
매개변수의 타입이나, 개수나, 순서가 달라야 오버로딩에 해당합니다. 리턴타입만 다른 경우는 오버로딩이 아닌, 중복 선언으로 간주하게 됩니다.
💡 오버로딩은 매개변수로만 판단하고, 리턴 타입은 오버로딩 판단 기준이 아닙니다.
실습 예제
햄버거 가게에서 order() 라는 버튼이 있고, 아래 내용처럼 주문하는 시스템을 만들어 보겠습니다!
- 햄버거만 주문
- 햄버거 + 사이드 메뉴 주문
- 햄버거 + 사이드 메뉴 + 음료 주문
public class OrderSystem {
// 햄버거만 주문
public void order(String burger) {
System.out.println("주문: " + burger);
}
// 햄버거 + 사이드
public void order(String burger, String side) {
System.out.println("주문: " + burger + " | 사이드: " + side);
}
// 햄버거 + 사이드 + 음료
public void order(String burger, String side, String drink) {
System.out.println("주문: " + burger + " | 사이드: " + side + " | 음료: " + drink);
}
public static void main(String[] args) {
OrderSystem os = new OrderSystem();
os.order("치즈버거");
os.order("치킨버거", "감자튀김");
os.order("불고기버거", "치즈스틱", "콜라");
}
}
- 출력 결과 -
주문: 치즈버거
주문: 치킨버거 | 사이드: 감자튀김
주문: 불고기버거 | 사이드: 치즈스틱 | 음료: 콜라
메서드 이름은 order()로 모두 같습니다. 하지만 매개변수의 개수가 다르기 때문에 오버로딩이 성립합니다! Java는 넘겨준 인자의 수에 맞는 메서드를 자동으로 선택해서 실행합니다. 따라서 매개변수가 다르면, 이름이 같더라도 서로 다른 메서드입니다!
오버로딩 정리
- 개념 : 같은이름의 메서드를 매개변수만 다르게 여러 번 정의합니다.
- 목적 : 다양한 입력을 하나의 이름으로 처리할 수 있도록 합니다.
- 사용 조건 : 매개변수의 타입, 개수, 순서가 달라야 합니다.
- 주의사항 : 리턴 타입만 다른 경우는 오버로딩이 아닙니다.
오버로딩은 하나의 이름으로 여러 방식의 동작을 정의하여, 코드의 유연성과 가독성을 높여주는 객체지향 프로그래밍의 핵심 기능 중 하나입니다!
읽어주셔서 감사합니다 😊
'프로그래밍 언어 > Java' 카테고리의 다른 글
[Java] 17. this vs this() (0) | 2025.04.08 |
---|---|
[Java] 16. 생성자와 오버로딩 (0) | 2025.04.08 |
[Java] 14. 재귀호출 (0) | 2025.04.07 |
[Java] 13. 클래스 메서드와 인스턴스 메서드 (0) | 2025.04.03 |
[Java] 12. 메서드란? (0) | 2025.04.02 |