basicJAVA/5. Oop

201023 재귀호출, 매서드 오버로딩

unemo 2020. 10. 23. 18:24
반응형

 

10. 재귀호출(recursive call) 
  - 메서드 내에서 메서드 자기자신을 다시 호출하는 것. 
  4! < 팩토리얼 = 4*3*2*1 
  이걸 반복문으로 하면 쉽지만 이제 메서드로 만들어볼거임 
 FactorialTest

package e_oop;

public class FactorialTest {
	public static void main(String[] args) {
		
		
		int result = factorial(1000);
		System.out.println(result);
		
		
	}
	
	static int factorial(int num){
		
		int result = 0;
		if(num==1){
			result = 1;
		}else{
			result = num*factorial(num-1);
		}
		
		return result;
	}
	
}

 

문제점 : 콜스택이 너무많이 쌓임 (stackOverflow) 

 

public class FactorialTest {

팩토리얼테스트가 메소드 아레아에 로드된다. 클래스메서드인 main()과 factorial(int)도 로드된다

public static void main(String[] args) {

메인메소드가 콜스택에 호출된다.

int result = factorial(5);

대입연산자니까 왼쪽부터, 메인메소드에 지역변수 result가 선언되고, factorial()앞에는 같은 클래스 안의 메소드이기 때문에 FactorialTest. 가 생략된거임. factorial메소드가 인자5 를 가지고 콜스택에 호출한다.

 

static int factorial(int num){

메소드는 매개변수부터 본다 num=5이다.

그리고 매개변수는 매소드의 지역변수니까 num을 콜스택의 factorial(5)의 영역에 선언해준다.

int result = 0;

지역변수 result를 factorial()의 콜스택 영역에 선언해준다 0으로 초기화되었다.

 

num=5이기 때문에

if(num==1){
			result = 1;
		}else{
			result = num*factorial(num-1);
		}

result = 5 * factorial(4)이기 때문에

factorial(4) 메서드가 factorial(5)메서드 도중에 호출되었기 때문에 콜스택의 factorial(5)위에 factorial(4)가 쌓인다.

 

같은 과정 반복해서 콜스택에 factorial(1)까지 쌓여 factorial(1)의 콜스택영역의 지역변수 result가 1이 되고, 메소드가 종료되고 factorial(4)에 리턴값 1이 대입되고, 그런식으로 계산되어 factorial(5)의 리턴문장까지 와서, factorial(5)메서드까지 콜스택에서 사라지고, main()메서드의 지역변수 result에 5*4*3*2*1 결과값이 반환된다.

 


  11. 메서드 오버로딩 (over loading) 
   - 한 클래스 내에 같은 이름의 매서드를 여러개 정의해서 사용하는 것. 
   - println()이 오버로딩의 기본적인 예임 
   - 조건

1. 메서드 이름이 같아야    
2. 매개변수의 갯수 또는 타입이 달라야 한다    
3. 반환타입은 영향을 주지 않는다. 

   - 장점 
    매서드의 이름으로만 구분된다면 모든 메서드의 이름이 달라야 한다. 
    근본적으로 같은 기능을 하는 것인데 다른 이름을 표현되면 기억하기 어렵다.

 

OverTest

package e_oop;

public class OverTest {

	public static void main(String[] args) {
		
	//7.
	int a = Over.add(30);
	
	//8.
	Over over = new Over();
	int b = over.add(20,30);
	
	//9.
	long c = over.add(10,35482L);
	
	//10.
	float d = over.add('A', 3.15F);
	
	
	
	System.out.println(a);
	System.out.println(b);
	System.out.println(c);
	System.out.println(d);
	}

}


class Over{
	
	//1.
	static int a = 20;
	
	//2.
	int b = 15;
	
	//3.
	static int add(int num){
		int hap = a + num;
		return hap;
	}
	
	//4.
	int add(int num1, int num2){
		int hap = num1 + num2;
		return hap;
	}
	
	//5.
	long add(int num1, long long2){
		long hap = num1 + long2;
		return hap;
	}
	
	
	//6.
	float add(char char1, float float2){
		float hap = char1 + float2;
		return hap;
	}
	
	
	
	
	
	
	
	
}
반응형

'basicJAVA > 5. Oop' 카테고리의 다른 글

201029 생성자  (0) 2020.10.29
201026 생성자  (0) 2020.10.26
201023 매서드의 종류, 클래스멤버와 인스턴스 멤버간 참조호출  (0) 2020.10.23
InterVari  (0) 2020.10.23
201022 MyMathTest  (0) 2020.10.22