Backend/JAVA

[JAVA] JAVA 프로그래밍 기초 교육 : 메소드(Method)

JOKUN 2022. 5. 23. 19:56

교재 : JAVA 프로그래밍 기초 - 09. 메소드

 

# 메소드

메소드란? 함수의 한 종류로,  프로그램에 실시하게 하는 동작(처리)의 집합을 기술한 것.  또는, 그 동작의 집합을 호출하는 기술

 

자바 기존 메소드는 JAVA API라 불리는 문서에 정리되어있음.
Java API(Application Program Interface) 

외에는 직접 함수를 정의하고 호출할 수 있다.

 

 

· 메소드 정의

메소드를 정의하는 위치는 main메소드 전 후 어디든 상관없이 선언이 가능하다.

단, 클래스 내에 있어야하며 중첩되면 안된다.

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

 

선언된 메소드 호출시 : 

메소드명(인수);

 

① static 변수

    위에서는 static 수식자(예약어)로 사용되었다.

    static 변수는 클래스 전반에서 공통으로 사용할 수 있는 기준 변수이다.

    인스턴스와 상관없이 먼저 생성되고, 그 값을 모든 인스턴스가 공유한다.

    클래스에 기반한 변수라 하여 '클래스 변수(class variable)'이라고도 한다.

② 리턴값의 형태

    해당 메소드로 처리해 얻어지는 결과값의 형태를 지정한다.

    리턴값을 가지는 메소드는 반드시 미리 선언한 리턴형으로 반환값을 돌려주어야 한다.

    반환값을 가지지 않는 메소드의 경우에는 리턴형 자리에 'void'라고 기술한다.

    (void : 비어있다는 의미로 '반환할 값이 없음'을 뜻함)

③ 메소드명

    메소드명은 소문자로 시작하며 2개 이상의 단어를 조합할 때 2번 째 단어의 첫글자를 대문자로 기재한다. (카멜케이스)

④ 인수

    실인수 : 메소드를 호출할 때 기술하는 인수.

                    메소드 선언시에 쓰여진 인수의 형태, 기술한 순서, 개수가 일치하여야 한다.

    가인수 : 메소드를 정의할 때 기술하는 인수.

                    가인수는 {} 블록 내에서만 유효하다.

    인수를 받지 않는 경우 : (); 괄호안에 기술하지 않는다.

⑤ 처리 내용

    인수와 반환값의 유무에 의해 메소드의 조합은 변화한다.

        [4가지 패턴]

    · 인수 有 - 리턴 값

    · 인수 有 - 리턴 값 無

    · 인수 - 리턴 값

    · 인수  - 리턴 값

⑥ return 예약어

    메소드의 결과 값을 반환해주는 예약어

    return 뒤에 오는 변수를 반환한다. (반환 값의 자료형을 리턴값(반환형)이라 한다)

 

 

 

 

 

[예제] 학생 4명의 점수를 합격기준점으로 합격/불합격 여부를 판단하기

package jokun.chap09;

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);
    }
}

▽ 실행 화면 ▽

 

 


 

 

# 메소드 기술

 

· 인수 활용

[예제] 같은 자료형의 인수를 가진 메소드

package jokun.chap09;

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);
    }
}

메소드 선언시에 쓰여진 인수의 형태, 기술한 순서, 개수가 일치!

 

▽ 실행 화면 ▽

 

 

 

[예제] 여러 자료형의 인수를 가진 메소드

package jokun.chap09;

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);

    }
}

▽ 실행 화면 ▽

 

 

 

[예제] 인수에 배열의 요소 넣기

package jokun.chap09;

public class MethodWithArrayElement {

    static void checkPass(int point, int pointPass){

        if(point >= pointPass){
            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};

        // 커트라인(포인트패스) 초기화
        int pointPass = 50;

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

▽ 실행 화면 ▽

 

 

 

· 배열 변수 활용

배열 선언

배열의 표시인  [ ] 는, 형태명과 세트.
※선언시에는 형명말고 변수명에 [ ]를 붙여도 에러는 나지 않지만 혼동하지 않기 위해 항상 형명에도 [ ] 를 붙이는게 좋다. 
static 수식자 리턴형[] 메소드명(자료형[] 형명) { 
    처리내용; 
    return 문; 
}

배열을 사용하는 경우 리턴값,리턴형,인수형이 기존 변수 선언에서 배열 선언으로 바뀐다. (외에 기본 구성은 같음)

 

 

static int[] method(double[] doubleArray) {
   실행문장;
   return intArray;
}

 

 

[예제] 인수에 배열의 요소 넣기 ①

package jokun.chap09;

public class MethodWithArrayElement {

    static void checkPass(int point, int pointPass){

        if(point >= pointPass){
            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};

        // 커트라인(포인트패스) 초기화
        int pointPass = 50;

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

▽ 실행 화면 ▽

 

 

 

[예제] 인수에 배열의 요소 넣기 ②

package jokun.chap09;

import org.jetbrains.annotations.NotNull;

public class ArrayArgument {
    static void display(String @NotNull [] aryData) {

        for (int i = 0; i < aryData.length; i++) {
            System.out.println(aryData [i]);
        }
    }

    public static void main(String[] args) {

        String[] jeju = { "성산일출봉", "한라산","만장굴" };

        System.out.println(" === 제주 3대 관광지 === ");
        display(jeju);
    }
}

▽ 실행 화면 ▽

 

 

 

[예제] 배열의 요소를 직접 변경하는 메소드 만들기

package jokun.chap09;

public class ChangeArrayElement4 {
    static void changeJeju(String[] aryData){
        aryData[0] = "쇠소깍";
        aryData[1] = "이오테우해변";
        aryData[2] = "새별오름";
    }

    public static void main(String[] args) {

        String[] jeju = { "성산일출봉", "한라산","만장굴" };

        System.out.println(" === 제주 3대 관광지1 === ");

        for(int i = 0; i < jeju.length ; i++){
            System.out.println("jeju[" + i + "]값은、" + jeju[i]);
        }

        changeJeju(jeju);

        System.out.println(" === 제주 3대 관광지2 === ");

        for(int i = 0; i < jeju.length ; i++){
            System.out.println("jeju[" + i + "]값은,、" + jeju[i]);
        }
    }
}

▽ 실행 화면 ▽

 

 

 

[예제] 리턴값으로 배열 리턴하기

package jokun.chap09;

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

        String[] jeju = new String[2]; //변수 2개로 만들어놨지만

        jeju = makeArray("성산일출봉", "한라산","만장굴"); // jeju를 makeArray라는 3개짜리 변수로 다시 지정함

        for(int i = 0; i < jeju.length ; i++){
            System.out.println("jeju[" + i + "]값은, " + jeju[i]);
        }
    }

    static String[] makeArray(String name1,String name2,String name3){

        String[] localArray = {name1,name2,name3};
        return localArray;

    }
}

▽ 실행 화면 ▽

 

 

 

 


 

 

 

 

[연습문제]

더보기

9-7 연습문제

본 장에서 배운 내용을 바탕으로 연습 문제를 풀어 주세요.
덧붙여 연습 문제의 소스 코드를 작성하는 경우는, 이하의 조건으로 작성해 주세요.
소스 폴더 : javaBasic/src
패키지 : chap09exercise

 

질문 1

다음의 질문 ①~⑤에 대해 ○인가×로 대답하십시오.

 

① 메소드는 main 메소드 이외에도 정의할 수 있다. O
② 메소드는 정의되어 있으면 자유롭게 호출하여 사용할 수 있다. O
③ 메소드에 건네지는 인수는, 수가 맞으면 타입은 어느 것이어도 된다. X
④ 메소드로부터 호출원에게 돌려주어지는 반환값은, 임의의 형태를 돌려줄 수 없다. O
⑤ 메소드를 정의하는 경우, 인수와 반환값은 필수이다. X

 

질문 2

다음의 ①~④의 메소드에 대해서 메소드명, 반환값과 인수의 형태를 각각 대답해 주세요.

메서드 목록
① static int squareNum(int num){
  return num*num;
}
메소드명 : squareNum, 반환값 형태 : int, 인수의 형태 : int
② static void printStr1(String str){
  System.out.println(str);
}
메소드명 : printStr1, 반환값 형태 : void(X), 인수의 형태 : String
③ static String returnTitle(){
  String title=” 메서드 연습 문제 2″;
  return title;
}

메소드명 : returnTitle, 반환값 형태 : String , 인수의 형태 : 인수 없음

④ static void printStr2(){
  System.out.println(“문자열을 표시합니다.”);
}

메소드명 : rrintStr2, 반환값 형태: void(X) ; , 인수의 형태 : 인수 없음

 

 

질문 3

다음의 사양을 가지는 메소드를 정의해 주세요.

메서드 사양
 메서드 이름 : triangle
 반환 값 : double 형 area
 인수 : int 형 base, int 형 height
 처리 내용 :
 저변과 높이의 값을 인수로 받아 삼각형의 면적의 값을 돌려준다.
  static double triangle(int base, int height) {
        double area = (double) base * height / 2;
        return area;
 

질문 4

다음의 사양을 가지는 메소드를 정의해 주세요.

메소드 사양
 메소드명 : calcSum
 반환값 : int 형 sum
 인수 : int 형 num
 처리 내용 :
 1 ~ 인수의 수치만큼 루프 처리를 실시해, 그 루프의 카운터치의 합계를 구해 호출원에게 그 합계치를 돌려준다.
 ※반복은 for문을 사용하는 것.
static int calcSum(int num) {
        int sum = 0;
        for (int i = 1; i <= num; i++) {
            sum += 1;
        }
        return sum;
}
 
 

질문 5

다음의 소스 코드 Practice0901.java를 실행했을 경우의 ①~⑤의 설문에 대해 대답해 주세요.

 ① evaluate 메소드의 반환값과 인수의 형태는 무엇인가.

반환값 형태 : char, 인수의 형태 : int
 ② 호출원의 evaluate 메소드에 설정된 실 인수의 값은 몇개인가.

1개 
 ③ evaluate 메소드의 가인수의 변수 num에 대입되는 값은 몇개인가.

5
 ④ evaluate 메소드내의 반환값으로 설정되는 변수 eva의 값은 몇개인가.

1개
 ⑤ 메인 메소드의 변수 eva에 대입되는 값은 몇개인가.

A

Practice0901.java

package chap09Excercise;

public class Practice0901 {

/*
 * 1~5평가를 A~E평가로 변환하는 방법
 */
    static char evaluate(int num){
        char eva;
        switch(num){
            case 1:
                eva = 'E';
                break;
            case 2:
                eva = 'D';
                break;
            case 3:
                eva = 'C';
                break;
            case 4:
                eva = 'B';
                break;
            case 5:
                eva = 'A';
                break;
            default:
                eva = 'Z';
                break;
        }
        return eva;
    }

    public static void main(String[]args){
        char eva = evaluate(5);
        System.out.println("평가는 "+eva+" 입니다");
    }

}

 

질문 6

다음의 실행 결과가 되는 소스 코드 Practice0903.java를 작성 사양에 근거해 작성해 주세요.

 
작성사양
①Practice1003.java 내에는 다음의 3개의 메소드를 작성합니다.
 ・main 메소드:프로그램을 실행하는 메소드
 ・dispLine 메소드:키보드 입력으로부터의 수치를 받아, 수치분만 루프 처리를 실시합니다.
 반환값:없음 인수:int형 num
 ·outSign 메소드:화면에 「*」를 출력합니다.
 반환값:없음 인수:없음 
②main 메소드 상세
 ·Scanner 클래스를 이용해 키보드로부터 수치의 입력을 실시합니다.
 · 키보드의 입력 숫자를 인수로 dispLine 메서드를 호출합니다. 
③dispLine 메서드 상세
 ・반복 처리를 2중으로 이용하여 인수의 수치분만큼 반복 처리를 실시합니다.
 · 내부 루프 처리 내에서 outSign 메서드를 호출합니다.
 ・내측의 루프 처리가 끝나면 개행을 실시합니다.
④outSign 메소드 상세
 화면에 「*」기호를 출력합니다.
   ※화면 결과는 「*와 스페이스」를 출력하고 있습니다.
package jokun.chap09;

import java.util.Scanner;

public class Practice0903 {

    static void outSign() {
        System.out.print("* ");
    }

    static void dispLine(int num) {
        for (int i = 0; i < num; i++){
            for (int j = 0; j < num; j++){
                outSign();
            }
            System.out.println();
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("숫자입력");
        int num = sc.nextInt();
        dispLine(num);
    }
}