오버 로딩이란
예를 들어 덧셈을 필요로 하는 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를 출력하고 멈추게 될 것이다. 이렇듯
재귀 함수에는 꼭 종료 조건을 만들어 줘야 한다.