[JAVA] 오버로딩

용용학생·2024년 4월 21일

자바

목록 보기
14/32

오버로딩

하나의 클래스에서 같은 이름의 메소드를 여러 개 정의하는 것

클래스 내에서는 변수와 마찬가지로 메소드도 구별되기 위해서 이름이 각기 달라야 한다. 그러나 자바에서는 오버로딩을 통해 같은 이름 메소드를 정의할 수 있다.

조건

오버로딩이 성립되기 위해서는 다음의 조건을 만족해야한다.

  • 메소드 이름이 같아야 함
  • 매개변수의 개수나 타입이 달라야 함

위의 조건이 만족되지 않으면 메소드의 중복 정의로 가정되고 컴파일 에러가 발생한다.
주의해야 할 것은 반환 타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다는 것이다.

println 메소드의 오버로딩

가장 많이 쓰는 메소드 중에 오버로딩이 되어있는 대표적인 것이 바로
println 메소드이다.

Oracle의 자바 공식문서에 쓰인 println 메소드이다.

메소드의 매개변수로 넘겨주는 값의 타입에 따라서 오버로딩된 메소드 중 하나가 선택되어 실행되는 것이다.

오버로딩 예시

	int add(int a, int b) { return a + b; }
    int add(int x, int y) { return x + y; }

이런 경우는 매개변수의 이름만 다를 뿐 타입과 개수가 일치하기 때문에 오버로딩이 아니다. 수학에서 f(x) = x + 1 과 f(a) = a + 1 의 차이이다.
두 메소드의 결과는 완전히 동일하다.


	int add(int a, int b) { return a + b; }
    long add(int a, int b) {return (long)(a + b); }

이런 경우는 반환 타입만 다르고 매개변수의 개수와 타입은 일치하기 때문에 오버로딩이 아니다.
이렇게 반환 타입만 다르다면 add(3, 3)을 호출 시 컴파일러가 어느 메소드를 호출해야하는지 모르기 때문에 컴파일 에러가 난다.


	long add(int a, long b) { return a + b; }
    long add(long a, int b) { return a + b; }

이 경우에는 두 메소드 모두 int형 매개변수와 long형 매개변수가 하나씩 선언되어 있지만, 순서가 다르기 때문에 오버로딩으로 간주된다.
메소드를 호출 시 매개변수의 값에 따라 호출될 메소드를 구분할 수 있기 때문에 정상적으로 컴파일된다.

다만 주의해야할 점은 add(3, 3) 같이 호출 시에는 어느 메소드가 호출된 것인지 알 수 없기에 에러가 발생한다.


	int add(int a) { return a + 10; }
	int add(int a, int b) { return a + b; }
    long add(long a, long b) { return a + b; }
	long add(int[] a) {
    	long result = 0;
        for(int i=0; i<a.length; i++) {
        	result += a[i];
        }
     	return result;
    }

위 같은 경우는 모두 정상적인 오버로딩이다.
매개변수의 개수가 다르거나 타입이 다르다.

profile
자바 스프링 공부하는 정리 블로그!

0개의 댓글