일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 돈
- algorithmTest
- 경제
- Java
- 자바
- JavaScript
- 자바스크립트
- 알고리즘공부
- 성분
- 투자
- 알고리즘 공부
- 독서
- 채권
- 알고리즘트레이닝
- algorithmtraining
- 화장품
- 다독
- 프로그래머스 알고리즘 공부
- 책을알려주는남자
- algorithmStudy
- 프로그래밍언어
- 지혜를가진흑곰
- 책알남
- C++
- C
- 주식
- 재테크
- 독후감
- 서평
- 백준알고리즘
Archives
- Today
- Total
탁월함은 어떻게 나오는가?
[JAVA] 오버로딩(overloading) 본문
반응형
오버로딩(overloading)이란?
한 클래스(class) 내에 같은 이름의 메서드(method)를 여러 개 정의하는 것을 '메서드 오버로딩' 또는 간단히 '오버로' 이라 한다.
같은 이름의 메서드를 정의한다고 해서 무조건 오버로딩인 것은 아니다. 오버로딩이 성립되기 위해서는 3가지의 조건을 만족해야한다.
1. 메서드 이름이 같아야 한다.
2. 매개변수의 개수 또는 타입이 달라야 한다.
3. 반환 타입은 관계 없다.
메서드의 이름이 같다 하더라도 매개변수가 다르면 서로 구별될 수 있기 때문에 오버로딩이 가능한 것이다. 위의 3가지 조건을 만족하지 못하면 컴파일시에 에러가 발생한다.
오버로딩의 가장 대표적인 예가 자주 사용하는 println메서드이다. 지금까지 println메서드의 괄호 안에 값만 지정해주면 홤녀에 출력하는데 아무런 어려움이 없었다. 하지만, 실제로는 println메서드를 호출할 때 매개변수로 지정하는 값의 타입에 따라서 호출되는 println메서드가 달라진다.
PrintStream클래스에서는 어떤 종류의 매개변수(밑에 코드에서 "( ) 괄호" 를 뜻함)를 지정해도 출력할 수 있도록 아래와 같이 10개의 오버로딩 된 println 메서드를정의해놓고 있다.
1
2
3
4
5
6
7
8
9
10
|
void println();
void println(boolean x);
void println(char x);
void println(char[] x);
void println(double x);
void println(float x);
void println(int x);
void println(long x);
void println(object x);
void println(String x);
|
cs |
간단한 예시)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
// 1번. 이것은 오버로딩이 아니다. 메소드 중복정의이다.
// 두 메서드는 매개변수의 이름만 다를 뿐 매개변수의 타입이 같기 때문에
// 오버로딩이 성립하지 않는다. 매개변수의 이름이 다르면 메서드 내에서 사용되는
// 변수의 이름이 달라질 뿐, 아무런 의미가 없다.
int add(int a, int b) { return a + b; }
int add(int x, int y) { return x + y; }
// 2번. 이것은 오버로딩이 아니다. 메소드 중복정의이다.
// 리턴타입만 다르고 매개변수의 타입과 개수가 일치하기 때문에 add(3,3)과
// 같이 호출하였을 때 어떤 메소드가 호출된 것인지 결정할 수 없기 때문에
// 오버로딩으로 간주되지 않는다.
int add(int a, int b) { return a + b; }
long add(int a, int b) { return (long)(a + b); }
// 3번. 이것은 오버로딩이다.
// 두 메서드 모두 int형과 long형 매개변수가 하나씩 선언되어 있지만, 서로 순서가
// 다른경우이다. 이 경우에는 호출 시 매개변수의 값에 의해 호출될 메서드가 구분될 수
// 있으므로 중복된 메서드 정의가 아닌 오버로딩으로 간주한다.
long add(int a, long b){ return a + b; }
long add(long a, int b){ retirn a + b; }
|
cs |
코드 사용 예시)
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
32
33
34
|
package JavaJungsuck.six;
class MyMath3 {
// overloadding의 올바른 예: 매개변수는 다르지만 같은 의미의 기능을 수행
// 보통은 오버로딩이라 칭하지만, 정확하게는 메소드 오버로딩(method overloading)이다.
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;
}
}
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
package JavaJungsuck.six;
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, 3) 결과:" + mm.add(3,3L));
System.out.println("mm.add(3, 3) 결과:" + mm.add(3L,3L));
int[] a = { 100, 200, 300 };
System.out.println("mm.add(a) 결과: " + mm.add(a));
}
}
|
cs |
반응형
'[Snow-ball]프로그래밍(컴퓨터) > java' 카테고리의 다른 글
[JAVA] oracle real world object에 관해서. area와 field (0) | 2021.03.09 |
---|---|
[JAVA] 클래스와 객체의 정의 (0) | 2021.03.09 |
[JAVA] static메서드와 인스턴스메서드의 사용예와 차이점 (0) | 2021.03.06 |
[JAVA] 파일포인터(FilePointer) (0) | 2021.03.05 |
[JAVA] 자바 압축하기 압축해제 사용법 (0) | 2021.03.05 |
Comments