I. Java의 method를 왜 여태껏 이렇게 설명하는 데는 없었을까?
자바의 메써드 개념을 1, 2편을 통해 컴퓨터의 메모리 구조와 함께 일거양득으로 개념을 잡을 수 있게끔 설명해보겠다.
메써드를 개론서에는 흔히 함수 또는 명사형의 변수와 달리 액션을 취할 수 있는 동사형의 모듈로 설명하곤 한다. 하지만 그러한 영어 단어의 번역을 위한 이해를 따라가기보다 아래와 같이 더욱 쉽게 표현할 수 있다고 생각한다.
public type_of_y f(x){
return y;
}
메써드에서 값을 전달해주는 매개변수 x는 '파라미터', 즉 함수에서 정의역에 해당된다. 정의역을 위에서 실제 f(x)처럼 정의하지 않고, 자바에서는 f는 메써드명(동사이기 때문에 소문자로 시작)에 해당하며 ( ) 안의 x는 파라미터의 형태(type)와 파라미터명으로 정의한다.
public type_of_y method_name(parameter_type parameter_name){
파라미터 타입은, 다시 말해 정의역 x의 형태는 자바에서의 변수와 같이 문자열(String), 숫자(int, double, float), 클래스형(클래스명과 동일)들이 올 수 있고, 파라미터의 이름은 함수 f(x), f(y), f(z) 등에서 x, y, z... 와 같이 정의역의 이름에 해당한다.
그리고 이 정의역 x의 값, 즉 파라미터 x의 값(x=?)은 ?는 인자에 해당된다. 즉 정의역에 대입되는 숫자나 문자 등의 값(value)을 나타낸다. 이것을 영어로 '요소', '인자'라는 뜻의 argument라고 한다. x에 들어가는 값이 곧, 메써드에 투입되는 값으로 메써드 내 일련의 로직을 거쳐서 산출되는 값, 즉 함수에서 치역에 해당되는 y의 값으로 치환된다. 다시 말해, 메써드에서 되돌려줘야 하는 값(리턴 값)은 함수에서 치역에 해당하는 y의 값이다.
어떠한 인자가 하나의 로직을 거쳐 되돌려지거나 아니면 아무것도 내놓지 않는 구조로 이루어진 것이 바로 '메써드'라고 불리는 하나의 모듈(여기저기서 재사용을 할 수 있는 기능체)이다.
리턴값 y는 앞서 정의역(파라미터)을 정의하기 전에 자신의 형(type)을 정하거나 아니면 아예 자신이 없도록 즉, 비우도록(void) 만들 수 있다. 타입에 따라서 숫자 값이 올 수도, 문자열 값이 올 수도 있다.
1) int형(정수형) 리턴 값의 예
public int f(x){ return 1; }
2) String형(문자열) 리턴 값의 예
public String f(x){ return "I am return value."; }
3) 리턴 값이 없는 경우의 예
public void f(x){ }
자판기에 표기되어 있는(부르는) 메뉴의 가격*을 보고 돈이라는 '매개체(파라미터)'를 투입하면 그 매개체의 금액(인자, argument)에 준하는 자판기 내부의 동작 과정을 통해 결괏값으로 선택된 메뉴의 물품을 되돌려 받거나 경우에 따라서 출력물이 없을 수 도 있다. 여기서 프로그래밍에서의 함수는 내적으로 그 입력값을 어떻게 다루어 출력값을 내는지도 보는 반면 수학에서의 함수는 단지 입력값과 출력값만 본다는 것이 다르다.
내가 중학 시절에 배운 함수, y=f(x)에서 함수 f(unction)를 우리는 자바에서 아주 쉽게 접할 수 있는 메써드라는 것을 안다면, 멤버 변수와 달리 어떤 동작을 하기 위한 멤버 함수라는 두리뭉실한 설명에 꾀이지 않을 것이다. 다음 편에서 시스템 메모리 구조에서 스택과 힙을 끌어들여 자바의 메써드, 클래스를 설명해보겠다.
* 메뉴의 가격이 파라미터(돈이라는 변수)의 인자, 즉 금액이다. 메뉴를 부르기 위해(예를 들면, 블랙커피를 고르기 위해) 이 블랙커피를 만드는 동작을 지시(블랙커피 버튼을 누름) 해야 한다. 버튼을 누르는 행위가 바로 이 블랙커피를 만드는 방법의 절차 혹은 체계(method)를 호출하는 액션인데, 이것을 '메써드 호출'이라고 부른다.