JAVA/객체지향프로그래밍1

[JAVA] 오버로딩(overloading)

prize1209 2021. 6. 21. 16:44

1. 오버로딩(overloading)이란?

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

 

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

 

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

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

3. 반환 타입은 영향 없다. 

 

 

3. 오버로딩의 예

 

 

대표적인 예) println 

println메서드를 호출할 때 매개변수로 지정하는 값의 타입에 따라서 호출되는 println 메서드가 달라진다.

컴파일러가 매개변수 타입을 확인해서 거기에 맞는 메소드를 연결한다.

 

 

 

 

예)

매개변수의 이름이 다른 것은 오버로딩이 아니다. (메서드 중복 정의)

 

리턴타입은 오버로딩의 성립조건이 아니다. (중복 정의)

매개변수의 타입이 다르므로 오버로딩이 성립한다.

만약 add(3,3)을 호출하면 둘 중 어느 것이 호출될지 모호하다(ambiguous)

 

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

 

 

오버로딩의 장점 

메서드도 변수처럼 단지 이름만으로 구별되면, 한 클래스 내의 모든 메서드들은 이름이 달라져야한다. 

만약 println도 

void println()

void printBoolean(boolean x)

void printChar(char x)

void printlnDouble(double x)

void printlnString(String x)

이런 식으로 다 달라져야한다. 

오버로딩을 통해 같은 기능을 하는 메서드는 같은 이름으로 하면 오류의 가능성이 줄어든다. 이름도 절약할 수 있다.

 

 

예21)

 

public class OverLoadingTest {
	public static void main(String[] args) {

		// 인스턴스 객체 생성
		MyMath4 mm = new MyMath4();

		System.out.println("mm.add(3, 3) 결과:" + mm.add(3, 3));
		System.out.println("mm.add(3, 3L) 결과:" + mm.add(3L, 3));
		System.out.println("mm.add(3, 3L) 결과:" + mm.add(3, 3L));
		System.out.println("mm.add(3L,3) 결과:" + mm.add(3L, 3L));

		int[] a = { 100, 200, 300 };
		System.out.println("mm.add(a) 결과:" + mm.add(a));
	}
}

class MyMath4 {

	int add(int a, int b) {
		System.out.print("int add(int a, int b)-");
		return a + b;

	}

	long add(int a, long b) {
		System.out.print("long add(int a, long b)-");
		return a + b;
	}

	long add(long a, int b) {
		System.out.print("long add(long 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;
	}
}

println의 메서드보다 add메서드의 계산이 먼저 수행되어야한다.