티스토리 뷰
한 클래스에서 매개변수의 개수 또는 타입이 다르면 이름이 같은 메소드를 여러개 정의할 수 있는데, 이처럼 이름이 같은 메소드를 여러개 정의하는 것을 메소드 오버로딩 또는 오버로딩이라고 한다.
오버로딩 조건
- 메소드 이름이 같아야한다.
- 매개변수의 개수 또는 타입이 달라야한다.
위의 조건이 만족되면 메소드의 이름이 같더라도 서로 식별될 수 있기때문에 오버로딩이 가능하다.
이 때, 메소드의 리턴타입과 매개변수명은 전혀 영향을 미치지 않는다는걸 주의해야한다.
오버로딩 잘못된 예시
1. 메소드 이름은 같지만 매개변수 이름만 다른 경우
public int add(int a, int b){ return a + b; }
public int add(int x, int y){ return x + y; }
메소드의명이 같지만 매개변수 개수와 타입이 같다. 매개변수 이름이 다르지만 조건을 만족하지 않기 때문에 오버로딩되지않아 에러가 발생한다.
2. 메소드 이름은 같지만 리턴타입만 다른경우
public int add(int a, int b){ return a + b; }
public long add(int a, int b){ return (long)(a + b); }
리턴타입이 다르더라도 매개변수의 타입과 개수가 동일하기 때문에 add(10, 20)이 호출되었을 때 어떤 메소드를 호출할지 모호하다.
오버로딩 예시
public static void main(String[] args) {
AddTest addTest = new AddTest();
System.out.println("add(10, 20)" + addTest.add(10, 20)); //[1]
System.out.println("add(10, 20, 30)" + addTest.add(10, 20, 30)); //[2]
System.out.println("add('10', '20')" + addTest.add("10", "20")); //[3]
}
class AddTest {
public int add(int a, int b) { return a + b; } //[1]
public int add(int a, int b, int c) { return a + b + c; } //[2]
public String add(String a, String b) { return a + b; } //[3]
}
add(10, 20)30 add(10, 20, 30)60 add('10', '20')1020 |
같은 이름의 add 메소드가 3개이더라도 매개변수 타입과 갯수가 각각 다르기 때문에 오버로딩이 적용된다.
오버로딩 호출순서
public static void main(String[] args) {
AddTest addTest = new AddTest();
System.out.println("2 + 3 = " + addTest.addPrint(2, 3));
}
class AddTest {
public int addPrint(int a, int b) {
System.out.println("[addPrint]");
return a + b;
}
}
[addPrint] 2 + 3 = 5 |
해당 코드를 실행해보면, main함수의 println메소드 보다 addPrint메소드가 먼저 실행된다. main 함수의 println이 실행되기 위해선 addPrint의 결과가 먼저 계산되어야 하기 때문인데 main함수의 println 수행 구문 한 줄이 아래의 두 줄과 같다고 생각하면 이해가 쉽다.
//System.out.println("2 + 3 = " + addTest.addPrint(2, 3));
int result = addTest.addPrint(2, 3);
System.out.println("2 + 3 = " + result);
오버로딩 장점
매개변수만 다를 뿐 같은기능을 한다면 하나의 메소드명만 사용하면 되기 때문에 사용자 입장에서 이름과 기능을 기억하기 쉽다. 또한 메소드마다 이름을 다르게 작성해주는 수고를 줄일 수 있다.
오버로딩의 가장 대표적인 예시인 PrintStream클래스의 println메서드를 예시로 보면 이해가 쉽다.
//오버로딩 사용예시
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)
//오버로딩을 사용하지 않았을 때
void println()
void printlnBoolean(boolean x)
void printlnChar(char x)
void printlnCharArr(char[] x)
void printlnDouble(double x)
void printlnFloat(float x)
void printlnInt(int x)
void printlnLong(long x)
void printlnObject(Object x)
void printlnString(String x)
'Programming > Java' 카테고리의 다른 글
JAVA 생성자(Constructor) 정의 및 예제 (0) | 2022.03.29 |
---|---|
인자(argument)와 매개변수(parameter) 차이, 인자 전달 과정 (0) | 2022.03.15 |
[Java] JVM 메모리 구조 (0) | 2022.03.09 |
[Java] 예외처리 : Try/Catch, Throws (0) | 2021.08.19 |
[Java] hashCode vs identityHashCode 차이점 (0) | 2021.08.05 |
- Total
- Today
- Yesterday
- 이클립스
- 스프링부트
- 오라클
- C
- 데이터베이스
- C++
- JSP
- 오류
- Open API
- 넥사크로
- 개발용어
- 국비교육
- 프로그래머스
- Java
- CSS
- 네트워크
- 스프링
- 백준
- 부트스트랩
- 인턴
- HeidiSQL
- 환경설정
- CS
- SQL
- svn
- Thymeleaf
- JVM
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |