본문 바로가기
멀티캠퍼스 풀스택 과정/Java의 정석

자바의 정석2-6 오버로딩(overloading)

by 이쟝 2021. 12. 31.

오버로딩(overloading): 한 클래스 안에 같은 이름의 메서드 여러 개 정의하는 것

대표적인 예) println 메서드

컴파일러가 매개변수의 타입을 보고 맞는 타입의 메서드를 연결해줌!

 

오버로딩이 성립하기 위한 조건

1. 메서드 이름이 같아야 한다.

2. 매개변수의 개수 또는 타입이 달라야 한다.

3. 반환 타입은 영향이 미치지 않는다.

 

<예제> 각 보기가 오버로딩일지 아닐지 생각해보기

 

 

더보기
더보기

1번 조건인 메서드이름이 add로 같지만 2번 조건인 매개변수의 개수나 타입이 달라야 하는데 매개변수의 개수가 같고, 타입이 int로 같기 때문에 오버로딩이 아닌 메서드 중복정의

 

 

더보기
더보기

1번 조건인 메서드이름이 add로 같지만 보기 1번과 마찬가지로 매개변수의 개수랑 타입이 다르지 않고, 변환 타입은 int와 long으로 다르지만 오버로딩에 영향을 미치지 않음 따라서 오버로딩이 아닌 메서드 중복 정의 

 

 

더보기
더보기

1번 조건인 메서드 이름이 add로 같고 2번 조건인 매개변수의 개수는 같지만 타입이 int와 long으로 다르기 때문에 조건 충족, 변환 타입은 long으로 같지만 변환 타입은 오버로딩의 조건에 영향을 미치지 않기 때문에 오버로딩이다!

 

하지만!!

-> add(3, 3)로 add 메서드를 호출하게하게 되면 에러 발생! 컴파일러가 어떤 코드에 넣어야 할지 모름

*The method add(int, long) is ambiguous for the type ~

-> add(3, 3L) 이렇게 하면 첫 번째 코드에 넣게 됨


오버로딩의 올바른 예 - 매개변수는 다르지만 같은 의미의 기능 수행

-> 같은 add 메서드이지만 매개변수는 각각 다름(int 형, long 형, array 형)

 

<출력값>

int add(int a, int b) - mm2.add(3,3) 결과:6

long add(long a, long b) - mm2.add(3L,3L) 결과:6

int add(int[] a) - mm2.add(arr) 결과:600

 

MyMath3 mm2 = new MyMath3();
int[] arr = {100, 200, 300};
System.out.println("mm2.add(3,3) 결과:" + mm2.add(3, 3));
System.out.println("mm2.add(3L,3L) 결과:" + mm2.add(3L, 3L));
System.out.println("mm2.add(arr) 결과:" + mm2.add(arr));

class MyMath3 {
	int add(int a, int b) {
		System.out.print("int add(int a, int b) - ");
		return a+b;
	}
	
	long add(long a, long b) {
		System.out.print("long add(long a, long b) - ");
		return a+b;
	}
	int add(int[] a) {    // 배열의 모든 요소의 합을 결과로 돌려준다.
		System.out.print("int add(int[] a) - ");
		int result = 0;
		for(int i=0; i < a.length; i++)
			result += a[i];
		
		return result;
	}
}

 

-> 출력할 때 메서드 값이 먼저 나오는 이유 -> add 메서드의 타입이 먼저 정의되어야 메서드가 맞는 매개변수의 타입을 사용할 수 있기 때문!

-> 매개변수의 타입은 다 다르지만 하는 작업은 동일함(메서드의 특징)

-> 메서드의 이름은 대부분 동작하는 것이기 때문에 대부분 동사