#12. 함수와 메소드에 대해 알아보자!
안녕하세요! 하프입니다😋
저번 글에서 클래스에 대해 알아보았는데요, 클래스의 기능을 구현하기 위해서는 메소드가 필요하죠! 이번 글에서는 메소드가 무엇인지, 어떻게 선언하고 사용할 수 있는지 알아보도록 할게요!
이 글은 <Do it! 자바 프로그래밍 입문> 책을 읽고 이해한 내용을 바탕으로 작성되었습니다😉
1. 함수가 뭔가요?
메소드는 함수의 한 종류입니다. 함수는 '하나의 기능을 수행하는 일련의 코드' 라고 하는데요, 예를 들어 두 숫자를 더하는 서로 다른 세 가지 경우가 있을 때(가장 좋은 성적 둘을 더한다, 두 거리를 더한다 등...), 두 숫자를 더하는 부분만 함수로 만들어서 더하기 기능이 필요할 때마다 함수를 호출해서 사용할 수 있는 것이죠!
함수는 이름과 입력 값, 결과 값을 갖습니다. 위에서 예시로 든 '두 수를 더하는 함수'를 그림으로 나타내 볼게요!
이런 구조입니다.두 수를 입력받은 뒤, 더하기 함수에서 두 수를 더하고 더한 값을 출력하는 것이죠!
간단히 코드 형태로 나타내면 이런 식입니다. num1과 num2를 입력받고, add 함수에서 result = num1 + num2를 수행한 뒤 result를 반환합니다. 이렇게 함수를 수행한 후 결과로 되돌려 주는 값인 result를 '반환 값'이라고 부른답니다!
2. 함수를 정의해봅시다!
함수를 실제 코드로 작성해서 정의해볼게요! 이름이 add인 함수를 정의하겠습니다.
int add(int num1, int num2) {
int result;
result = num1 + num2;
return result;
}
add는 함수의 이름, add 옆의 (int num1, int num2)는 매개변수입니다. 덧셈을 수행하기 위해서는 더할 두 숫자가 필요한데, 이렇게 함수 내부에서 사용할 괄호 안의 변수를 매개변수라고 합니다! 매개변수가 필요없는 함수도 있는데, 이때는 괄호 안을 비워두면 됩니다.
add 함수를 수행한 결과 값은 변수 result에 저장되는데, 함수의 결과값을 반환하는 예약어가 return입니다. return을 사용해서 result 값을 반환하는 것이죠! 반환 값의 자료형은 반환형이라고 하는데, 함수 이름 왼쪽에 있는 int가 반환형입니다! 반환 값이 없는 함수도 있는데, 이럴 때는 반환형 자리에 void를 쓰면 됩니다. void는 반환할 값이 없다는 예약어입니다. return 예약어는 함수 수행을 끝나고 나서 호출한 곳으로 되돌아갈 때도 사용할 수 있는데, 이때는 return; 을 적으면 됩니다. 반환 값을 적지 않는 것이죠!
함수를 사용하는 것을 '함수를 호출한다'고 합니다. 함수를 호출해볼까요?
add 함수를 구현하고, 8번째 줄의 sum에서 add 함수를 호출했습니다! add(num1, num2)는 add 함수의 매개변수인 n1, n2에 각각 num1과 num2를 대입한다는 뜻입니다.
3. 함수 호출과 스택 메모리
함수가 수행될 때 컴퓨터의 메모리를 어떻게 사용하는지 살펴볼게요! 어려운 내용이지만 중요하기 때문에 꼭 이해해야 하는 부분이라고 합니다!
함수를 호출하면 그 함수만을 위한 메모리 공간이 할당되는데, 이 메모리 공간을 스택이라고 합니다. 함수가 사용하는 스택 메모리 구조를 그림으로 확인해볼게요!
함수가 호출되면 그 함수가 사용할 메모리 공간이 스택에 생성됩니다. 프로그램을 시작하면 main() 함수부터 호출하기 때문에 main() 함수에 포함된 변수 num1, num2, sum을 저장할 메모리 공간이 먼저 생성됩니다. 그리고 main()에서 add() 함수를 호출하면 add() 함수를 저장할 메모리 공간이 스택에 새롭게 생성됩니다.
add() 함수의 수행이 끝나고 결과 값이 반환되면, add() 함수가 사용하던 메모리 공간은 자동으로 사라집니다. 여러 함수를 사용하는 경우에는 함수를 호출한 순서대로 메모리 공간이 만들어지고, 맨 마지막에 호출한 함수부터 반환됩니다. 따라서 메모리 공간도 맨 마지막 함수가 사용한 메모리부터 사라지는 것이죠! A - B - C 순서대로 함수를 호출했다면, 스택 메모리 소멸과 결과 반환은 C - B - A 순서로 이루어집니다.
그리고, main() 함수에서 사용하는 num1, num2 변수와 add() 함수의 n1, n2 변수는 서로 다른 메모리 공간을 사용하기 때문에 이름이 같아도 상관이 없습니다. 이렇게 함수 내부에서만 사용하는 변수를 지역 변수라고 해요😆
@@ : 함수 너무 복잡해요... 이렇게 복잡한 걸 왜 사용해요?
😋 : 함수를 사용하면 기능을 나누어 코드를 효율적으로 구현할 수 있습니다. 또한, 기능별로 함수를 구현해 놓으면 같은 기능을 매번 코드로 만들지 않고 함수를 호출해서 사용할 수 있기 때문에 중복되는 코드를 줄일 수 있습니다! 함수를 사용하면 프로그램의 오류를 수정하는 디버깅 작업을 할 때도 편리해요!
+ 함수에는 그 이름에 맞는 하나의 기능을 구현하는 것이 중요합니다. 여러 기능을 한꺼번에 넣어버리면 함수의 장점을 제대로 활용할 수 없어요😓
4. 메소드를 구현해보자!
함수에 대해서 쭉 알아봤으니 이제 메소드를 구현해볼까요? 메소드는 클래스 내부에서 사용하는 멤버 함수입니다. 메소드는 함수에 객체 지향 개념이 포함된 용어로 이해하시면 좋을 것 같아요! Student 클래스에 메소드를 직접 구현해볼까요?
학생 이름(studentName)을 반환하는 메소드를 만들었습니다. 메소드 이름은 해당 클래스를 사용하는 코드의 입장에서 짓는 것이 좋은데요, 예를 들어 Student 클래스를 사용하는 A 클래스에서 학생의 이름(studentName)을 가져오는(get) 기능을 제공하는 메소드 이름은 getStudentName으로 짓습니다. studentName을 반환하기 때문에 studentName의 자료형인 String이 반환형이 된 것이구요!
이번에는 studentName의 값을 지정하는(set) 기능을 제공하는 setStudentName() 메소드를 만들었습니다! 이름을 전달받아 studentName에 저장하는 것이기 때문에 String형의 매개변수 name이 필요합니다. 반환 값은 없기 때문에 반환형은 void가 됩니다!
5. 자바에서 이름을 짓는 규칙?
자바에 이름을 짓는 규칙이 있는 것은 아니지만, 클래스 이름은 대문자로 시작합니다. 하나의 자바 파일에 클래스가 여러 개 있을 수 있지만 public 클래스는 단 하나이고 public 클래스와 자바 파일의 이름은 같아야 합니다. 패키지의 이름은 모두 소문자로 만들고, 변수와 메소드 이름은 소문자로 시작하지만 이름이 길어지면 중간에 새 단어로 바뀔 때마다 대문자를 써 줌으로써 가독성을 좋게 합니다. (위에서도 setStudentName으로 썼죠!) 이렇게 이름 짓는 방법을 낙타 표기법이라고 부른다네요!
지금까지 함수와 메소드에 대해 알아보았습니다! 함수... 처음 배우는 사람에게는 너무 복잡하고 어려운 개념이죠 ㅠㅠㅠ 그래도 여기까지 자바 공부를 열심히 하신 분들, 정말 대단하다는 말씀을 드리고 싶어요! 자바는 이제 시작이니 더 열심히 불태워봅시다🔥 다음 글에서는 클래스와 인스턴스에 대해 알아보도록 할게요!