안녕하세요, 코린이의 코딩 학습기 채니 입니다.
개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.
메소드 오버로딩이란? (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 타입까지 오버로딩이 되어있어 모든 타입을 출력할 수 있었던 것입니다.
이렇듯 메소드 오버로딩은 매개변수 타입은 다르지만, 동일한 작업을 하는 메소드를 그룹핑할 용도로 사용합니다.
'Java > Java' 카테고리의 다른 글
메소드) 재귀 메소드 (Recurison) (0) | 2022.03.17 |
---|---|
메소드) call by value, call by reference (0) | 2022.03.17 |
메소드) 인스턴스 메소드, static 메소드 (0) | 2022.03.17 |
접근 제한자) 멤버 및 생성자의 접근 제한자, 클래스의 접근 제한자 (0) | 2022.03.16 |
변수) 인스턴스 변수의 초기화 순서, static 변수의 초기화 순서 (0) | 2022.03.16 |