메소드 오버로딩(Method Overloading)_22.01.02
클래스 내에 같은 이름의 메소드를 2개 이상 정의할 수 있게 해주는 기능이다
public class Calculator {
int add(int a, int b) {
return a + b;
}
int add(int a, int b, int c) {
return a + b + c;
}
double add(double a, double b) {
return a + b;
}
public static void main(String[] args) {
Calculator c = new Calculator();
System.out.println(c.add(2, 4));// test 1
System.out.println(c.add(2, 4, 8));// test 2
System.out.println(c.add(3.14, 2.54));// test 3
}
}
6
14
5.68
'add'라는 이름의 메소드가 세 개나 있다. 그런데 아무 오류도 나지 않는다. 어떻게 이럴 수 있을까?
잘 보면 각 메소드는 다른 구성의 파라미터들을 받는다.
첫 번째 'add'는 정수형 값 두 개, 두 번째 'add'는 정수형 값 세 개, 그리고 세 번째 'add'는 소수형 값 두 개를 받는다.
같은 이름의 메소드라도 파라미터 구성이 다르면 자바는 알아서 구분을 할 수 있다.
main 메소드에서 'c.add(2, 4)'를 하면 알아서 첫 번째 'add'가 불리고, 'c.add(2, 4, 8)'을 하면 두 번째 'add'가 불리고, 'c.add(3.14, 2.54)'를 하면 세 번째 'add'가 불리는 것이다.
쓰임 (Usage)
은행 계좌 예제
'달러'나 '유로'같은 다른 통화로 입금을 하는 depositWithExchangeRate 메소드를 아래처럼 쓸 수 있다.
public boolean deposit(int amount) {
if (amount < 0 || amount > owner.getCashAmount()) {
System.out.println("입금 실패입니다. 잔고: " + balance + "원, 현금: " + owner.getCashAmount() + "원");
return false;
}
balance += amount;
owner.setCashAmount(owner.getCashAmount() - amount);
System.out.println(amount + "원 입금하였습니다. 잔고: " + balance + "원, 현금: " + owner.getCashAmount() + "원");
return true;
}
public boolean depositWithExchangeRate(double amount, double exchangeRate) {
return deposit((int) (amount * exchangeRate));
}
하지만 사실 'depositWithExchangeRate'을 'deposit'으로 바꿔도 아무런 문제가 없다. 파라미터 구성이 달라 '메소드 오버로딩' 개념이 적용되기 때문이다.
public boolean deposit(double amount, double exchangeRate) {
return deposit((int) (amount * exchangeRate));
}
콘솔 출력
생각해보면 지금까지 써왔던 'System.out.println'도 파라미터를 굉장히 다양하게 받는다. 이게 다 '메소드 오버로딩'이다.
System.out.println(5);// 정수 파라미터
System.out.println(3.14);// 소수 파라미터
System.out.println("hello");// 문자열 파라미터
System.out.println(true);// 불린 파라미터
5
3.14
hello
true
+ 22.01.20
메소드 오버로딩은 매개변수를 사용한다.
즉, 매개변수가 다르면 이름이 같아도 서로 다른 메소드가 되는 것이다.
반면 매개변수가 같지만 리턴타입이 다르면 오류가 발생한다.
리턴 값이 다른 것은 오버로딩이 될 수 없다.
매개변수를 달리 하는 것으로도 오버로딩 할 수 없다.
아래 코드를 보면 13번 째 줄의 A 메소드가 리턴 타입이 달라 에러가 발생하고 있다.
상속의 관계에서도 오버로딩을 사용할 수 있다.
https://yelin1217.tistory.com/86
[Java] 오버라이딩(Overriding)
오버라이딩(Overriding)이란? 재정의를 의미하며, 상속과 밀접한 관계를 가지고 있다. 즉, Java에서는 부모 클래스가 가지고 있는 메소드를 물려 받지만 그것을 그대로 사용하지 않고 자식 클래스의
yelin1217.tistory.com
'TIL > Java' 카테고리의 다른 글
[Java] abstract (0) | 2022.01.25 |
---|---|
[Java] 패키지 (0) | 2022.01.21 |
[Java] 오버라이딩(Overriding) (0) | 2022.01.19 |
[Java] 상속과 생성자 (0) | 2022.01.18 |
[Java] 상속(Inheritance) (0) | 2022.01.18 |