자바, 입문하기!

자바, 입문하기!

프로그래밍 기초, 입문자를 위한 자바!

09 메소드의 생성과 호출

# 메소드의 생성과 호출 <div class="embed-responsive embed-responsive-16by9"> <iframe src="https://www.youtube.com/embed/OL_BJ9GVKG0" frameborder="0" allowfullscreen></iframe> </div> --- <a name="methods-abstract"></a> ## 메소드란? 메소드란 무엇알까요?? 메소드는 프로그램의 구성요소인 클래스의 기능(동작) 입니다. 응? '클래스가 뭔데요?' 하시는 분들이 계시겠죠? 그럼 클래스부터 차근차근 설명해보도록 하겠습니다. 우리는 앞서 자전거의 예를 들어 자바의 특징인 객체지향 프로그래밍을 배웠습니다. 자전거를 하나의 프로그램이라고 가정할 때, 자전거의 바퀴, 몸체, 핸들과 같은 부품(부분)들을 미리 만들어 놓고 이를 조합하여 전체 자전거를 만드는 방식 이를 객체 지향 프로그래밍 이라고 하였습니다. 여기서 각 부품들을 클래스 라고 이해하시면 되겠습니다. (사실 엄격하게 설명하자면, 부품들을 만들기 위한 설계도 라고 표현하는게 더 맞습니다) ![Imgur](https://i.imgur.com/n9YPKLK.png) 그럼 계속 이어서 메소드를 설명해보겠습니다. 위에서 만든 자전거(프로그램)는 각각의 부품들을 통해 특정한 동작을 수행 할 수 있습니다. 예를들면 핸들은 좌/우 회전을 할 수 있을 것이고, 페달은 가속, 브레이크는 감속들의 기능을 수행 할 수 있습니다. 이와 마찬가지로 자바 프로그램은 여러가지의 클래스들로 구성되어있는데, 이러한 클래스들이 가지고 있는 각각의 기능들 이를 바로 메소드 라고 합니다. ![Imgur](https://i.imgur.com/XFfGaNQ.png) 앞으로 우리는 자바를 사용하여 여러가지 기능을 수행 할 수 있는 프로그램을 만들어야 합니다. 이러한 기능을 정의 하기 위해서 우리는 메소드를 잘 알아야 할 필요가 있습니다. --- <a name="methods-structure"></a> ## 메소드 구조 그렇다면 메소드의 구조부터 분석해 보도록 하겠습니다. 메소드는 아래 그림과 같은 구조로 이루어져 있습니다. ![Imgur](https://i.imgur.com/6rVtKPs.png) **타입(type)**은 메쏘드의 이름 앞에 위치하며, 메소드 수행 결과 값의 자료형(Types)을 나타냅니다. **메쏘드명(method name)**은 여는 소괄호 `(` 앞에 위치하고 말 그대로 이름을 의미합니다. **파라미터(parameters)**는 매개변수라고 불리며, 소괄호 안 `( ... )`에 위치하여 외부로부터 전달받은 값을 저장합니다. 중활호에 둘러 쌓인 부분`{ ... }`은 메소드의 동작을 적는 영역 입니다. 메인 메소드를 예로 구조를 파악해 봅시다. ``` class Methods { // public static: 두가지 키워드는 나중에 배움. 일단 따라칠것! // 리턴타입: void - 반환 값이 없음을 의미. // 메쏘드명: main // 파라미터: String[] args - 추후 설명. public static void main(String[] args) { System.out.println("Hello World!"); } } ``` 먼저 public static 이라는 키워드는 '지금 다 설명 할 수 없기에 일단 그냥 쓴다'라고 하고 넘어가겠습니다. 다음으로 타입의 위치에 `void`가 위치해있습니다. **void**란 메소드가 아무런 값도 반환 하지 않음을 의미합니다. 메소드의 이름 위치에는 main이 적혀져 있고, 파라미터로는 `String[] args`라는 내용이 위치해있습니다. 여기까지 우리가 가장 많이 사용했던 메인 메소드를 통해 메소드의 구조를 분석해 보았습니다. --- <a name="adding-methods"></a> ## 메소드 만들기 그럼 다음으로 메소드를 만드는 방법에 대해 알아보겠습니다. 메소드는 아래와 같이 클래스의 안쪽에 작성합니다. ``` class HelloWorld { // 메쏘드 생성: 리턴타입, 이름, 전달인자, 블럭의 내용을 정의 public static TYPE NAME(PARAMETERS) { ... } } ``` 정의된 메쏘드를 호출(실행)하는 방법은 아래와 같습니다. ``` class HelloWorld { // 정의된 메쏘드. public static TYPE NAME() { ... } // main 메쏘드: 프로그램 실행의 시작점 public static void main(String[] args) { NAME(); // 메쏘드 호출. } } ``` 메소드가 호출된다라는 말이 무슨뜻이냐구요? 바로 실행된다는 이야기입니다. --- <a name="methods-and-control-flow"></a> ## 메쏘드와 프로그램 실행흐름 메소드가 호출이 된다는 의미가 무엇인지 예제 코드의 실행 흐름을 분석하며 이해해보도록 합시다. ``` class NewLine { public static void threeLines() { System.out.println(""); System.out.println(""); System.out.println(""); } public static void main(String[] arguments) { System.out.println("Line 1"); threeLines(); System.out.println("Line 2"); } } ``` 위 코드의 실행결과는 아래와 같습니다. ![Imgur](https://i.imgur.com/2RE1XsF.png) 어떠한 과정을 거쳐 위와 같은 출력결과가 나오게 되었을까요? 먼저 프로그램의 시작점인 main 메소드의 첫줄로 인해 "Line 1"이라는 문자열이 출력되었을 겁니다. 그 다음으로 다음 행인 `threeLines()`가 수행이 되는데, 여기서 바로 메소드의 호출이 일어나게 됩니다. 따라서 실행의 흐름은 10행에서 threeLines() 메소드가 정의되어있는 2행으로 넘어가지게 됩니다. 이렇게 넘어가진 실행흐름은 threeLines() 메소드 내부의 System.out.println() 메소드를 3번 실행한 뒤 threeLines() 메소드 호출이 종료 되고서야 비로소 main 메소드로 되돌아 오게 됩니다. 되돌아온 실행 흐름은 `System.out.println("Line 2");` 구문을 실행하여 "Line 2"를 출력 합니다. 이제 더 이상 main 메소드 내부에 수행할 행이 없으므로 프로그램이 종료됩니다. (읽기 귀찮으신 분들은 오른쪽 링크를 통해 해당 부분 영상을 확인하세요~ https://youtu.be/Z4z88n4nreI?t=14m14s) 지금까지 메소드란 무엇이고, 어떠한 구조를 이루고 있으며, 만드는 방법과 실행하는 방법에 대해 알아보았습니다.

Challenge

개념 실습! 학습 내용을 진짜 내 것으로 만들기!