지난 글: - [프로그래밍 언어/JAVA] - JAVA 입문 - 클래스 살펴보기
메서드는 함수(function)의 한 종류이다. 함수가 무엇인지 먼저 알아보고,
JAVA에서 사용하는 메서드에 대해 알아보자.
함수란?
함수란 '하나의 기능을 하는 일련의 코드'이다.
예를 들어 두 수를 갖고서 빼는 세가지 경우가 있다 하자.

세 경우 모두 '두 수를 빼서 결과 값을 보여준다'는 기능이다.
이런 경우에 빼기 기능을 수행하는 코드를 묶어서 '빼기 함수'로 만들 수 있다.
그리고 빼기 기능이 필요할 때마다 이 함수를 불러 연산을 하는 것이다.
이처럼 함수는 어떤 기능을 수행하도록 미리 구현해 놓고 필요할 때마다 호출하여 사용할 수 있다.
함수의 입력과 반환
함수는 이름이 있고 입력 값과 결과 값을 갖는다. 앞에서 예로 든 '두 수를 빼는 함수'를 나타내면
입력(숫자, 거리) → 빼기 함수 → 출력(숫자의 차, 거리의 차)이다.
함수에 이름을 붙일 때는 의미를 알 수 있는 단어를 사용해야 나중에 호출하거나 이해하기 좋다.
그리고 뺄셈에 사용할 두 수는 각각 num1, num2라고 하자.
num1, num2와 같이 함수의 입력으로 받는 변수를 '매개 변수'라고 한다.
그리고 두 수를 뺀 결과 값을 result변수에 저장하여 돌려준다. 이를 '결과를 반환한다'라고 한다.
이렇게 함수를 수행한 후 결과로 되돌려 주는 값인 result를 '반환 값'이라고 한다.
함수 정의하기
빼기 함수를 실제 코드로 작성해보자.

이렇게 함수가 하는 일을 코드로 구현하는 것을 '함수를 정의한다'라고 한다.
함수 이름 min
함수 이름은 위 1의 위치가 함수 이름을 적는 부분이다.
매개변수 num1, num2
min 함수는 두 값을 빼는 일을 한다.
뺄셈을 수행하기 위해서는 먼저 함수에 두 값이 입력되어야한다.
이 두 값은 함수를 호출할 때 괄호 안의 자료형에 맞게 함수에 전달된다.
함수는 넘겨받은 값으로 뺄셈을 수행한다.
이처럼 함수 내부에서 사용할 괄호 안의 변수를 매개변수라고 한다.
경우에 따라서 매개변수가 필요 없는 함수도 있다.
return 예약어와 반환형
min( ) 함수를 수행한 결과 값은 변수 result에 저장된다.
result에 저장된 결과 값은 함수를 호출했을 때 반환되는 값이므로 '반환 값'이라고도 한다.
'이 함수의 결과 값을 반환합니다'를 뜻하는 예약어가 return이다.
이 return예약어를 사용해서 result에 결과 값을 반환한다.
반환 값의 자료형을 반환형이라 한다. 이 함수에서 반환형은 정수형이므로 함수 반환형 자리에
int라고 적었다.
경우에 따라서 반환 값이 없는 함수도 있다. 이럴 경우에 반환 값이 없다고 해서 반환형의 자리를
비워두면 안되므로 반환형의 자리에 void라고 써준다. void는 비어 있다는 의미로
'반환할 값이 없다'는 뜻의 예약어이다.
return예약어는 함수 수행을 끝내고 프로그램 흐름 중에서 호출한 곳으로 다시 되돌아갈 때도 사용할 수 있다.
함수가 수행이 될 수 없는 경우에 함수 수행을 종료하는 예약어 return을 사용한다.
함수 수행을 종료하는 목적이므로 return 뒤에 반환 값을 적지 않아도 된다.
함수 호출하고 값 반환하기
위에서는 함수를 정의만 하고 직접 사용하지는 않았다.
이제 두 수를 뺀 값을 돌려주는 함수를 만들고 사용하자.


이렇게 함수를 사용하는 것을 '함수를 호출한다'라고 한다.
사진에서 min( ) 함수를 구현했다. min( ) 함수는 두 개의 매개변수에 int형 값을 입력 받아
두 수의 차를 돌려준다. 결과 값이 정수이기에 반환형에는 int라고 적었다.
매개변수 살펴보기
위 사진의 8행에서 min( ) 함수를 호출할 때 num1, num2 두 개의 변수를 입력했다.
그리고 12행의 함수를 구현하는 부분에서 n1, n2를 사용했다. 함수를 호출할 때 입력하는(넘겨주는)
변수 이름과 함수를 구현할 때 사용하는 매개변수 이름이 같아도 되고 달라도 상관 없다.
함수 호출과 스택 메모리
함수를 호출하면 그 함수만을 위한 메모리 공간이 할당 된다. 이 메모리 공간을 스택(stack)이라 한다.
함수가 수행될 때 컴퓨터 메모리를 사용하는 법은 다음과 같다.
함수 min( )을 호출하면 메모리는 main( ) 함수가 사용할 메모리 공간이 생성되고, 다음에 min( ) 함수가
사용할 메모리 공간이 스택에 생성된다. 프로그램을 시작할 때 main( )함수부터 호출되기 때문에
가장 먼저 main( ) 함수에 포함된 변수 num1, num2, sum을 저장할 메모리 공간이 생성된다.
그리고 main( ) 함수에서 min( ) 함수를 호출하면 min( ) 함수를 저장할 메모리 공간이 스택에 새롭게
생성된다. min( ) 함수 수행이 끝나고 함수에 할당했던 메모리 공간을 해제하는 과정은 생성된 순서의
역순이다.
함수의 장점
함수를 사용하는 이유 중 첫 째는 함수를 사용하면 기능을 나누어 코드를 효율적으로 구현할 수 있어서다.
main( ) 함수 안에 사용할 기능들을 한꺼번에 작성할 수도 있지만, 기능을 나누어 각각의 기능을 수행하는
함수를 여러 개 만든 후 main( ) 함수에서 필요할 때마다 각 함수를 호출하여 사용할 수도 있다.
이렇게 기능을 분리해서 구현하는 것이 프로그램 코드의 가독성이 더 좋아진다.
두 번째 이유는 편리함이다. 함수를 구현해 놓으면 같은 기능을 매번 코드로 만들지 않고 그 기능의 함수를
호출하면 되니까 편리하다. 또 중복되는 코드를 막을 수도 있다.
세 번째 이유는 프로그램을 실행할 때 생긴 오류를 수정하는 디버깅 작업을 할 때도 편리하다.
하나의 기능이 하나의 함수로 구현되어 있기에 오류가 난 기능만 찾아서 수정하면 되기 때문이다.
하나의 함수에 하나의 기능 구현하기
위에서 우리는 빼기 연산을 하는 min( ) 함수를 만들었다. 이 함수의 기능은 '빼기'이다.
만약 하나의 함수에 여러 기능이 있다면 위에서 말한 함수의 장점이 없어진다. 함수를 구현할 때
중요한 것은 필요한 기능 함수를 만들고, 그 이름에 맞는 하나의 기능을 구현하는 것이다.
클래스 기능을 구현하는 메서드
JAVA 프로그램에서는 클래스 내부에서 사용하는 멤버 변수가 있다.
이를 메서드라고 하는데 메서드는 멤버변수를 사용하여 클래스의 기능을 구현한다.
메서드는 함수에 객체 지향 개념이 포함된 용어라고 생각하면 된다.
위에서 설명했던 함수의 스택 메모리 사용 방법과 장점 모두 메서드에게 동일하게 적용된다.
Person 클래스에 메서드를 구현해보자.

메서드 이름은 해당 클래스를 사용하는 코드의 입장에서 짓는 것이 좋다.
위의 사람의 이름을 반환하는 메서드는 Person 클래스에서 name을 가져오기에
getPersonName이라고 짓는다. 이 메서드의 반환 값은 name인데 name 자료형이 String이므로
반환형도 String이다.
이번에는 사람 이름을 멤버 변수에 대입하는 메서드를 만들어보자.

setPersonName( ) 메서드는 Person 클래스를 사용하는 다른 코드에서 사람 이름을
새로 지정하거나 바꾸어준다. PersonName 값을 지정하는(set) 기능을 제공하는 것이다.
이 메서드는 이름을 전달받아 지정하는 것이기에 매개변수 name을 필요로 한다.
매개변수 name을 멤버 변수 PersonName에 대입하면 학생 이름이 지정되는 것이니
반환 값은 없으므로 반환형은 void로 지정한다.
JAVA의 이름 짓기 규약
JAVA에는 이름 짓기 규약(naming convention)이 딱히 있지는 않다.
다만 전에 배웠듯 클래스 이름은 대문자로 시작한다. 하나의 JAVA파일에 클래스가 여러 개 있을 수도 있지만
public 클래스는 단 하나이고 이 public 클래스 이름과 JAVA 파일 이름은 같아야 한다.
패키지 이름은 모두 소문자로 만든다.
변수와 메서드 이름은 소문자로 시작하여, 중간에 새로운 단어가 나올때마다 대문자를 써주어서 가독성을
좋게 한다. 중간중간에 대문자가 위로 튀어나온 모양이 마치 낙타의 등과 같아고 해서 낙타 표기법(camel notation)
이라고 한다.
참고 서적: 자바 프로그래밍 입문 - 박은종
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
JAVA 입문 - 생성자 (0) | 2022.05.09 |
---|---|
JAVA 입문 - 클래스와 인스턴스 (0) | 2022.05.08 |
JAVA 입문 - 클래스 살펴보기 (0) | 2022.05.06 |
JAVA 입문 - 객체 지향 프로그래밍과 클래스 (0) | 2022.05.04 |
JAVA 입문 - 반복문 (2) | 2022.05.03 |