# 메소드
## 들어가며
---
이전 시간, **타입 관련 주의점**과 `printf()`의 사용법에 대해 알아보았습니다. 이번 시간에는 여러 줄의 코드를 압축하는 방법에 대해 알아보도록 하죠.

## 메소드란
---
메소드란, *일련의 코드를 단순화*하는 문법으로서, 일반적인 경우 *입력에 따른 결과값을 반환*합니다. 이해를 돕기 위해 햄버거 주문을 예로 한번 들어보도록 하죠. 여러분들 중 혹시 이렇게 주문하시는 분 계십니까?
> 참깨 빵 위에 순 쇠고기 패티 올려주시고, 치즈 한 장 올린 후 다시 패티를 얹은 뒤, 그 위에 소스, 양상추, 피클, 양파를 올려서 윗빵을 덮고 포장해서 하나 주시겠어요?
아마 없을 겁니다. 이렇게 구구절절이 주문하는 것보다는 그냥 “1번 메뉴 주세요” 라고 하는 게 더 편할 겁니다.

마찬가지로 프로그램의 코드 또한 햄버거 매뉴얼처럼 잘 정의해서 필요할 때 사용하는 게 더 편리합니다. 이렇게 일련의 코드를 하나로 묶는것을 **메소드 정의**라 하고, 이를 사용하는 것은 **메소드 호출**이라 합니다.
> 메소드를 사용하면, 수많은 코드를 단순화하여 편리하게 프로그램을 만들 수 있습니다.
그럼 계속해서 메소드의 정의와 호출에 대한 내용을 알아봅시다.

## 메소드 정의
---
메소드를 만들기 위해서는 먼저 그 구조를 알아야 합니다.

메소드는 크게 4가지의 요소로 이루어져있는데, 이는 위 코드의 대문자 부분 즉, 타입-메소드명-파라미터-리턴값이 되겠습니다. public static은 뭐일까 하는분들 계시죠? 이놈들은 객체지향 파트에서 다루도록 하겠습니다. 다시 돌아와서 4가지 구성요소를 정리하면 아래와 같습니다.
- TYPE → 메소드의 최종 결과값의 형태
- NAME → 메소드의 이름
- PARAMETERS → 입력 값을 저장할 변수
- return VALUE → 반환할 최종 결과 값
실제 “제곱 값을 반환하는 메소드”를 만들며 이해를 도와봅시다. 먼저 **메소드명**을 `square`라 하고, 이를 이름 영역에 넣어줍니다.

여기에 값을 입력해야겠죠? 예를들어 2를 입력한다면 2의 제곱인 4를 반환해야 할 텐데, 여기서 입력값 2를 저장할 변수가 필요합니다. 따라서 **파라미터** 영역에 정수형 변수 `n`을 만들어줘야겠네요.

이제 결과 값을 만들어야 합니다. 제곱값을 반환해야 하므로, **리턴값**의 위치에 파라미터 `n * n`을 넣어주세요.

마지막으로 리턴값의 타입을 정해야겠죠? 리턴값이 정수의 제곱이므로, **타입**의 위치에 `int`를 넣어줍니다. 어때요, 쉽죠?

> 한번 정의된 메소드는 쉽게 재사용될 수 있습니다.
## 메소드 호출
---
위에서 만든 sqaure() 메소드를 이제 사용해봅시다. 아래 코드로 7의 제곱을 출력해 볼까요?
```
public class CallMethod {
public static void main(String[] args) {
int inputNum = 7;
int resultNum = square(inputNum);
System.out.printf("%d의 제곱은 %d입니다.", inputNum, resultNum);
}
}
```
아직 실행되지 않습니다. 왜 그렇죠? 맞습니다. 위에서 정의한 square() 메소드가 코드상에 추가되지 않았기 때문이죠. 그럼 메소드를 추가해서 다시 실행해 봅시다.
```
public class CallMethod {
public static void main(String[] args) {
int inputNum = 7;
int resultNum = sqaure(inputNum);
System.out.printf("%d의 제곱은 %d입니다.", inputNum, resultNum);
}
// 정수 n을 입력하면 그 제곱을 반환
public static int sqaure(int n) {
return n * n;
}
}
```
위 코드의 실행결과는 아래와 같습니다.
```
7의 제곱은 49입니다.
```
그럼 실행결과가 어떠한 과정을 거쳐 나오게 되는지 분석해보도록 합시다.
## 메소드의 실행 흐름
---
가장 먼저 main() 메소드의 첫 줄이 수행됩니다.
```
int inputNum = 7;
```
다음으로 square() 메소드가 호출되죠.
```
square(inputNum);
```
메소드 호출이 일어나면, 먼저 *전달값(arguments)이 파라미터(parameters)로 대입*됩니다. 따라서 파라미터 n의 값은 전달된 변수 inputNum과 동일한 7이 됩니다.
```
public static int sqaure(int n) { // n = 7
return n * n;
}
```
파라미터의 대입이 끝나면 본격적으로 메소드 내부의 코드가 수행되는데, 다행히도 이번 square() 메소드는 단 한 줄뿐이네요. n의 값이 7이므로, 리턴값은 `49`가 되고 `int`의 형태로 *메소드가 호출된 위치로 반환*됩니다. 이로써 square() 메소드의 호출이 종료됨과 동시에 실행의 흐름 또한 메소드의 호출위치로 넘어갑니다.
```
public static int sqaure(int n) {
return n * n; // (int) 49
}
```
계속해서 square() 메소드로부터 반환된 49가 변수 resultNum에 대입되고,
```
int resultNum = 49; // 49는 메소드의 반환값
```
main() 메소드의 마지막 라인을 끝으로, 프로그램이 종료되게 됩니다.
```
System.out.printf("%d의 제곱은 %d입니다.", inputNum, resultNum);
#=> 7의 제곱은 49입니다.
```
## 요약
---
1. 메소드란, 일련의 코드를 단순화하는 문법으로 입력에 따른 결과값을 반환한다.
2. 메소드 정의란, 일련의 코드를 하나로 묶어 정하는 것이다.
3. 메소드는 타입, 이름, 파라미터, 리턴값으로 구성된다.
4. 메소드 호출이란, 정의된 메소드를 사용하는 것이다.
5. 메소드 호출 시 전달값은 파라미터로 대입된다.
6. 메소드 호출 종료되면 리턴값은 메소드의 호출 위치로 반환된다.
## 확인하기
---
<div class="interact_responsive_padding" style="padding:100% 0 0 0;position:relative;margin-bottom:5px;"><div class="interact_responsive_wrapper" style="height:100%;left:0;position:absolute;top:0;width:100%;"><iframe id="interactApp5cb49ff3449a47001474b34e" width="100%" height="100%" style="border:none;max-width:100%;margin:0;" allowTransparency="true" frameborder="0" src="https://quiz.tryinteract.com/#/5cb49ff3449a47001474b34e/q/1?method=iframe"></iframe></div></div>