method function

이미지참조: https://evan-moon.github.io/2019/12/29/about-pure-functions/

메서드(method) 또는 멤버 함수(member function)

형식

접근자 리턴데이터타입 함수명(인자 x) {
   처리 로직
   결과 리턴
}

public int fn(int x) {
      int y = x * x;
      return y
}

메서드 만들기

리턴값이 있는 경우

package chapter05;

public class MethodEx {

    public static int add(int x) {
        int y = x * x;
        return y;
    }

    public static void main(String[] args) {


    }
}

리턴값이 없는 경우

package chapter05;

public class MethodEx {

    public static int add(int x) {
        int y = x * x;
        return y;
    }

       public static void addPrint(int x) {
        int y = x * x;
        print(y)
    }

    public static void main(String[] args) {


    }
}

메서드 사용

메서드가 동일 클래스(파일)에 정의 되어 있는 경우

package chapter05;

import java.util.Scanner;

public class MethodEx {

    public static int add(int x) {
        int y = x + x;
        return y;
    }

    public static void main(String[] args) {
        int x = 10;
        int y = add(x);
        System.out.println("y = add(x) = " +  y);

        x = 20;
        y = add(x);
        System.out.println("y = add(x) = " +  y);

        System.out.println("int input > ");
        Scanner scan = new Scanner(System.in);
        x = scan.nextInt();
        y = add(x);
        System.out.println("y = add(x) = " +  y);

    }

}

메서드가 다른 클래스(파일)에 정의 되어 있는 경우

메서드 정의

package chapter05;

public class MyMath {

    // static 메서드
    public static int add(int x) {
        int y = x + x;
        return y;
    }

    // instance 메서드
    public int add(int x1, int x2) {
        int y = x1 + x2;
        return y;
    }   

}

메서드 사용(호출)

package chapter05;

public class MyMathTest {

    public static void main(String[] args) {
        int x1 = 10;
        int x2 = 20;

        // 다른 클래스 static 메서드 호출
        int y1 = MyMath.add(x1);

        // 다른 클래스 instance 메서드 호출
        MyMath myMath = new MyMath();
        int y2 = myMath.add(x1, x2);

        System.out.printf("(y1,y2) = (%s,%s)", y1, y2);
    }

}

메서드 중지 - return

package chapter05;

import java.util.Scanner;

public class MethodEx {


    public static void addPrint(int x) {

        if(x == 0) {
            System.out.println("end");
            return;
        }


        int y = x + x;

        System.out.println("y="+ y);

    }

    public static void main(String[] args) {
        addPrint(0);

    }

}
지역변수 범위 scope
package chapter05;

public class LocalVarTest {

    public static void main(String[] args) {

        int n = 0;

        {
            int a = 10;
        }

        // int b = a; // error 블럭에서 선언된 a 지역변수 

        for(int i=0; i<3; i++) {
            int j = 3;
        }

        // int b = i; error for() 선언된 i, for블럭에 선언된 j 지역변수

    }

    public static void nUse() {
        //int k = n; // main()에 선언된 n 지역변수
    }

}

메서드 인자 전달 방법

package chapter05;

public class ArgsTest {


    public static void varInt(int x) {
        x = 10;
    }

    public static void varArr(int[] x) {
        x[0] = 10;
    }


    public static void main(String[] args) {

        int x = 0;
        // 기본형 변수에 값 전달 => 복사본 => 전달값 변화 없음
        varInt(x);


        int[] xArr = {0};
        //참조형 변수에 주소 전달 => 실제값 => 전달값에 영향이 미침
        varArr(xArr);

        System.out.println(x);
        System.out.println(xArr[0]);

    }

}

다음의 예제의 값을 예측 해고 설명 해보기

package test;

public class Dog {
    private String name; 

    public Dog(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }   

}

package test;

public class Test { public static void main(String[] args) {

    int x = 10;
    int[]y = {1,2,3};
    Dog dog1 = new Dog("덕구");
    Dog dog2 = new Dog("뎅뎅이");
    input(x, y, dog1, dog2);
    // x, y, dog1.getName(), dog2.getName()
    // 각각의 값 예측하기

}
static void input(int x, int[] y, Dog dog1, Dog dog2) {
    x++;
    y[0]++;
    dog1 = new Dog("덕팔이");
    dog2.setName("붕붕이");
    // x, y, dog1.getName(), dog2.getName()
    // 각각의 값 예측하기
}

}