# 메소드와 리턴 값
## 리뉴얼
<div class="embed-responsive embed-responsive-16by9">
<iframe src="https://www.youtube.com/embed/EcdPQ49fP6c" frameborder="0" allowfullscreen></iframe>
</div>
## 구버전
<div class="embed-responsive embed-responsive-16by9">
<iframe src="https://www.youtube.com/embed/wbZepDsjoYE" frameborder="0" allowfullscreen></iframe>
</div>
## 들어가며
---
이전 시간, **타입 관련 주의점**과 `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입니다.
```
## 요약
---
#### 메소드 정의
- 메소드란, 일련의 코드를 단순화하는 문법으로 입력에 따른 결과값을 반환한다.
- 메소드 정의란, 일련의 코드를 하나로 묶어 정하는 것이다.
- 메소드는 타입, 이름, 파라미터, 리턴값으로 구성된다.
#### 메소드 호출
- 메소드 호출이란, 정의된 메소드를 사용하는 것이다.
- 메소드 호출 시 전달값은 파라미터로 대입된다.
- 메소드 호출 종료되면 리턴값은 메소드의 호출 위치로 반환된다.
## 확인하기
---
<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>