본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[Java] 메소드 오버로딩 ( Method Overloading ) 에 대하여.

by 돼지왕 왕돼지 2013. 9. 6.
반응형


 자바, 메소드 오버로딩 ( Method Overloading ) 에 대하여..

 

[Java] 메소드 오버로딩 ( Method Overloading ) 에 대하여.



JDK 1.7 ( Java 7 ) 에서는 어떤 기능들이 추가되었는가 궁금해서 책을 빌려보면서 기초부터 한번 정리해보고 있다. 막상 책에서는 generic 도 안 다루고, 1.7 specific 한 정보들도 다루지는 않지만 기초를 한번 되짚어 봐서 좋다.


IDE 의 도움으로 점점 뭔가 확고함이 떨어지는 가운데 오늘은 메소드 오버로딩 조건에 대해 간단히 알아보고자 한다.


먼저 간단히 메소드 오버로딩에 대해 말하자면,

같은 이름의 함수를 여러번 정의해서 쓰는거다. 물론 이름은 같지만 무언가는 달라야 한다. 

우선 오버로딩의 조건부터 보자.


1. 파라미터의 타입이나 갯수가 달라야 한다.

2. 파라미터의 이름은 오버로딩의 성립에 영향을 주지 않는다.

3. 리턴 타입은 오버로딩 성립에 영향을 주지 않는다.


자 이제 하나하나 무슨 말인가 보자.




파라미터의 타입이나 갯수가 달라야 한다.


public void printSth( String str ){ ... }

public void printSth( int varInt ){ ... }


위 두 함수의 경우 이름이 같으나 파라미터의 타입이 다르다. 마찬가지로 갯수가 달라도 된다.


public void printSth( String str ){ ... }

public void printSth( String str1, String str2 ){ ... }





요렇게 파라미터 갯수가 달라도 오버로딩에 성공한다.


오버로딩이 언제 되는가는 사실 당신이 오버로딩된 함수의 사용자라고 생각해보면 쉽다.

어떤 형태로 오버로딩을 했을 경우 당신이 사용자라면 함수호출을 할 때 같은 이름의 함수 1 혹은 함수 2 중 어떤 녀석을 호출할지 명확하다면 그것은 오버로딩 할 수 있다고 보면 된다.





파라미터의 이름은 오버로딩의 성립에 영향을 주지 않는다.


C 에는 prototype 정의라는 개념이 있어서 쉽게 이름은 영향력이 없다는 것을 인지할 수 있지만, 자바는 그렇지 않다. ( 초보자들에게 )


public void printSth( String str1 ){ ... }

public void printSth( String str2 ){ ... } // NOOOOOO !!!


위의 경우는 파라미터의 이름만 다른 경우이다. 생각해보라 당신이 printSth( "감자" ) 를 불렀을 때 위의 함수를 호출해야 할지, 아래 함수를 호출해야 할지 명확한가? 명확하지 않기 떄문에 당연히 오버로딩이 되지 않도록 설계되어 있다.



리턴타입은 오버로딩 성립에 영향을 주지 않는다.


사실 이 녀석은 학부시절에 조금 햇갈렸던 부분이다. 예를 들어


public int getValue( String str ){ ... }

public String getValue( String str ){ ... }  // NOOOOOO !!


이렇게 2개가 있는경우.




int varInt = getValue( "감자" );
String str = getValue( "고구마" );

이런식으로 사용하면 위의 경우는 위의 함수를, 아래의 경우는 아래의 함수를 쓰도록 하면 되는데, 즉 선택할 때 명확한데 왜 오버로딩이 안 되는가 하고.. ㅋ


지금도 보면 살~짝 헷갈리려 하지만.. 잘 보면 어떤 걸 써야 할지 모른다.

왜냐면 우리는 항상 정확한 타입에 assign 을 하지않으며, 함수호출은 return 값이 있어도 반드시 assign 을 하지 않아도 되기 때문이다.


예를 들어


getValue( "바보" );


위와 같은 코드를 넣었다고 하자. 저 코드는 assign 은 안 되었지만 잘 작동한다. getValue 라는 것이 어떤 값을 리턴한다고 하지만 그 리턴값을 무시하고 getValue 라는 함수 안에서 어떤 일을 잘 처리했기를 바라는 마음에서라면 충분히 저런 코드는 나올 수 있다. 저런 경우라면 당신은 어떤 함수를 호출할지 명확히 할 수 있는가? 이 외에도 리턴타입이 같은 부모를 상속한 개별적인 return type 일 경우 어떤 녀석을 호출해야 하는지 명확치 않다.




자, 이제 오버로딩에 대해 확실해졌는가?



반응형

댓글