-
[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); } }
'Java > Basic' 카테고리의 다른 글
[Java_Basic]패키지와 클래스 패스(윤성우의 열혈 Java 프로그래밍) (0) 2020.12.30 [Java_Basic]클래스와 인스턴스(윤성우의 열혈 Java 프로그래밍) (0) 2020.12.26 [Java Basic]실행 흐름과 컨트롤(윤성우의 열혈 Java 프로그래밍) (0) 2020.12.23 [Java_Basic]연산자(윤성우의 열혈 Java 프로그래밍) (0) 2020.12.16 [Java_Basic]상수와 형 변환(윤성우의 열혈 Java 프로그래밍) (0) 2020.12.15