ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java_Basic]메소드와 변수의 스코프(윤성우의 열혈 Java 프로그래밍)
    Java/Basic 2020. 12. 26. 23:45

    메소드 

    기능을 갖고 있는 아이.

     

    자바 프로그램은 main이라는 이름의 메소드에서부터 시작을 한다.

    class MethodDef{
    	public static void main(String[] args){
    		System.out.println("프로그램의 시작");
    		hiEveryone(12);
    		hiEveryone(13);
    		System.out.println("프로그램 종료");
    	}
    
    	public static void hiEveryone(int age){
    		System.out.println("좋은 아침입니다.");
    		System.out.println("제 나이는" + age + "세 입니다.");
    	}
    }

    main 메소드 안의

    hiEveryone(12);, hiEveryone(13); 는 hiEveryone 메소드를 호출한다.  12와 13은 매개변수이다. (int age)

    메소드는 출력이 있을수도 있고, 없을 수도 있다. 입력 또한 있을수도 없을 수도 있다.

    class Method2Param{
    	public static void main(String[] args){
    		double myHeight = 175.9;
    		hiEveryone(12,12.5);
    		hiEveryone(13,myHeight);
    		byEveryone();
    	}
    
    	public static void hiEveryone(int age, double height){
    		System.out.println("제 나이는 " + age + "세 입니다.");
    		System.out.println("저의 키는 " + height + "cm 입니다.");
    	}
    
    	public static void byEveryone(){
    		System.out.println("다음에 뵙겠습니다.");
    	}
    }

    hiEveryone(13,myHeight) 에서 매개변수로 myHeight = 175.9 라는 값이 출력되었다.

    두 개의 값 이상을 인자로 받을 수 있도록 정의할 수 있다.

    byEveryone(); 처럼 매개변수가 없이 사용할 수도 있다. 이를 호출할 때 또한 전달 값이 없어야한다.

     

    class MethodReturns{
    	public static void main(String[] args){
    		int result;
    		result= adder(4, 5);
    		System.out.println("4 + 5 = " + result);
    		System.out.println("3.5 x 3.5 = " + square(3.5));
    	}
    
    	public static int adder(int num1, int num2){
    		int addResult = num1 + num2;
    		return addResult;
    	}
    
    	public static double square(double num){
    		return num * num;
    	}
    }
    

    main 메소드 옆의 void 의 의미는 

    '이 메소드는 값을 반환하지 않는다'

    adder 와 square 메소드 옆에는 int와 double 이 적혀있다 

    이는

    adder메소드는 int형 값을 반환한다.

    square 메소드는 double 형 값을 반환한다.

     

    return addResult;

    return 은 값의 반환을 명령하는 키워드이다.

    여기서는 값을 반환하고, addResult에 저장된 값을 반환하라 를 뜻한다.

     

    class OnlyExitReturn{
    	public static void main(String[] args){
    		divide(4,2);
    		divide(6,2);
    		divide(9,0);
    	}
    
    	public static void divide(int num1, int num2){
    		if(num2 == 0){
    			System.out.println("0으로 나눌 수 없습니다.");
    			return;	//값의 반환 없이 메소드만 종료
    		}
    		System.out.println("나눗셈 결과 : " + (num1/num2));
    	}
    }

    위에서 보듯이 return은 메소드의 마지막이 아닌 중간에서 등장할 수도 있다.

    return은 메소드의 종료를 의미하기도 한다. 

    마지막 문장에서 값의 반환 없이 메소드가 종료되었다는 것을 알 수 있다.

     

    변수의 스코프

    임의의 변수에 대한 '변수의 접근 가능 영역'을 의미. 

     

    지역변수

    중괄호 내에 선언이 되면 '지역변수' 이다. (if,if ~else, switch, 메소드 몸체 감싸는 용도)

    중괄호를 빠져나가는 순간 소멸되어버린다.

    class LocalVariable{
    	public static void main(String[] args){
    		boolean ste = true;
    		int num1 = 11;
    
    		if(ste){
    		//	int num1=22;
    			num1++;
    			System.out.println(num1);
    		}
    
    		{
    			int num2 = 33;
    			num2++;
    			System.out.println(num2);
    		}
    
    	//System.out.println(num2);
    	}
    }

    if 안에서 int num1 은 이미 전역변수 num1 이 선언되어 있기에 다시 선언이 불가하다.

    반면 int num2는 메소드 안에서 선언이 되었음에도 괄호 밖을 빠져나온 뒤의 print에서 사용이 불가하다. 소멸되었다.

    for(int num = 1; num<5; num ++){
    
    }

    위에서 for문안에서 선언된 num 또한 지역변수이다. for 문 밖에서는 사용할 수 없다. 

     

     

    메소드의 재귀 호출

    팩토리얼 연산

    5! = 5 * 4 * 3 * 2 * 1

    5! = 5 * 4!

     

    n! = n * (n-1)!

     

    f(n)= n*f(n-1)(n>=2)  (n=1 일때는 1)

    함수 안에 함수가 삽입되어 있다.

    자바는 메소드의 재귀를 지원한다. 즉 메소드 몸체 부분에 해당 메소드의 호출문을 삽입할 수 있다.

    class ReculFactorial{
    	public static void main(String[] args){
    		System.out.println("3 factorial: " + factorial(3));
    		System.out.println("12 factorial: " + factorial(12));
    	}
    
    	public static int factorial(int n){
    		if(n ==1)
    			return 1;
    		else
    			return n * factorial(n-1);
    	}
    }

    댓글

Designed by Tistory.