[필기정리] Day5 - return, 재귀메소드 등

SW/Java

2020. 6. 21. 18:14

#return

- return은 반환값이 없어도 사용가능

  return을 만나는 순간 호출한 곳으로 돌아감   

ex)

class TestReturn
{
	public static void main(String[] args)
    {
        test(3);
    }   
    public static void test(int n)
	{
		if(n==3)
        {
        	return;
            System.out.println(n);	//return 이후이므로 실행되지 않는다
		}
	}
}    

 

#재귀메소드 : 자기 자신을 호출하는 메소드

  ㄴ 일반메소드로 구현이 가능한 것은 일반메소드로 구현하는 것이 더 좋다

      재귀메소드를 계속 자신을 호출하는 형태로 끝낼 경우 메모리 과다 사용되어 에러가 발생하므로

      반드시 끝이 날 수 있는 호출로 써줘야 한다!

ex)

class Ex1
{
	public static void main(String[] args)
    {
        reHi(3);
    }   
    public static void reHi(int n)
	{
		if(n==0) return;
        System.out.println("Hi");
        reHi(n-1);
	}
}

/* 결과 : Hi
		 Hi
         Hi 출력 */

- reHi(n-1); 

  n--로 작성 시 무한반복된다. (호출 시 감소 전 값으로 호출하기 때문!)

  증감연산자를 사용하고 싶을 땐 --n으로 호출할 것1

 

ex)

class Ex2
{
	public static void main(String[] args)
    {
        System.out.println("Start");
        reHi(3);
        System.out.println("End");
    }   
    public static void reHi(int n)
	{
		if(n==0) return;
        System.out.println("Hi");
        reHi(n-1);
        System.out.println("Bye");
	}
}

/* 결과 : Start
		 Hi
         Hi 
         Hi
         Bye
         Bye
         Bye
         End 출력 */

 

Q. Factorial을 재귀메소드로 표현하시오.

A. 

class MTest1
{
	public static void main(String[] args)
    {
        System.out.println(factorial(4));
    }   
    public static void factorial(int n)
	{
		if(n==1) return1;
        else return n*factorial(n-1);
	}
}

 

Q. 1부터 n까지의 합을 재귀메소드로 표현하시오.

A. 

class MTest2
{
	public static void main(String[] args)
    {
        System.out.println(addSum(100));
    }   
    public static void addSum(int num)
	{
		if(num==1) return1;
        else return num+factorial(num-1);
	}
}

       

Q. 정수 n을 전달 받아서, 2의 N승을 계산하여 반환하는 메소드를 재귀 형태로 정의할 것

A. 

class MTest3
{
	public static void main(String[] args)
    {
        System.out.println(mutiplier(2));
        System.out.println(mutiplier(4));
    }   
    public static void mutiplier(int num)
	{
		if(num==1) return2;
        else return 2*mutiplier(num-1);
	}
}

       

Q. 10진수 정수를 전달받아, 전달받은 정수에 해당하는 2진수를 출력하는 메소드를 재귀 형태로 정의할 것

A. 

class MTest4
{
	
    public static void binaryNum(int num)
	{
		int rest=0;
        if(num<=1) System.out.println(num);
        else 
        {
        	rest=num%2;
            binaryNum(num/2);
            System.out.println(rest);
	}
    public static void main(String[] args)
    {
        binaryNum(25);
        System.out.println();
    }   
}

       

Q. 정수 하나를 넘겨주면 그 정수번째의 피보나치수열을 리턴해주는 메소드

    피보나치수열 - ex) 1 1 2 3 5

A. 

class MTest5
{
	
    public static void fibonacci(int i)
	{
        if(i==1||i==2) return1;
        else return fibonacci(i-1)+fibonacci(i-2);
	}	        
    public static void main(String[] args)
    {
        int i=1;
        for(i=1;i<10;i++)
        	System.out.println(fibonacci(i));
    }   
}

 

#클래스 = 멤버변수 + 멤버메소드

ex)

class Number
{
	int num; // 멤버변수
    public void setNum(int n)
	{
        num=n;
    }	        
    public void printCurrentState()
    {
        System.out.println(num);
    }   
}
class NumberMain //반드시 Main클래스가 필요하다
{		        
    public static void main(String[] args)
    {
        Number n1 = new Number(); // 객체 생성방법 : 클래스명 변수명 = new 클래스명();
        n1.setNum(5); // n1은 참조변수 .은 접근 연산자
        n1.printCurrentState();
        
        Number n2 = new Number();
        n1.setNum(10);
        n1.printCurrentState();
        
        Number n3 = null; // null - 아무 것도 가리키는 것이 없다는 의미
        n3=n1; // 주소를 알게 되어 접근이 가능해진다
        n3.printCurrentState();
        n3=n2;
        n3.printCurrentState();
    }   
}

- 참조변수(Reference Variable) : 오브젝트(인스턴스) 접근 시 필요한 물리적 주소를 가리킴 ex) 홍길동 집 주소      

 

- 멤버변수를 직접 초기화 하지 않아도 각 데이터형의 기본값으로 초기화 되어 있다.

  int는 0으로 초기화 되어있다.

 

- 클래스 ex) 자동차설계도면

   오브젝트(인스턴스) ex) 소나타

 

Q.

삼각형 면적 : 삼각형 밑변 * 높이 /2

원의 둘레 : 2*3.14*반지름

면적 : 3.14*반지름*반지름

Q. 클래스 만드는 실습해보기

 

① 삼각형 클래스 만들기.

멤버 변수(인스턴스 변수)

밑변

높이

넓이

 

멤버 메소드(인스턴스 메소드)

삼각형 초기화 하는 메소드

삼각형의 면적 구하는 메소드

삼각형의 현재 상태 출력하는 메소드(밑변, 높이, 넓이 출력)

 

② 삼각형 인스턴스 3개 만들기

1. 밑변 10, 높이 5

2. 밑변 4, 높이 2

3. 밑변 20 높이 10

③ ②에서 만든 삼각형 인스턴스들의 상태값 출력하기(밑변, 높이, 면적)

 

A.

class Triangle	해당 내용 만들어주는 클래스
{	
	double width;
	double height;
	double area;
	
	public void setTriangle(double width, double height)
	{
		this.width=width;
		this.height=height;
	
	}
	public void areaOfTriangle(int n2)
	{
		area=width * height / 2;	
	}
	public void printTriangle()
	{
		System.out.println("밑변"+width);
		System.out.println("높이"+height);
		System.out.println("면적"+area);
	}	
}
class TriangleMain 실행하는 메인 클래스
{
	public static void main(String[] args)
	{
		Triangle t1 = new Triangle();
		t1.setTriangle(10,5);
		t1.areaOfTriangle();
		t1.printTriangle();  

		Triangle t2 = new Triangle();
		t2.setTriangle(4,2);
		t2.areaOfTriangle();
		t2.printTriangle();  

		Triangle t3 = new Triangle();
		t3.setTriangle(20,10);
		t3.areaOfTriangle();
		t3.printTriangle();
	}
} 

 

Q.

원 클래스 만들기

멤버 변수(인스턴스 변수)

반지름

면적

둘레

파이

 

멤버 메소드(인스턴스 메소드)

원 초기화 하는 메소드

원의 둘레 구하는 메소드

원의 면적 구하는 메소드

원의 상태를 출력하는 메소드(반지름, 둘레, 면적)

 

원 인스턴스 3개 만들기

1. 반지름 5

2. 반지름 10

3. 반지름 30

에서 만든 원 인스턴스들의 상태값 출력하기

 

A.

class Circle 
{	
	double radius;
	double area;
	double perimeter;
	final double PI=3.14;
	
	public void setCircle(double radius)
	{
		this.radius = radius;
	}
	

	public void perimeterOfCircle()
	{
		perimeter = 2 * PI * radius;
	
	}
	public void areaOfCircle(int n2)
	{
		area=PI * radius * radius;	
	}
	
	public void printCircle()
	{
		System.out.println("반지름"+radius);
		System.out.println("둘레"+perimeter);
		System.out.println("면적"+area);
	}	
}
class CircleMain
{	
	public static void main(String[] args)
	{
		Circle c1 = new Circle();
		c1.setCircle(5);
		c1.perimeterOfCircle();
		c1.areaOfCircle();
		c1.printCircle();  

		Circle c2 = new Circle();
		c2.setCircle(10);
		c2.perimeterOfCircle();
		c2.areaOfCircle();
		c2.printCircle();
	
		Circle c3 = new Circle();
		c3.setCircle(30);
		c3.perimeterOfCircle();
		c3.areaOfCircle();
		c3.printCircle();
	}
}  	

 

 

       

728x90