2024.01.16.(화) 공부내용
1. 메소드 오버로딩(method Overloading) 이란?
- 메소드의 이름은 하나만 주고 매개변수를 다르게 함으로써 메소드를 여러 개 만드는 기법
- 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것
- 오버로딩 메서드의 구별은 매개변수의 개수 및 매개변수의 데이터 타입으로 구분
- 오버로딩(Overloading)의 사전적 의미는 '과적하다', 즉 '많이 싣는 것'을 의미
=>보통 하나의 메서드 이름에 하나의 기능만 구현해야하는데, 하나의 메서드 이름으로 여러기능을 구현하기 때문에 붙여진 이름
2. 메서드 오버로딩 조건
1. 메서드 이름이 같아야 한다.
2. 매개변수의 개수 또는 타입이 달라야 한다.
참고로, 오버로딩된 메서드들은 매개변수에 의해서만 구별될 수 있으므로 반환타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.
1) 오버로딩이 아닌 경우 - 매개변수의 이름만 다르고 매개변수의 타입이 같은 경우
int sum(int a, int b) { return a + b;}
int sum(int c, int d) { return c + d;} //오버로딩x
위의 두 메서드는 매개변수의 이름만 다를 뿐 매개변수의 타입이 같기때문에 오버로딩이 아니다.
매개변수의 이름이 다르면 메서드 내에서 사용되는 변수이름이 달라질 뿐 두 메서드는 정확히 같은 것이다.
마치 수학에서 f(x) = x + 1 과 f(a) = a + 1이 같은 표현인 것과 같다.
2) 오버로딩이 아닌 경우 - 리턴타입만 다른 경우
int sum(int a, int b) { return a + b;}
int sum(int a, int b) { return (long) (a + b);} //오버로딩x
위의 두 메서드는 매개변수의 타입과 개수가 일치하기 때문에 sum(2, 3) 과 같이 호출하였을때 첫번째 메서드가 호출된 것인지, 두번째 메서드가 호출된 것인지 결정할 수 없기 때문에 오버로딩으로 간주되지 않는다.
3) 오버로딩인 경우 - 매개변수의 개수와 타입이 같으나, 순서만 다른 경우
int sum(int a, long b) { return a + b;}
int sum(long a, int b) { return a + b;} //오버로딩o
위의 두 메서드는 모두 int형과 long형 매개변수가 하나씩 선언되었지만 서로 순서가 다른 경우다.
이 경우에는 sum(2, 3L)과 같이 호출되면 첫번째 메서드가, sum(2L, 3) 과 같이 호출되면 두번째 메서드가 호출된다. 매개변수의 값에 의해 호출될 메서드가 구분 될 수 있으므로 오버로딩으로 간주한다.
단, sum(2, 3) 과 같이 호출할 수 없다. 이와 같이 호출할 경우 어느 메서드가 호출된 지 알 수 없기 때문에 컴파일 에러가 발 생한다.
3. 오버로딩의 예시
- pinrln 메서드
pirntln 메서드에 괄호 안에 값만 지정해주면 화면에 출력하는데 아무런 어려움이 없었지만, 사실 이는 println 메서드은 호출 시 매개변수로 지정하는 값의 타입에 따라 호출되는 println메서드가 달라지기 때문이다.
println 메서드는 PrintStream클래스에 존재하는데, 어떤 종류의 매개변수를 지정해도 출력 가능하도록 10개의 오버로딩된 println메서드를 정의해두고 있어 어떤 데이터 타입을 넣어도 어려움 없이 콘솔창에 출력할 수 있었던 것이다.
4. 메서도 오버로딩의 필요성
메서드 오버로딩이 허용되지 않는 상황을 가정하면 오버로딩의 장점을 쉽게 알 수 체감할 수 있다.
만약 메서드가 단지 이름으로만 구별 된다면? (한 클래스 내의 모든 메서드들의 이름이 달라야한다면?)
println 메서드의 매개변수에 따라 이름이 달라지는 상황을 가정해보자.
void println()
void printlnBoolean(boolean x)
void printlnChar(char x)
void printlnDouble(double x)
void printlnString(string x)
모두 매개변수를 출력하는 기능을 한다는 점에서 기능이 같은 메서드지만, 서로 다른 이름을 가져야한다면 이름을 지어야하는 프로그래머도 일일이 메서드명을 외워야하는 사용자도 힘들 것이다.
하지만 오버로딩을 허용함으로써 위에서 보았듯이 println() 이라는 하나의 이름으로 정의 될 수 있어 기억하기도 쉽고 이름을 짧게 할 수 있어 오류의 가능성도 줄일 수 있다. 또한 메서드의 이름만 보고도 기능을 쉽게 예측할 수 있다.
'JAVA' 카테고리의 다른 글
[Java] 환경설정(1) : 내가 보려고 쓰는 JDK1.8 설치 + Java 환경변수 설정 + Eclipse 2018-09 설치 + Maven/Tomcat/SVN 설치 (2) | 2024.09.05 |
---|---|
[JAVA] 메서드(메소드)(method) (1) | 2024.01.15 |