티스토리 뷰

한 클래스에서 매개변수의 개수 또는 타입이 다르면 이름이 같은 메소드를 여러개 정의할 수 있는데, 이처럼 이름이 같은 메소드를 여러개 정의하는 것을 메소드 오버로딩 또는 오버로딩이라고 한다.

 

오버로딩 조건

  1. 메소드 이름이 같아야한다.
  2. 매개변수의 개수 또는 타입이 달라야한다.

위의 조건이 만족되면 메소드의 이름이 같더라도 서로 식별될 수 있기때문에 오버로딩이 가능하다.

이 때, 메소드의 리턴타입매개변수명은 전혀 영향을 미치지 않는다는걸 주의해야한다.

 

오버로딩 잘못된 예시

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)

 

 

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
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
글 보관함