# 메서드

> ## 반환타입 메서드이름 (타입 변수명, 타입 변수명, ... ) // (선언부)
>
> ## {
>
> ## &#x20;                 // 메서드가 호출되면 수행할 코드(구현부)
>
> ## }

## 메서드의 장점과 작성

> ### 장점
>
> * 중복 코드 제거
> * 관리 용이
> * 재사용 가능
>
> ### 작성
>
> * 반복적으로 수행되는 여러 문장을 메서드로 작성합니다.
> * 하나의 메서드는 <mark style="color:blue;">한 가지 기능</mark>만 수행하도록 작성하는 것이 좋습니다.

## 함수

> ### 값을 입력 받아서 처리하고, 결과를 반환합니다.

> ## <mark style="color:purple;">int</mark> <mark style="color:orange;">add</mark>(<mark style="color:blue;">int x, int y</mark>) { &#x20;
>
> ## => <mark style="color:purple;">int(반환타입)</mark> <mark style="color:orange;">add(메서드 이름)</mark> <mark style="color:blue;">int</mark> <mark style="color:blue;">x, int y(매개변수(입력))</mark>
>
> ## &#x20;       <mark style="color:purple;">int</mark> <mark style="color:purple;">result</mark> = <mark style="color:blue;">x</mark> + <mark style="color:blue;">y</mark>; => 처리
>
> ## &#x20;       return <mark style="color:purple;">result</mark>;  => 결과를 반환
>
> ## }
>
> ## <mark style="color:purple;">void(반환타입)</mark> : 메서드 수행 시 아무것도 반환하지 않을 때 사용합니다.

## 메서드 호출

> ## 메서드이름(값1, 값2, ... );

* 아래 예제코드로 학습해 보겠습니다.

{% code lineNumbers="true" %}

```java
class Method5_1 {
    int add(int x, int y) {
        int result = x + y;
        return result; // 값을 반환
    }
}

class Method5_1Main {
    public static void main(String[] args) {
        Method5_1 method = new Method5_1(); // Method5_1 클래스에 만든 메서드 add 를 사용하기 위해 객체 생성

        int result = method.add(3, 5); // add 메서드를 사용해서 입력한 값(3,5)으로 처리된 값을 반환받아 result 변수에 저장
        System.out.println("result = " + result);
    }
}
```

{% endcode %}

## return

> ## 실행 중인 메서드를 종료하고 <mark style="color:blue;">호출한 곳</mark>으로 되돌아갑니다.
>
> * 반환타입이 <mark style="color:blue;">void가 아닌 경우, 반드시 return 문이 필요</mark>합니다.
> * <mark style="color:blue;">void</mark> 는 <mark style="color:blue;">컴파일러가 자동</mark>으로 메서드 마지막에 <mark style="color:blue;">`return;`</mark> <mark style="color:blue;"></mark><mark style="color:blue;">을 추가</mark>해 줍니다.

* 아래 예제코드로 학습해 보겠습니다.

{% code lineNumbers="true" %}

```java
class Method5_2 {
    void gugudan(int dan) {
        if (!(dan >= 2 && dan <= 9)) {
            System.out.println(dan + "단은 없습니다.");
            return;
        }
        System.out.println(dan + "단 시작!");
        for (int i = 1; i < 10; i++) {
            System.out.println(dan + "*" + i + " = " + dan * i);
        }
        System.out.println();
    }

    boolean checkMax(int x, int y) {
        if (x > y) {
            return true;
        } else {
            return false;
            // return 반드시 필요합니다. 만약 없으면 조건문이 false 일 경우, void 가 아닌데 return 문이 없음으로 Error
        }
    }

}

class Method5_2Main {
    public static void main(String[] args) {
        Method5_2 method = new Method5_2();

        method.gugudan(2);
        method.gugudan(5);
        method.gugudan(10);
        method.gugudan(9);

        System.out.println("method.checkMax(10, 8) = " + method.checkMax(10, 8));
        System.out.println("method.checkMax(5, 9) = " + method.checkMax(5, 9));
    }
}
```

{% endcode %}

## 문장들의 묶음

> ### 코드의 중복을 하나의 묶음으로 만들어 코드의 가독성 및 효율을 높여줍니다.

* 아래 예제코드로 학습해 보겠습니다.

{% code lineNumbers="true" %}

```java
class Time5_1 {
    int hour;
    int minute;
    int second;
}

class Method5_3 {
    static void initObj(Time5_1 time, int hour, int minute, int second) {
        time.hour = hour;
        time.minute = minute;
        time.second = second;
    }
}

class Method5_3Main {
    public static void main(String[] args) {
        Time5_1 t1 = new Time5_1();
        t1.hour = 100;
        t1.minute = 20;
        t1.second = 43;

        Time5_1 t2 = new Time5_1();
        t2.hour = 22;
        t2.minute = 30;
        t2.second = 23;

        Time5_1 t3 = new Time5_1();
        t3.hour = 45;
        t3.minute = 40;
        t3.second = 52;

        System.out.println("t1.hour = " + t1.hour);
        System.out.println("t2.hour = " + t2.hour);
        System.out.println("t3.hour = " + t3.hour);
        System.out.println();

        // 하나하나 인스턴스를 만들고 위처럼 인스턴스 변수를 초기화 하려니 매우 귀찮지 않나요?
        // 물론 '생성자' 라는 개념이 뒤에 나오지만 일단은 메서드를 사용하여 코드의 수를 확 줄여 보겠습니다.

        Time5_1 t4 = new Time5_1();
        Time5_1 t5 = new Time5_1();
        Time5_1 t6 = new Time5_1();

        Method5_3.initObj(t4, 100, 20, 43);
        Method5_3.initObj(t5, 22, 30, 23);
        Method5_3.initObj(t6, 45, 40, 52);

        System.out.println("t4.hour = " + t4.hour);
        System.out.println("t5.hour = " + t5.hour);
        System.out.println("t6.hour = " + t6.hour);

        // 이처럼 메서드를 사용하니 코드의 수가 굉장히 많이 줄어 가독성이 좋아졌습니다.
    }
}
```

{% endcode %}

## 호출 스택(call stack)

> ### 메서드 수행에 필요한 메모리가 제공되는 공간
>
> ### 메서드가 호출되면 호출 스택에 메모리가 할당, 종료되면 해제됩니다.

* 아래 예제코드로 학습해 보겠습니다.

{% code lineNumbers="true" %}

```java
class CallStack5_1 {

    static void firstMethod() {
        System.out.println("firstMethod()");
        secondMethod();
    }

    static void secondMethod() {
        System.out.println("secondMethod()");
        thirdMethod();
    }

    static void thirdMethod() {
        System.out.println("thirdMethod()");
        finalMethod();
    }

    static void finalMethod(){
        System.out.println("finalMethod()");
    }

    public static void main(String[] args) {
        firstMethod();
    }
}
```

{% endcode %}

{% code lineNumbers="true" %}

```java
class CallStack5_2 {

    static void firstMethod() {
        secondMethod();
        System.out.println("firstMethod()");
    }

    static void secondMethod() {
        thirdMethod();
        System.out.println("secondMethod()");
    }

    static void thirdMethod() {
        finalMethod();
        System.out.println("thirdMethod()");
    }

    static void finalMethod(){
        System.out.println("finalMethod()");
    }

    public static void main(String[] args) {
        firstMethod();
    }
}
```

{% endcode %}

{% hint style="warning" %} <mark style="color:red;">필수 시청 영상</mark>

[호출 스택](https://youtu.be/-mqL3LJ4iVc?list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp)
{% endhint %}

{% hint style="info" %}
Ref. Java의 정석 기초편 Chapter6(14, 15, 16, 17, 18, 19, 20, 21, 22)

Ref. [메서드](https://www.youtube.com/watch?v=GXo3Ej24974\&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp\&index=59), [호출](https://www.youtube.com/watch?v=6_GxMvWbkXw\&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp\&index=60), [return](https://www.youtube.com/watch?v=CiEYqbwgqZ0\&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp\&index=61)
{% endhint %}
