클래스안에서 사용되는 함수(function)의 일종인 메서드를 만들기 위해 함수의 개념과 함수의 구조, 그리고 호출될 때 사용되는 메모리에 대해서 배워보도록 하겠습니다.

 


함수란?

함수(function)

  • 함수는 다른 프로그램 언어들에도 많이 사용되는 개념으로 하나의 기능을 구현 하는 일련의 코드를 뜻합니다. 함수의 길이와는 상관없이 하나의 기능만을 합니다.
  • 함수로 구현된 기능은 필요한 여러곳에서 호출되어서 사용됩니다. 예를 들어 더하기라는 함수가 있다면 거리를 더하던 숫자를 더 하던 성적을 더하던 더하기라는 한 기능을 여러 곳해서 호출해서 사용하게 됩니다..
  • 그렇기 때문에 재사용이 가능하고, 기능이 분리되어서 작성 되기 때문에 가독성이 좋고 이후에 유지 보수하는데 도움이 된다는 장점이 있습니다.

함수의 입력과 반환

  • 입력값 => 함수 => 결과값의 구조로 되어 있으며 함수에 따라서 입력값이나 반환값이 없을 수 도 있습니다.
  • Java에서는 입력값을 매개변수, 결과값을 반환값이라고 부릅니다.

 

함수 정의 하기

  • 함수는 이름, 매개변수(입력값), 반환 값(결과 값), 함수 몸체(body)  4가지로 구성되지만 매개변수와 반환 값은 경우에 따라 생략 될 수 있습니다.
  • 다음은 더하기 함수 예시이고 아래에 각 항목별 설명을 괄호로 붙여봤습니다.

더하기 함수 예시

 

int(반환하는 결과값의 자료형 없을시 void) add(함수명)(int num1, int num2)(자료형 매개변수1, 자료형 매개변수2)

{

 

      int result;                   ( 함수 몸체 )

      result = num1 + num2 (  body      )

      return result; (반환값)

}

 

실습

public class FunctionTest {
	//function 1
	public static int addNum(int num1, int num2 ) {
		int result;
		result = num1 + num2;
		return result;
	}
	//function 2
	public static void sayHello(String greeting) {
	
		System.out.println(greeting);
	}
	//function 3
	public static int calSum() {
		int sum = 0;
		int i;
		
		for (i = 0 ; i<=100; i++) {
			sum+= i;
		}
		return sum;
	}
	
	public static void main(String[] args) {
		// call function1 
		int n1= 10;
		int n2= 20;
		
		int total = addNum(n1,n2);
		System.out.println(total);  // result = 30
		// call function2
		sayHello("안녕하세요"); // result = 안녕하세요
		// call function3 
		int num = calSum();
		System.out.println(num); // 5950

	}

}
  • function1은 addNum 함수로 num1, num2에 매개변수를 입력하여 int result의 반환값을 내보내는 함수입니다.
  • function2는 String 매개 변수를 출력해주는 함수로 반환값이 없어 void라고 써줍니다.
  • function3은 1~100 까지 더하는 함수로 매개변수는 없고 반환값이 int인 함수입니다.
  • 함수는 기능이고 자체 출력이 되지 않기 때문에 호출해서 사용해야 합니다. main에 3가지 함수를 호출해서 알맞은 함수명과 알맞은 매개변수를 괄호안에 넣으면 함수기능에 따라 결과값을 출력합니다.

매서드(method)

  • 메서드는 객체의 기능을 구현하기 위해 클래스 내부에서 구현되는 함수를 뜻합니다. 즉, 메서드를 구현함으로 객체의 기능이 구현되게 됩니다.
  • 메서드의 이름은 사용하는쪽(클라이언트 코드)에 맞게 명명하는게 좋은데 예를들어 학생의 이름을 불러오는 메서드를 만든다다면 getStudentName이라고 짓는 것을 뜻합니다. (서버쪽 입장에서 생각해보면 sendStudnetName이 될 수도 있기 때문입니다.)
  • 또한 함수명은 Camel Notaion에 맞게 시작은 소문자로 하여 단어가 바뀔 때 마다 대문자를 사용해주는게 좋습니다.

 

함수와 메모리

public class FunctionTest {
	//function 1
	public static int addNum(int num1, int num2 ) {
		int result;
		result = num1 + num2;
		return result;
	}

	
	public static void main(String[] args) {
		// call function1 
		int n1= 10;
		int n2= 20;
		
		int total = addNum(n1,n2);
		System.out.println(total);  // result = 30
	
	}

}
  • 함수에서 사용되는 메모리는 짐이 쌓여있는 모양의 스택메모리라고 하여 먼저 들어가는것 아래로 쌓이고 사용할때는 위에서부터 꺼내서 사용하는 메모리입니다.
  • 위 예시에 메모리 사용을 생각해 보면, 먼저 메모리에 main 함수가 들어가 있고 함수 안에 포함된 지역변수(함수내에서만 사용되는 변수) args[], n1=10, n=20가 포함되어 있습니다.
  • 그 상태에서 addNum을 호출하면 main함수 위에 addNum이 메모리에 잡히게 되고 그 변수인 num1; num2; result;도 함께 메모리에 잡히게 됩니다.
  • addNum 함수가 호출되는 순간 main에 있던 n1의 값10이 num1으로 넘어가 대입되고 num2 값도 넘어가게 됩니다. 
  • 그 후 addNum이 리턴되고 수행이 끝나게 되면 메모리에는 main함수 부분만 남고 addNum은 메모리에서 사라집니다. (함수는 사용 후 메모리를 반환합니다.)

+ Recent posts