티스토리 뷰
# 오버로딩(overloading)
메서드도 변수와 마찬가지로 같은 클래스 내에서 서로 구별될 수 있어야 하기 때문에 각기 다른 이름을 가져야 한다.
그러나 자바에서는 한 클래스 내에서 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라고 개수 또는 타입이 다르면, 같은 이름을 사용해서 메서드를 정의할 수 있다.
한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 '메서드 오버로딩(method overloading)' 또는 간단히 '오버로딩(overloading)'이라 한다. 또한 오버로딩이 성립하기 위해서는 다음과 같은 조건을 만족해야 한다.
▶ 오버로딩의 조건
① 메서드 이름이 같아야 한다.
② 매개변수의 개수 또는 타입이 달라야 한다. → 메서드 이름이 같다 하더라도 매개변수가 다르면 서로 구별될 수 있다.
③ 반환 타입은 관계없다.
* 오버로딩의 예로 가장 대표적인 것은 println메서드 이다.
println메서드를 호출할 때 매개변수로 지정하는 값의 타입에 따라서 호출되는 println메서드가 달라진다.
오버로딩 예시
예시 1) 매개변수의 이름이 다르고 타입이 같은 경우
int add{int a, int b) {return a+b;}
int add{int x, int y) {return x+y;}
- 오버로딩 조건에 성립하기 위해서는 매개변수 개수 또는 타입이 달라야 하는데 위의 예시는 그 조건이 성립하지 않는다.
예시 2) 리턴타입만 다은 경우
int add(int a, int b) {return a+b;}
long add(int a, int b) {return (long)(a+b);}
- 매개변수의 타입과 개수가 일치하기 때문에 add(3,3)으로 호출 시 어떤 메서드가 호출된 것인지 결정할 수 없다.
따라서 오버로딩에 간주되지 않는다.
예시 1과 예시 2를 컴파일하면, 'add(int, int) is already definded(=이미 같은 메서드가 정의되어있다)'라는 컴파일 오류가 발생할 것이다.
예시 3) 매개변수의 순서가 다른 경우
long add(int a, long b) {return a+b;}
long add(long a, int b) {return a+b;}
- 매개변수 타입이 같고 그 타입의 순서가 다른 경우, 호출 시 매개변수의 값에 의해 호출될 메서드가 구분될 수 있다.
따라서 중복된 메서드가 아닌, 오버로딩으로 간주한다.
- 메서드 호출 시 add(3, 3L)로 하면 첫 번째 메서드가 호출되고, add(3L, 3)로 하면 두 번째 메서드가 호출된다.
이렇게 오버 로딩할 경우 단점이 있는데 만약 메서드를 add(3,3)으로 호출하는 경우에는 두 메서드 중에서 어느 메서드가 호출된 것인지 알 수 없기 때문에 컴파일 에러가 발생한다.
예제) 오버로딩(overloadint) 예제
public class Ex6_10 {
public static void main(String[] args) {
MyMath3 mm = new MyMath3();
System.out.println("mm.add(3,3) 결과 : " + mm.add(3, 3));
System.out.println("mm.add(3L,3) 결과 : " + mm.add(3L, 3));
System.out.println("mm.add(3,3L) 결과 : " + mm.add(3, 3L));
System.out.println("mm.add(3,3L) 결과 : " + mm.add(3L, 3L));
int[] a = {100, 200, 300};
System.out.println("mm.add(a) 결과 : " + mm.add(a));
}
}
class MyMath3 {
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("int add(int a, long b) - ");
return a + b;
}
long add(long a, int b) {
System.out.print("int add(long a, int b) - ");
return a + b;
}
long add(long a, long b) {
System.out.print("int add(long a, long b) - ");
return a + b;
}
int add(int[] a) {
System.out.print("inr add(int[] a) - ");
int result = 0;
for (int i = 0; i < a.length; i++)
result += a[i];
return result;
}
}
* 출력 결과
int add(int a, int b) - mm.add(3,3) 결과 : 6
int add(long a, int b) - mm.add(3L,3) 결과 : 6
int add(int a, long b) - mm.add(3,3L) 결과 : 6
int add(long a, long b) - mm.add(3,3L) 결과 : 6
inr add(int[] a) - mm.add(a) 결과 : 600
출력 결과를 보면 add메서드가 먼저 출력된 후에 println메서드가 출력된 것을 알 수 있다.
'System.out.println("mm.add(3,3) 결과 : " + mm.add(3, 3));' 이 부분을 두 문장으로 분해해보면 진행과정을 알 수 있다.
int result = mm.add(3,3);
System.out.println("mm.add(3,3) 결과 : " + result);
먼저 add메서드를 호출한 값을 'result'변수에 담은 후 그 값이 println 메서드 괄호() 안에 있는 'result' 변수에 저장된 후
pringtln 메서드가 호출되어 출력 결과와 같은 결과 값이 출력된다.
'개발 공부 > JAVA' 카테고리의 다른 글
[JAVA] 문자열(String) 함수 정리 (0) | 2024.04.18 |
---|---|
[Java] 생성자, 기본 생성자, 매개변수가 있는 생성자 (0) | 2022.02.21 |
[Java] static 메서드와 인스턴스 메서드 (0) | 2022.02.17 |
[Java] return문, 호출 스택, 기본형/ 참조형 매개변수 (0) | 2022.02.11 |
[Java] 선언 위치에 따른 변수 종류, 메서드 호출 및 실행 (0) | 2022.02.03 |
- Total
- Today
- Yesterday
- 조건문 if
- 객체지향
- 자바의 정석
- 객체의 구성요소
- 객체지향 언어
- 클래스와 객체
- java의정석 기초
- 메서드 간의 호출과 참조
- 생활코딩
- 호출스택
- 코테
- JAVA 의 정석
- 두 수의 나눗셈
- java의 정석기초
- 2차배열 예제
- 매개변수가 있는 생성자
- string 배열
- do-while문
- Java
- 기본형/참조형 매개변수
- 기본 생성자
- 인스턴스 메서드
- continue문
- SQL
- JAVA의 정석
- 프로그래머스
- Lv.0
- MySQL
- return문
- 객체 배열
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |