본문 바로가기

코딩 공부/Java

[Java] 12_메서드

메서드

자바프로그램에서 사용하는 최소한의 기능 단위.

쉽게 이야기 하자면, 자주 등장하는 코드를 재사용 하기 위해 그룹화 해놓은 단위.

#01. 메서드를 정의하는 규칙

1) 지금까지 작성한 메인 클래스 형식

    public class HelloWorld{
        public static void main(String[] args) {    // void main(String...) 이부분에대한                                                    설명
            // ...구현내용...
        }
    }

이 단원에서 설명 가능한 부분

  • void 키워드의 기능
  • main 대신 다른 이름으로 직접 메서드 정의하기.
  • 메서드 이름 옆의 괄호 ()의 의미.

2) 메서드 이름 규칙

  • 영어, 숫자, 언더바, $ 조합만 사용 가능.
  • 첫 글자는 반드시 영어로만 지정 가능
  • 두 개의 단어 이상을 조합할 경우
    1. 언더바 사용 : hello + world --> hello_world
    2. 대문자 변환 : hello + world --> helloWorld
      • 자바에서는 이 형태가 일반적

일반적으로 메서드는 프로그램이 수행해야하는 기능(동작)을 구현하는 것이기 때문에 동사+목적어 형채로 정의하며 첫글자는 영어 소문자로 시작한다.

ex)

  • 내용작성하기 : writeContent()
  • 계정탈퇴확인 : ConfirmAccountOut()
  • 상품추가 : addProduct()
  • 항목삭제 : removeItem()

3) 메서드의 위치

메서드는 반드시 클래스 안에 포함되어야만 한다. 클레스 밖에는 절대 존재할 수 없다.

#02. 메서드 정의하기

f(x) = x + 1

f(5) --> 6

이 수식은 x라는 조건값에 따라 x + 1이라는 계산식을 재사용한다.

자바 프로그램도 재사용하기 위한 단위를 메서드 형태로 정의하고 여러번 재사용 할 수 있다.

MyMethod1.java

public class MyMethod{
    public static void main(String[] args) {
        // 정의한 메서드는 반드시 실행 도중에 호출되어야만 동작한다.
        f();    // 1회 호출
        f();    // 2회 호출
    }            // f라는 값에 묶어두고 불러내서 사용한다.

    // x+1을 x값에 따라 수행하는 메서드
    public static void f() {
        int x = 5;
        System.out.println(x + 1);

        x = 10;
        System.out.println(x + 1);
    }
}
출력결과
6
11
6
11

자바 프로그램에서의 메서드

자바 프로그램도 특정 기능(=연산)을 그룹화 해서 재사용하기 위한 단위를 정의할 수 있는데 이를 메서드(=함수)라고 한다.

메서드의 호출

정의된 메서드는 다음의 형식으로 사용할 수 있으며, 이를 호출한다고 한다.

메서드이름()

#03.파라미터

1) 수학의 매개변수

f(x) = x + 1

함수 f(x)는 주어지는 값 x에 따라 각각 다른 결과를 만들어낸다.

수학에서 함수 f가 연산을 수행하기 위해 주어지는 조건값을 매개변수라 한다.

2) 메서드의 파라미터

기본적으로 수학의 매개변수와 동일한 개념.

메서드는 자신이 실행되는데 필요한 조건값을 메서드 이름 뒤의 괄호() 안에 변수 형태로 선언한다. 파라미터라 한다.

public static void foo(int bar){
    ...
}

파라미터를 갖는 파라미터는 반드시 호출시에 그 값을 전달해야 한다.

    foo(100); // foo라는 메서드를 호출하면서 bar 변수에 100을 할당함.

MyMethod2.java

public class MyMethod2{
    public static void main(String[] args) {
        f(5);    // 메서드 f에 정의된 파라미터 x에 5할당
        f(10);    // 메서드 f에 정의된 파라미터 x에 10할당
    }
        //호출시에 파라미터를 전달해야 하는 메서드
    public static void f(int x) {
        int y = x + 1;
        System.out.printf("f(%d) = %d\n", x, y);

    }
}
출력결과
f(5) = 6
f(10) = 11

#04. 다중 파라미터

1) 수락의 함수에서 여러 개의 매개변수

특정 함수가 연산을 수행하기 위해 두 개 이상의 조건값이 필요하다면 다음과 같이 콤마(,)로 구분하여 명시할 수 있다.

f(x,y) = x + y + 1

매개변수가 여러 개 존재하는 함수는 호출시에 반드시 그에 맞는 값들을 전달해야만 한다.

f(5, 10) -> 5 + 10 + 1 -> 16

2) 메서드의 다중 파라미터

메서드가 기능을 수행하는 두 개 이상의 파라미터가 필요하다면 콤마(,)로 구분하여 선언할 수 있다.

public static void helloworld(int foo, int bar) {
    ...
}

메서드 helloworld()를 호출할 때는 반드시 정의된 파라미터값들을 전달해야만 한다.

    helloworld(1, 2);
    helloworld(3, 4);

MyMethod3.java

public class MyMethod3{
    public static void main(String[] args) {
        f(5, 10);    // 메서드 f에 정의된 파라미터 x에 5, y에 10 할당
        f(10, 20);    // 메서드 f에 정의된 파라미터 x에 10, y에 20 할당
    }

    // 호출시에 파라미터를 전달해야 하는 메서드
    public static void f(int x, int y) {
        int z = x + y + 1;
        System.out.printf("f(%d,%d) = %d\n", x, y, z);
    }
}
출력결과
f(5,10) = 16
f(10,20) = 31

#05. 함수의 결과값

1) 값의 반환

함수는 자신이 포함하고 있는 수식에 대한 결과를 반환한다.

f(x) = x + 1

위와 같이 방정식이 정의되어 있을 경우

y = f(5)

라고 호출하면 함수 f(x)는 자신이 호출된 위치로 연산의 결과인 6을 반환하여 아래와 같이 계산되어 진다.

y = 6

2) 함수의 리턴값

예약어 return의 사용

메서드가 수행 결과를 자신이 호출된 위치에 반환하는 것을 리턴이라고 하며, 이 때 반환되는 값을 리턴값이라고 한다.

메서드 안에서 값을 리턴하기 위해서는 return이라는 키워드가 사용되며 메서드 이름 옆에 void대신 리턴하고자 하는 값의 데이터 타입을 반드시 명시해야 한다.

void는 리턴값이 없다는 의미이다.

public static int foo(){
    return 100;
}

리턴값의 활용

함수가 호출되는 위치에 결과값을 돌려놓는 원리이므로 일반 변수와 같이 사용할 수 있다.

a) 결과를 리턴하는 메서드는 리턴값을 받아 다른 변수에 대입할 수 있다.
    int bar = foo();    // --> int bar = 100;
b) 일반 변수처럼 다른 연산에 활용할 수도 있다.
    int y = foo() + 5; // --> int y = 100 + 5;
c) 함수의 리턴값을 직접 출력할 수도 있다.
    System.out.println( foo() );        // --> System.out.println( 100 );
    System.out.printf("%d\n", foo());    // --> System.out.printf("%d\n", 100)

return 키워드의 기능

메서드가 수행되는 도중 특정 조건이 충족되어 return키워드를 만나게 되면 메서드는 그 즉시 수행을 중단한다.

a) x가 10보다 작은 경우 아무것도 하지 않고 종료
public void foo(int x) {
    if (x < 10){
        return;
    }
    System.our.println("x=" + x);
}
b) x가 10보다 작은 경우 0을 리턴하고 종료
    public int bar(int x){
        if (x < 10){
            return 0;
        }
        return x + 10;
    }
c) 조건 없이 return 키워드를 사용하는 경우

return 0; 이후의 구문들 실행될 수 없으므로 불필요한 구문으로 인식되어 컴파일 시에 에러가 발생한다.

public int some(int x){
    return 0;
    int y = x + 10;
    return y;
}
컴파일 결과
Test.java:4: error: unreachable statement
    int y = x + 10;

1 error

MyMethod4.java

public class MyMethod4{
    public static void main(String[] args) {
        int a = div(10, 2);
        System.out.println("10 / 2 = " + a);

        int b = div( 3, 0);
        System.out.println("3 / 0 = " + b);
    }

    public static int div(int x, int y) {
        if ( y == 0 ) {
            System.out.println("0으로 나눌 수 없습니다.");
            return 0;
        }
        int z = x / y;
        return z;
    }
}
출력결과
10 / 2 = 5
0으로 나눌 수 없습니다.
3 / 0 = 0

#05. 메서드 간의 호출

1) 함수간의 연립 호출

아래의 함수는 f2에서 f1을 호출하고 있다.

f1(x) = x + 1

f2(y) = f1(x) * 2

이 경우 f2에게 10을 전달하면 10이 다시 f1에게 전달된다.

f2(10) = f1(10) * 2

= (10 + 1) * 2

= 11 * 2

= 22

MyMethod5.java

public class MyMethod5{
    public static void main(String[] args) {
        int a = 10;
        int b = f2(a);
        System.out.printf("f2(%d) = %d\n", a, b);
    }

    public static int f1(int x) {
        System.out.printf("f1(%d) = %d + 1\n", x, x);
        return x + 1;
    }

    public static int f2(int y) {
        System.out.printf("f2(%d) = f1(%d) * 2\n", y, y);
        return f1(y) * 2;
    }
}    // main --> f2 --> f1 차례로 실행된다
    // 반대로 f1 --> f2 --> main 순으로 끝이난다.
출력결과
f2(10) = f1(10) * 2
f1(10) = 10 + 1
f2(10) = 22

2) 메서드의 호출순서와 종료순서 간의 관계

MyMethod5.java에서 메서드의 호출 순서는 다음과 같다.

main -> f2 -> f1

종료되어 가장 먼저 결과를 만들어 내는 순서는 다음과 같다.

f1 -> f2 -> main

메서드가 a가 실행하는 도중 그 안에서 다른 메서드 b를 호출하게 되면 b가 종료되기 전까지 a는 종료하지 못하고 대기상태가 된다.

즉, 먼저 싱행(First Input)된 메서드가 가장 나중(Last Output)에 종료된다.

이를 FILO혹은 선입후출 관계라고 하는데 프로그래밍에서는 이러한 관계를 스택(Stack)이라고 한다.

Mymethod6.java (수정)

public class Mymethod6{
    public static void main(String[] args) {
        System.out.println("--- main 시작 --");
        hello();
        System.out.println("--- main 종료 --");
    }
    public static void hello(){
        System.out.println("--- hello 시작 --");
        world();
        System.our.println("--- hello 종료 --");
    }
    public static void world() {
        System.out.println("--- world 시작 --");
        System.out.println("--- world 종료 --");
    }
}
출력결과
--- main 시작 --
--- hello 시작 --
--- world 시작 --
--- world 종료 --
--- hello 종료 --
--- main 종료 --

'코딩 공부 > Java' 카테고리의 다른 글

[Java] 14_재귀호출  (0) 2020.05.08
[Java] 13_값 복사, 참조 복사  (0) 2020.05.08
[Java] 11_2차 배열  (0) 2020.05.08
[Java] 10_배열  (0) 2020.05.08
[Java] 09_형변환  (0) 2020.05.08