본문 바로가기

Programming/Java

[JAVA] 오버로딩, 재귀함수

오버 로딩이란

예를 들어 덧셈을 필요로 하는 2개의 매개변수를 가진 메서드(add)를 정의해서 main메서드에서 

호출했다고 가정해보자

어떤 사람은 int+int를 원하는 분이 있었는데

어떤 사람은 double+double을 원하는 사람이 생겼다

그래서 double+double을 가진 add2메서드를 정의했고

또 어떤 사람은 int+int+int덧셈을 필요로 하는 사람이 생겨

int+int+int덧셈 메서드를 add3으로 만들어줬다

이런 방법으로 한 100여 가지를 만들었다고 가정해보자

호출을 할 때 어떤 메서드를 필요로 하는지 혹시 호출하는 사람은 알 수 있을까?

절대 모른다 뭐 기억력이 좋아서 알 수도 있겠지만 다른 사람이 코드를 사용한다고 했을 때

하나하나 올려서 변수명을 확인하고 출력해야 할 것이다.

이런 문제점을 해결하기 위해 똑같은 이름으로 매개변수 타입과 개수, 반환 타입이 다르게 정의했을 때

이를 자바에서는 오버 로딩이라고 간주해 가능하게 만들었다

즉 중복 정의가 가능하다는 말이다

우선 코드를 보겠다. 

		public static void main(String[] args) {
			add(10.0, 11.2);
		}
		public static int add(int a, int b) {
			return a+b;
		}
		public static int add(int a, int b, int c) {
			return a+b+c;
		}
		public static void add(double a, double b) {
			System.out.println(a+b);
		}
		public static double add(int a, double b) {
			return a+b;
		}
		public static double add( double b, int a) {
			return a+b;
		}

이렇게 메서드를 정의했을 때 호출하는 입장에서 어떤 타입 덧셈의 메서드를 필요로 하는지 생각 안 하고 

add메서드로 통일할 수 있을 것이다. 

오버 로딩이란 중복 정의이다. 대신 전제조건이 있다 전제조건을 잘 생각해서 메서드를 만들 때 참고하면 된다.

 

재귀 함수

함수가 직접 또는 간접적으로 자신을 호출하는 프로세스를 재귀 함수라고 합니다

즉 메서드 호출을 자기 메서드를 호출하는 거다

코드를 보면서 이어나가겠습니다.

	public static void func() {
		System.out.println("안녕하세요!~~");
		func(); //본인 안에 본인이 호출	
	}
	public static void main(String[] args) {
		func();
	}

func라는 메서드를 하나 만들었고  메서드 안에 "안녕하세요!~~"를 출력하는 코드와

바로 아래 보면 자기 자신을 호출하는 코드를 정의하였다

그리고 main메서드에서 func() 메서드를 호출하면 계속 돌 것이다. 그러다가 보면

이렇게 stackOverflowError가 나올 것이다.

stackOverflowError란 간단히 설명하면 JVM에서 스레드 stack의 공간이 부족할 때 생기는 현상입니다.

계속 반복하다가 공간이 없다고 말해주는 겁니다.

 

이렇듯 재귀 함수를 만들면 오류가 난다.그래서 재귀함수를 만들면 종료 조건이 무조건 필요하다.

	public static void main(String[] args) {
		printNum(1234); 
	}
	public static void printNum(int num) {
		if(num/10!=0) {	//종료조건
			printNum(num/10);
		}
		System.out.print(num%10+" "); 
	}

간단하게 코드를 작성해봤다.

printNum메서드를 정의해서 1234 값을 넣어준 뒤 1 2 3 4를 출력하게 하는 재귀 함수이다.

종료 조건을 달아줬기 때문에 이 메서드는 1 2 3 4를 출력하고 멈추게 될 것이다. 이렇듯 

재귀 함수에는 꼭 종료 조건을 만들어 줘야 한다.