본문 바로가기
Java/Java

메소드) 메소드 오버로딩, 메소드 시그니처란?

by 박채니 2022. 3. 17.
SMALL

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


메소드 오버로딩이란? (Method Overloading)

- 한 클래스 안에서 동일한 이름의 메소드를 여러개 선언

- 단, 메소드 시그니처가 달라야함 

 

메소드 시그니처(Method Signature)란?
- 메소드명, 입력매개변수의 자료형

 

한 클래스 안에서 동일한 메소드명을 가진 메소드를 여러개 선언할 수 없습니다.

다만, 동일한 메소드명이여도 메소드 시그니처가 다르면 JVM은 다른 메소드로 인식하게 되어 오류가 나지 않습니다.

 

즉 메소드 오버로딩을 한 줄로 정의하자면,

'입력 매개변수의 개수, 자료형, 순서가 다른 여러 개의 동일한 이름을 지닌 메소드를 정의하는 것'입니다.

 

	//메소드 오버로딩
	public void test() {}
//	public void test() {}	//메소드 시그니처가 같으므로 사용 불가
	public void test(int a) {}
	public void test(int a, String b) {}
	public void test(String b, int a) {}
	public void test(int[] a, String b) {}
	public void test(double b) {}
	public void test(MethodOverloadingStudy study) {}

이렇듯 메소드 명이 동일해도 입력매개변수의 순서, 개수, 타입에 차이가 있다면 서로 다른 메소드로 인식하게 됩니다.

 

메소드를 사용할 때는 매개인자를 사용하고자 하는 메소드의 매개변수의 순서, 개수, 타입에 맞게 전달해줘야겠죠?

//메소드 오버로딩 사용
public class MethodOverloadingStudy {
	public static void main(String[] args) {
		MethodOverloadingStudy study = new MethodOverloadingStudy();
		
		int[] arr = {1, 2, 3};
		
		study.test();
		study.test(10);
		study.test(10, "안녕");
		study.test("안녕", 10);
		study.test(arr, "안녕");
		study.test(5.8);
		study.test(study);
	}
	
	public void test() {}
//	public void test() {}	//메소드 시그니처가 같으므로 사용 불가
	public void test(int a) {}
	public void test(int a, String b) {}
	public void test(String b, int a) {}
	public void test(int[] a, String b) {}
	public void test(double b) {}
	public void test(MethodOverloadingStudy study) {}
}

매개인자의 순서, 개수, 타입에 따라 JVM이 알맞은 메소드를 찾아 사용합니다.

 

 

여기서 주의해야할 점!!!!

매개변수명, 접근제한자, 리턴타입은 상관하지 않으므로 다른 메소드로 인정할 수 없습니다.

사실 당연한 얘기이겠지만, 메소드를 호출할 때는 매개변수명, 접근제한자, 리턴타입을 명시해주지 않기 때문입니다.

public class MethodOverloadingStudy {
	public static void main(String[] args) {
		MethodOverloadingStudy study = new MethodOverloadingStudy();
		study.test(10);
	}
	//오류 발생 JVM이 못 찾음
	public void test(int a) {}
	public void test(int b)
	private void test(int a) {}
	public int test(int a) {return a;}
}

각각 접근제한자, 매개변수명, 리턴타입이 다른 메소드를 4개를 생성하였습니다.

 

메소드를 호출하기 위하여 study.test(10)을 호출하면 4개의 메소드 중 무엇을 실행해야 할까요?

호출 과정에서 매개변수명, 접근제한자, 리턴타입을 명시해주지 않기 때문에 메소드를 구분할 수 없는 것입니다.

 

 

☞ 자바에서 제공하는 print(), println() 메소드의 비밀!

출력문으로 사용하던 System.out.print(), System.out.println()에 정수형, 실수형, 문자형, 불리언형, 문자열, 배열 등등 다양한 타입을 출력할 수 있었습니다.

그 이유는 print(), println() 메소드가 각 타입으로 오버로딩 되어 있었기 때문입니다.

심지어는 Object 타입까지 오버로딩이 되어있어 모든 타입을 출력할 수 있었던 것입니다.

 

이렇듯 메소드 오버로딩은 매개변수 타입은 다르지만, 동일한 작업을 하는 메소드를 그룹핑할 용도로 사용합니다.

 

LIST