프로그래밍/Java, Android

[JAVA] 자바 오버로딩( overloading ) 최악의 문제

당근천국 2010. 12. 27. 03:52
자바(java)뿐만 아니라 객체지향에서 중요하면서도 유용한 기능입니다.

 
1. 오버로딩
클래스내에 같은 이름의 메소드를 여러개 만들어 쓰는걸 말합니다.
무조건 같은 이름이면 되는건 아니고 매소드의 매개변수 갯수나 매개변수 타입같은것은 달라야 합니다.
이렇게 하면 사용자 입장에서는 자신에게 맞는 매소드를 적절하게 활용 할수 있고 개발자는 동일한 코드가 반복되거나 비슷한 기능을 하는 메소드가 많아지는 것을 방지 할수 있고 입력된 매개변수를 정형화 할수 있어 좋습니다.
예를 들면 이런거저
public int intTest( int intA, int intB )
{
	Return intA + intB;
} 

public int intTest( int intA )
{
	Return intTest(intA, 0);
}

위 예제는 코드가 복잡하지 않으니 "왠 뻘짓인가?"라는 생각이 들겠지만 위 예제만 봐도 intTest라는 메소드를 수정할 일이 생기면 intTest( int intA, int intB )만 수정하면 오버로딩된 다른 메소드도 수정되는 효과를 볼수 있다는 것을 알수 있습니다.

 
2. .net 언어와 자바와의 차이
너무 흔이 사용되어서 검색엔진에 '오버로딩'만 처도 맨위에 정의가 나오는 이것을 설명하려는 것이 아니고 닷넷 언어와 자바와의 오버로딩 차이를 말하고 싶어서 쓰고 있습니다.

C#
public string strTest( int intA )
{
	Return intA + "";
} 

public int intTest( int intA )
{
	Return intA;
}

Java
public string strTest( int intA )
{
	Return intA + "";
} 

public int intTest( int intA )
{
	Return intA;
}


위 두 예제의 차이가 몰까?
얼핏 보면 차이가 없어보이지만 자바는 에러가 납니다.

 
3. 리턴타입을 통한 오버라이딩
리턴타입에 따른 오버라이딩은 매우 유용합니다.
위 예제는 대체할수 있는 다른 메소드가 있으니 상관 없지만 배열을 관리하는 클래스를 만든다던가 할때 유용합니다.

public int[] GetData()
{
	int[] intA = new int[10];
	Return intA;
} 

public int GetData()
{
	int[] intA = int[10];
	 Return intA[0];
}

닷넷 에서는 이게 가능하지만 자바에서는

public int[] GetData( )
{
	int[] intA = new int[10];
	Return intA;
}

public int GetData( Boolean boolDummy )
{
	int[] intA = int[10];
	Return intA[0];
}


이런 해괴한 모양이 됩니다.

 
4. 유용성
위의 예제는 간단해서 적당한 파라매타만 추가하면 문제 없이 사용할수 있습니다.
하지만 구조체로 리턴받는 메소드와 배열로 리턴받는 메소드를 같이 만들경우에는 더미를 붙이던가 다른 이름으로 만들어야 하는 불편함이 있습니다.
왜 자바에서는 리턴값이 다른건 오버로딩인 안되는 걸까요...흠....

머 물론 닷넷의 경우도 저런식의 오버로드를 피해야 할때가 있습니다.
어느것을 호출했는지 명확하지 않을때 인데요. 대표적인 경우가 리턴이 정수형과 문자열형인 경우 +연산자를 사용 할때입니다. 덧샘을 하려는건지 문자열에 합치려는건지 호출이 애매해지니까요 ㅎㅎ
물론 이럴때는 호출형식을 명시하면 별문제가 없습니다.

언젠가는 자바에서 이기능을 지원하지 않을 까요? ㅎㅎ