본문 바로가기
JAVA/객체지향

자바 함수 정의, 호출 방법과 스택 메모리란?

by 스코리아 2023. 8. 7.

안녕하세요. 스코리아입니다.

자바를 공부하다 보면 함수, 메서드, 인스턴스, 멤버변수(인스턴스변수), 매개변수, 객체 등 다양한 용어를 접하게 됩니다.

각각의 정의를 명확하게 알고 어떤 경우에 사용하는지 파악하면, 보다 쉽게 코딩이 가능합니다.

 

오늘은 함수에 대해서 자세히 알아보겠습니다.

 

우선, 함수 (Function)란 무엇일까요?

  • 하나의 기능을 수행하는 일련의 코드
  • 구현된(정의된) 함수는 호출하여 사용하고 호출된 함수는 기능이 끝나면 제어가 반환됨 (반환되는 값이 있을 수도 있고 없을 수도 있음)
  • 함수로 구현된 하나의 기능은 여러 곳에서 동일한 방식으로 호출되어 사용할 수 있음

 

이제 함수를 정의해 봅시다!

함수는 이름, 매개 변수, 반환 값, 실행되는 몸체로 구성됩니다.

예를 들면, n1과 n2를 더하는 함수를 만들고 싶다면 아래와 같이 작성할 수 있습니다.

// add 함수 정의
int add(int n1, int n2) {
	int result = n1 + n2;
	return result;
}

여기서 int는 반환값의 형을 의미합니다. 그리하여 위 코드의 경우, 숫자 간의 덧셈이기 때문에 숫자를 반환해야 하므로 int 형으로 return 됩니다.

만약 return (반환값) 없이, 함수 안의 몸체만 실행되게끔 하려면, int 대신 void를 사용하는 방법이 있습니다.

또한 위 코드에서 'add'는 함수의 이름이며, 'int n1'과 'int n2'에서 n1, n2 변수는 각각 매개변수라고 호칭합니다.

// 메인 함수
int num1 = 1;
int num2 = 3;

int sum = add(num1, num2);
System.out.println(sum); // 4

위에서 보듯이, 우리는 add(num1, num2) 으로 add 함수를 호출할 수 있었습니다.

add 함수가 호출되면 n1 값에 1이 지정되고, n2 값에 3이 지정되어, result = 1+3 이 계산된 값인 4가 return 됩니다. 그 후, sum 변수에 4라는 값이 저장 되고, 이를 출력하는 print 문을 찍었습니다.

 

 

함수의 호출과 스택 메모리 (짱중요!)

  • 스택(Stack): 함수가 호출될때 지역 변수들이 사용하는 메모리
  • 함수의 수행이 끝나면 자동으로 반환되는 메모리
  • 어휘적인 측면에서 봤을때 '스택'이라 하면, 아래서부터 순차적으로 쌓이는 것이라고 의미할 수 있습니다.
  • 아래 사진은 위에서 설명드린 예제를 기반으로 한 스택 메모리 구조입니다.

  1. 먼저 main()함수가 사용할 메모리 공간이 스택에 생성되는데, 위의 예제에서 볼 수 있듯이, 메인 함수에 있는 num1, num2, sum 변수들의 메모리 공간이 스택에 형성 되었습니다.
  2. 그 후, main() 함수에서 add() 함수를 호출합니다.
  3. add() 함수가 사용할 메모리 공간인 n1, n2, result 를 스택에 저장합니다.
  4. add() 함수 수행 후, 사용한 메모리 공간은 자동으로 삭제됩니다. (n1, n2, result 삭제)
  5. main()함수로 돌아와서, sum 변수에 결과값을 저장합니다.
  6. sum 값이 print 된 후, main() 함수가 종료되면, num1, num2, sum 의 메모리 공간도 자동으로 삭제됩니다.

함수가 호출될때 스택 메모리 구조가 어떻게 흘러가는지 알아봤습니다.

다른 블로그에서 이와 관련된 내용을 설명하는 것을 보았는데, 스택 예제 코드의 변수 이름과 예제 그림의 변수 이름이 매칭되지 않는 부분을 보고, 해당 내용을 바로 잡고 싶어서 자세히 설명드렸습니다! 하하:)

 

 

다음 포스팅은 자바의 메소드와 인스턴스, 힙메모리에 대해서 알아보겠습니다.

읽어주셔서, 감사합니다:)