Java

[Java] 메소드 오버로딩

콩스프 2022. 11. 28. 00:02
메소드 오버로딩 (overloading) : 클래스 내에 같은 이름의 메소드를 여러 개 선언하는 것

overloading :  (사전적 의미) 많이 싣는 것

➡ 메소드 오버로딩 : "하나의 메소드 이름으로 여러 기능을 담는다"

 

 

메소드 오버라이딩의 가장 대표적인 EX)

- System.out.println() 메소드

void println() {...}
void println(char x) {...}
void println(char[] x) {...}
void println(double x) {...}
void println(float x) {...}
void println(int x) {...}
void println(long x) {...}
void println(Object x) {...}
void println(String x) {...}
  • println()메소드는 호출할 때 주어진 매개값의 타입에 따라 오버로딩된 println() 메소드를 호출

 

 

 메소드 오버로딩의 조건

  • 매개 변수의 타입, 개수, 순서하나가 달라야 함

 

 

💡 메소드 오버로딩시 주의할 점

  • 매개 변수의 타입과 개수, 순서가 똑같을 경우 매개 변수 이름만 바꾸는 것은 메소드 오버로딩이라고 볼 수 없음
  • 리턴 타입만 다르고 매개 변수가 동일하다면 오버로딩이 아님
  • 리턴 타입은 JVM이 메소드를 선택할 때 아무런 도움을 주지 못함

 

int divide(int x, int y)  { ... }
double divide(int boonja, int boonmo) { ... }
  • 오버로딩이 아니기 때문에 컴파일 에러가 발생함

 

 

 메소드 오버로딩이 필요한 이유

  • 매개값을 다양하게 받아 처리할 수 있도록 하기 위해서 필요함
  • 오버로딩된 메소드를 호출할 경우 JVM은 매개값의 타입을 보고 메소드를 선택

오버로딩 EX)

int plus (int x, int y) {
    int result = x + y;
    return result;
}
  • plus() 메소드를 위해 두 개의 int 매개값이 필요함
  • double 타입의 값을 덧셈하기 위해서는 plus() 메소드를 호출할 수 없음

 

double plus(double x, double y) {
    double result = x + y;
    return result;
}
  • 변수가 double 타입으로 선언된 plus() 메소드를 하나 더 선언하면 됨

 

plus(10, 20);		//plus(int x, int y) 실행
plus(10.5, 20.3);	//plus(double x, double y) 실행
  • 매개값의 타입을 보고 JVM이 메소드를 선택하여 실행

 

int x = 10;
double y = 20.3;
plus(x,y);	// ???
  • 첫 번째 매개 변수가 int 타입이고 두 번째 매개 변수가 double 타입인 plus() 메소드가 없음
  • 컴파일 오류가 날 것 같지만 plus(double x, double y)가 실행됨

 

WHY?

  • JVM은 일차적으로 매개 변수 타입을 봄
  • 매개 변수의 타입이 일치하지 않을 경우 자동 타입 변환이 가능한지를 검사
  • int 타입은 double 타입으로 변환이 가능하므로 최종적으로 plus (double x, double y) 메소드를 선택

 

오버로딩 EX2)

//[Rectangular.java]
public class Rectangular {
	int width;
	int height;
	double area;

	// 정사각형의 넓이
	double getArea(double width) {
		this.area = width * width;
		return area;
	}

	// 직사각형의 넓이
	double getArea(double width, double height) {
		this.area = width * height;
		return area;
	}
}

 

[OverloadingTest.java]
public class OverloadingTest {
	public static void main(String[] args) {
		Rectangular r1 = new Rectangular();

		// 정사각형의 넓이 구하기
		double result1 = r1.getArea(10);

		// 직사각형의 넓이 구하기
		double result2 = r1.getArea(10, 20);

		System.out.println("정사각형 넓이 = " + result1);
		System.out.println("직사각형 넓이 = " + result2);
	}
}

 

실행 결과)

  • 매개 값이 한 개이면 정사각형의 넓이를, 두 개이면 직사각형의 넓이를 계산하여 리턴
  • 어떤 메소드가 호출될 것인지 매개값의 수에 달림