자바 기초부터 차근차근...(7)
※ Chapter06 메소드와 변수의 스코프
※ 본문은 윤성우의 열혈JAVA를 정리한 글입니다.
※ 문제가 될시 비공개 처리하겠습니다.
이번 장에서는 예제보다 정의관련한 글이 더 많을 수 있다.
메소드에 대해 알아볼 예정이다
§ 메소드에 대한 이해와 메소드의 정의
-main 메소드에 대해서 우리가 아는 것과 모르는 것-
main이 메소드이고 이 메소드는 클래스의 내부에 존재해야 한다.
다음 코드를 보면서 우리가 아는 것과 모르는 것을 정리해보자.
public static void main(String[] args) {
int num1 = 5;
int num2 = 7;
System.out.println("5 + 7 = " + (num1 + num2));
}
아는 것은 다음 두 가지 정도로 정리 된다. (지금까지 배운 내용에 의하여)
▷ 메소드의 이름은 main이다.
▷ 메소드의 중괄호 내에 존재하는 문장들이 순차적 실행된다.
모르는 것은 다음과 같다.
▷ public, static 그리고 void가 왜 붙어있고 의미하는 바는?
▷ 이름은 왜 항상 main인가?
▷ String[] args는 무엇인가?
이중에서 public ,static은 우선 '그냥 붙어져야 하는 키워드' 정도로 기억한다.
(나중에 자연스럽게 알게 되기 때문에 미리 알지 않아도 된다.)
■ 다른 이름의 메소드를 만들어보자.
"자바 프로그램은 main이라는 이름의 메소드에서부터 시작을 한다."
따라서 추가로 만들게 될 메소드의 이름은 다음과 같이 직접 결정하면 된다.
publi static void hiEveryone(int age) {
System.out.println("좋은 아침입니다.");
System.out.println("제 나이는" + age + "세 입니다.");
}
위와 같은 코드 내용을 '메소드 정의'라 한다. 즉 '메소드 hiEveryone의 정의'이다.
이제 예제를 통해 메소드를 어떻게 실행시키는지 확인해보자.
hiEveryone(12); // 메소드 hiEveryone를 호출하는 문장.
즉 age 값이 12인 메소드 hiEveryone을 호출하는 문장이다.
메소드의 실행을 명령하는 문장을 가리켜 '메소드 호출문'이라 한다.
heEveryone(int age)에서 int age처럼 메소드 호출 시 전달되는 값을 받기 위해
선언된 변수를 가리켜'매개변수'라 하며, 다음과 같은 특징을 지닌다.
▷ 메소드 호출 시 선언되어, 전달되는 값을 저장한다.
▷ 매개변수가 선언된 메소드 내에서만 유효한 변수이다.
그리고 정의된 메소드는 여러 번 호출이 가능하며 메소드 정의 순서는 상관없다.
(main보다 먼저도 가능하고 늦게도 선언 가능하다.)
매개변수가 존재하지 않는 메소드도 존재할 수 있다.
다음 예제를 보자.
메소드를 호출할 떄에는 예제와 같이 매개변수의 수와 자료형이 일치하는 값을 전달해야 한다.
그리고 값의 전달이 불필요한 경우에는 메소드의 매개변수 선언을 생략할 수 있다.
■ 값을 반환하는 메소드
예제를 먼저 보자.
main 이라는 이름 왼편에 void 라는 키워드가 존재하는데 이는 다음의 의미를 지닌다.
" 이 메소드는 값을 반환하지 않는다. "
이렇듯 메소드의 이름 왼편에는 '메소드가 반환하는 값의 자료형 정보' 를 삽입하게 되어 있다.
adder와 square는 각각 int 와 double이 위치하고 있다. 이는 다음과 같다.
"adder 메소드는 int형 값을 반환합니다."
"square 메소드는 double형 값을 반환합니다."
값의 반환을 명령하는 명령어는 return 명령어이다.
result = adder(4,5); -> (return 값에 의해 adder(4,5)가 9가 됨) result = 9;
키워드 return이 지니는 두 가지 의미는 다음과 같다.
▷ 메소드를 호출한 영역으로 값을 반환
▷ 메소드의 종료.
따라서 메소드 중간에서 return문이 실행되면 값이 반환되면서 메소드의 실행은 종료가 된다.
void로 선언된 메소드 내에서도 값의 반환이 아닌 메소드의 종료를 목적으로 return문을 사용할 수 있다.
§ 변수의 스코프
변수의 스코프란 임의의 변수에 대한 '변수의 접근 가능 영역' 또는
'변수가 소멸되지 않고 존재할 수 있는 영역'을 의미한다.
지금까지 중괄호가 사용되었던 때를 정리해보면 다음과 같다.
▷ if문 또는 if~else문에서 사용되었다.
▷ 다양한 반복문과 switch문에서 사용되었다.
▷ 메소드의 몸체 부분을 감싸는 용도로 사용되었다.
중괄호로 특정 영역을 감싸면, 해당 영역은 변수에 관한 별도의 스코프를 형성한다.
예를들어 다음과 같이 선언된다면.
if(...) {
int num = 5;
....
}
이 변수 num은 중괄호 내에서만 접근이 가능하며, 중괄호를 벗어나는 순간 소멸된다.
다음예제를 살펴보자.
변수 num1 = 11; 로 4항에 선언되었다.
이 변수를 감싸는 것은 main 메소드 인데, 이후 if 안에서 int num1 = 22; 로 선언을 하게되면
추가로 선언하게 되는것이므로 에러가 발생한다.
또한 num2는 중괄호안에 별도의 영역으로 선언되었다.
이후 num2는 선언된 중괄호 안에서만 사용이 가능하며 중괄호를 빠져나온 뒤에는 소멸되기 때문에
그 변수값을 이용하지 못하므로 맨 밑에 주석을 해제하면 컴파일 오류가 발생한다.
for(int num = 1; num < 5; num++) {
// 변수 num의 접근 가능 영역, 이외에는 num 접근 불가, 추가로 변수 num 선언 불가
}
중괄호 내에 선언된 변수들을 가리켜 "지역변수(Local Variable)"이라고 한다.
한마디로 정리하자면 다음과 같다.
"지역변수는 선언된 지역을 벗어나면 메모리 공간에서 소멸된다."
§메소드의 재귀 호출
처음에 이 재귀호출을 접근하면 어려움이 있을 수 있다.
하지만 자주 사용되기도 하고 용이한 문법이므로, 천천히라도 배워두는것이 좋다.
고등학교 수학에서 접하는 팩토리얼(Factorial)은 기호 !으로 표현한다.
재귀 호출도 다음과 같은 방식을 따른다
5! = 5 x 4 x 3 x 2 x 1
4! = 4 x 3 x 2 x 1
이는 다음과 같이 쓸 수 있다.
5! = 5 x 4!
4! = 4 x 3!
...
이를 수학의 함수식으로 정의하면 다음과 같다.
f(n) = nxf(n-1) n>=2 (n=1 인경우, f(n) = 1)
이제 예제를 살펴보자.
만일 이해가 가지 않는다면, 본서를 참고하자.
(그림으로 자세하게 설명되어 있다.)