Java 07 메소드

헤이즐·2022년 5월 27일
0

메소드란?

메소드란 프로그램을 실행하게 하는 동작(처리)의 집합을 기술한 것, 또는 그 동작의 집합을 호출하는 기술 부분을 뜻한다.
Java에는 여러가지 동작을 실시하는 메소드가 이미 준비되어있고, 그중에는 우리가 이미 자주 사용하고 있는 메소드들도 있다. (ex : println, print 메소드/ nextInt 메소드 등)
메소드의 동작은 호출한 시점에서 자동으로 동작하므로 내부 처리가 어떻게 기술되어있는지 모르더라도 간단히 이용이 가능하다.

이러한 Java의 기존의 메소드는, Java API(Application Program Interface)라고 불리는 문서에 정리되고 있어 web에서 확인 가능하다.

메소드 정의 및 호출

메소드의 기본 구문은 아래와 같다.

<기본구문>

static 수식자 리턴형 메소드명(인수) {
    처리내용;
    return 문;
}

<선언된 메소드 호출시>

메소드명(인수);

<예제>

public class MyAdditionMethod {

    static int additionMethod(int a, int b){
        int sum = a + b;
        return sum;
    }

    public static void main(String[] args) {

        // 계산용 값을 관리하는 변수 선언 및 초기화 
        int a = 5;
        int b = 10;

        int answer = additionMethod(a, b);

        System.out.println("a = " + a);
        System.out.println("b = " + b);
        System.out.println("a + b = " + answer);

    }
}

해당 메소드는 변수 a와 b를 더해 그 계산결과를 돌려주는 메소드다.
위의 기본 구문과 비교 및 대입하여 생각해보면 메소드의 구성이 어떻게 되고 실제 코드 작성시 어떻게 이용되는지 파악할 수 있다.

메소드 정의

<메소드 정의 서식>

static 수식자① 리턴형② 메소드명③(인수④) {
    처리내용⑤;
    return 문⑥;
}

👉static 수식자

해당 수식자는 앞으로 정의하는 메소드를 어떤 범위나 형태로 이용할 수 있을지에 대한 것이다. 구성원 변수와 구성원 방법을 수식하는데 이용된다.

👉return문과 return값

리턴값(반환값)은 해당 메소드 처리 결과값이다. 메소드 호출원의 처리로 이용된다. 리턴값을 가지는 메소드의 경우는 반드시 리턴문으로 선언하고 있던 형태를 리턴값으로 돌려주지 않으면 안되며 하나의 변수만 반환이 가능하다.

👉메소드명

메소드명은 메소드에 붙인 이름이다. 소문자로 시작해 두번째 이후의 단어 첫글자를 대문자로 하는 카멜 케이스가 관례다.

👉인수

인수는 메소드를 호출할 때 그 메소드에 건네주는 값이다.
정의 부분에 기술하는 인수를 가인수라고 하며 메소드 내의 처리로 이용된다.
메소드명 뒤의 괄호에는 필요한 인수의 형태와 변수명을 기술해야만 한다.
인수를 복수로 받는 메소드의 경우에는 콤마( , )를 이용하여 단락 짓는다.
또한 인수를 받지 않는 경우에는 괄호 안에 기술하지 않는다.

메소드를 호출할 때 기술하는 인수는 실인수라고 칭한다. 실인수는 메소드의 선언부분에 쓰여진 인수의 형태, 기술한 순서, 개수에 일치시킬 필요가 있다.

⭐포인트
가인수와 실인수는 인수의 형태, 순서, 개수를 일치시킨다.
인수가 복수 있는 경우는 ,(쉼표)로 단락짓는다. 인수가 없는 경우는, ( ) 안에 아무것도 쓰지 않는다.

👉처리

인수와 리턴값과 메서드의 조합 패턴은 크게 나누어 다음 네가지 패턴이 된다.
1)인수 있음, 리턴 값 있음
2)인수 있음, 리턴 값 없음
3)인수 없음, 리턴 값 있음
4)인수 없음, 리턴 값 없음

메소드 정의 위치

메소드를 정의하는 장소는 main 메소드 전후 어느 쪽이어도 괜찮지만, 어떠한 클래스 내에 있어야 하며 메소드끼리 충첩되어서는 안된다.

메소드의 편리성

메소드를 부품처럼 적재적소에 사용하면 쾌적한 코드를 만들 수 있다.

<예시 1 메소드를 사용하지 않는 경우>

public class NoMethod {

    public static void main(String[] args) {

        // 점수를 관리하는 변수 선언 및 초기화
        int pointA = 85;
        int pointB = 32;
        int pointC = 60;
        int pointD = 40;

        System.out.print("A남");
        if (pointA >= 50) {
            System.out.println(pointA + "점으로 합격!");
        } else {
            System.out.println(pointA + "점으로 불합격!");
        }
        System.out.println(" ======= ");

        System.out.print("B님");
        if (pointB >= 50) {
            System.out.println(pointB + "점으로 합격!");
        } else {
            System.out.println(pointB + "점으로 불합격!");
        }
        System.out.println(" ======= ");

        System.out.print("C님");
        if (pointC >= 50) {
            System.out.println(pointC + "점으로 합격!");
        } else {
            System.out.println(pointC + "점으로 불합격!");
        }

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

        System.out.print("D님");

        if (pointD >= 50) {
            System.out.println(pointD + "점으로 합격!");

        } else {
            System.out.println(pointD + "님으로 불합격!");
        }
        System.out.println(" ======= ");

    }
}

<예시 2 메소드를 사용하는 경우>

public class Method {

    static void checkPass(int point){

        if(point >= 50){
            System.out.println(point + "점으로 합격!");
        }else{
            System.out.println(point + "점으로 불합격!");
        }
        System.out.println(" ======= ");
    }

    public static void main(String[] args) {

        // 점수를 관리하는 변수 및 초기화
        int pointA = 85;
        int pointB = 32;
        int pointC = 60;
        int pointD = 40;

        System.out.print("A님, ");
        checkPass(pointA);

        System.out.print("B님, ");
        checkPass(pointB);

        System.out.print("C님, ");
        checkPass(pointC);

        System.out.print("D님, ");
        checkPass(pointD);
    }
}

if문을 사용한 checkpass 메소드를 만들었을 때 같은 결과를 도출하는 코드라도
훨씬 가독성이 좋고 깔끔한 코드가 완성되는 것을 볼 수 있다. 또한 메소드를 이용하게 되면 코드를 유지보수하기가 훨씬 쉬워진다.

아래 예시들은 기존 예시 1의 코드를 다양한 형태의 메소드를 사용해 작성한 예시들이다.

<예시 3 같은 자료형의 인수를 가지는 메소드>

public class TwoArgument {

    static void checkPass(int point, int passPoint) {

        if (point >= passPoint) {
            System.out.println(point + "점 합격!");
        } else {
            System.out.println(point + "점 불합격!");
        }
        System.out.println(" ======= ");

    }

    public static void main(String[] args) {

        int pointA = 85;
        int pointB = 32;
        int pointC = 60;
        int pointD = 40;

        System.out.print("A님, ");
        checkPass(pointA, 50);

        System.out.print("B님, ");
        checkPass(pointB, 50);

        System.out.print("C님, ");
        checkPass(pointC, 50);

        System.out.print("D님, ");
        checkPass(pointD, 50);
    }
}

<예시 4 여러 자료형의 인수를 가진 메소드>

public class VariousArgument {

    static void checkPass(String name, int point, int passPoint) {

        System.out.print(name + "님, ");

        if (point >= passPoint) {
            System.out.println(point + "점 합격!");
        } else {
            System.out.println(point + "점 불합격!");
        }
        System.out.println(" ======== ");
    }

    public static void main(String[] args) {

        int pointA = 85;
        int pointB = 32;
        int pointC = 60;
        int pointD = 40;

        checkPass("A", pointA, 50);

        checkPass("B", pointB, 50);

        checkPass("C", pointC, 50);

        checkPass("D", pointD, 50);

    }
}

<예시 5배열의 요소를 인수에 받는 메소드>

public class MethodWithArrayElement {

    static void checkPass(int point){

        if(point >= 50){
            System.out.println(point + "점 합격!");
        }else{
            System.out.println(point + "점 불합격!");
        }
        System.out.println(" ======== ");

    }

    public static void main(String[] args) {

        // String형의 이름을 관리하는 배열의 선언과 초기화
        String[] aryName = {"A", "B", "C", "D"};

        // int형 점수를 관리하는 배열의 선언과 초기화 
        int[] point = {85, 32, 60, 40};

        for(int i = 0; i < aryName.length; i++){
            System.out.print(aryName[i] + "님, ");
            checkPass(point[i]);
        }
    }
}

해당 코드는 main 메소드 위에 메소드 본체가 기술된다. 먼저 실행되는 것은 main메소드 안의 String형 배열 변수 aryName의 선언과 4개의 요소수 초기화다. 다음으로는 int형 배열 point의 선언과 4개의 요소수 초기화가 실행된다. 그다음 for문으로 'i가 4보다 작다'라는 의미를 가진 조건식이 실행된다. 그 뒤 checkpass메소드를 for문 안에 기술해 처리하면 된다. 해당 예제는 형식이 맞으면 배열 변수의 요소도 인수로 전달이 가능하다는 것을 보여준다.

profile
개발자를 꿈꾸며 하루하루 고군분투 중!

0개의 댓글