Java/Basic

[Java_Basic]메소드와 변수의 스코프(윤성우의 열혈 Java 프로그래밍)

bangle0621 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);
	}
}