Notice
Recent Posts
Recent Comments
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

충분히 쌓여가는

메소드 본문

Java

메소드

빌드이너프 2023. 2. 2. 17:39
자바 프로그램은 하나의 클래스로만 이루어져 있음
그 클래스는 main 메소드만 포함한다
따라서 main 메소드에서 주어진 문제를 해결하기 위해 해야 할 모든 일을 다함

main 메소드는 해야 할 작업들이 많아지면 작업들을 나눈다
나눈 작업을 수행하는 별도의 메소드를 작성하고 main 메소드에서 특정 작업을 수행할 필요가 있을 때 해당 메소드를 호출한다
호출된 메소드가 실행되면 특정 작업을 수행한 후 결과를 main 메소드로 넘겨 준다
따라서 클래스 안에는 main 메소드 외에 여러 개의 메소드들이 있을 수 있다
메소드는 특정 작업을 수행하는 클래스의 주요 구성 단위이다

 


 

메소드

  • 자바 프로그램은 클래스들의 모음
  • 자바 프로그램은 하나 이상의 클래스들로 구성됨
  • 클래스들은 데이터 선언들과 메소드 정의들고 이루어짐
  • 메소드는 클래스의 주요 구성 요소로 특정 작업을 수행하는 자바 문들의 모음
  • 표준 클래스 라이브러리에 있는 메소드들을 많이 이용했고, 메소드를 이용하기 위해 메소드를 호출했다

 

String message = "합격을 축하합니다";
int len = message.length();
System.out.println("문자열의 길이 = " + len);
  • 문자열의 길이를 알기 위해 String 클래스의 length  메소드를 호출
  • 구한 문자열의 길이를 출력하기 위해 System.out 객체의 println 메소드를 호출함

 

자바는 두 가지 종류의 메소드 존재

  • 특정 작업을 수행하고 결과 값을 반환하는 메소드
    • String 클래스의 length 메소드는 문자열의 길이를 계산 후 반환
  • 특정 작업을 수행하고 결과 값을 반환하지 않는 메소드
    • System.out 객체의 println 메소드는 주어진 문자열을 출력하고 어떤 값도 반환하지 않음

 

두 개의 값을 넘겨받아 결과 값을 반환하는 메소드

  • 메소드는 작업 수행에 필요하다면 데이터를 넘겨 받아 작업을 수행함
  • 메소드는 입력 데이터를 받지 않을 수도 있음
  • ex. 시험 점수들의 평균을 구하는 메소드는 점수들을 넘겨 받아 평균 값 계산

메소드 정의

  • 메소드는 값을 반환하는지 혹은 반환하지 않는지에 따라 다르게 정의함
  • 모든 메소드는 클래스 내에 포함되고, 크게 머리부와 몸체로 이루어진다

 

public 반환유형 메소드이름(형식매개변수 목록)
{
    문 1;
    문 2;
        ...
    문 N;
}
  • 첫 줄은 메소드 머리부, 나머지는 메소드 몸체
  • 머리부의 맨 앞에는 public이라는 예약어가 나옴
  • public: 메소드를 이용하는데 어떠한 제약도 없다는 것을 의미함 -> 프로그램 내 어디서든지 이 메소드를 호출할 수 있음
  • 메소드는 작성자가 정하는 이름을 가짐
  • 머리부에는 메소드 이름 앞에 반환 유형이 나옴
  • 메소드는 실행이 끝난 후 값을 반환할 수도 있고 반환하지 않을수도 있음
  • 반환하는 경우: 반환 유형에 반환하는 값이 없다는 의미로 예약어 void를 적는다
    • ex. main 메소드는 어떠한 값도 반환하지 않으므로 반환 유형은 void
  • 형식 매개변수(formal parameter) 목록은 메소드가 넘겨받는 데이터들을 저장하는 매개변수들을 기술함
  • 각 데이터는 하나의 매개변수에 대응됨
  • 매개 변수는 대응하는 데이터 값의 유형과 이름으로 나타내짐
더보기

형식 매개변수 목록은 쉼표로 나누어진 매개변수의 데이터 유형과 이름 쌍의 나열로 메소드가 데이터를 넘겨 받지 않는다면 형식 매개변수 목록은 빈칸이 됨

이게 어떤 말인지 이해가 안감

  • 메소드 몸체는 수행하는 작업을 나타내는 자바 문들로 이루어짐
  • 메소드 몸체는 여는 중괄호{ 로 시작하고 닫는 중괄호 } 로 끝남
  • 중괄호들 사이에는 자바 문들이 나열되지만, 중괄호들 사이에 어떤 자바 문도 나오지 않을 수 있음
  • 값을 반환하는 메소드가 실행을 마친 후 결과 값을 반환할 때 사용하는 문이 return 문

 

return <연산식>;
  • return 문: 반환하는 연산식을 명시
  • <연산식>을 계산한 결과값의 데이터 형은 메소드 머리부의 반환 유형과 일치해야 함
  • 값을 반환하지 않는 메소드는 return 문을 필요로 하지 않으나 메소드 실행을 중간에 끝내기 위해 <연산식>이 없는 return 문을 사용함

 

  • 메소드 몸체를 구성하는 자바 문들은 변수 선언문들을 포함할 수 있음
  • 메소드가 작업을 수행하면서 저장해야 할 데이터들이 있다면 이 데이터를 저장하기 위해 변수들을 선언하여 사용할 수 있음
  • 이러한 변수들이 지역변수
  • 메소드의 형식 매개변수들도 메소드가 호출될 때 넘어오는 값들을 저장하기 위해 자동적으로 만들어지므로 지역 변수들임
  • 메소드 실행이 끝나면 형식 매개변수들을 포함한 지역 변수들을 없어짐

값을 반환하는 메소드 예

public double computeAverage(int number1, int number2, int number3)
{
    return (number1 + number2 + number3) / 3.0;
}
  • 세 개의 정수(number1, number2, number3)들ㅇ르 넘겨 받아 평균을 계산하여 반환

값을 반환하지 않는 메소드 예

public void dutchPay(int totalAmount, int count)
{
    int dutchpayAmount; // 일인당 부담 금액
    
    // 일인당 부담해야 할 금액을 계산
    if (count == 0) {
        System.out.println("사람들의 수가 0이다.");
        return;
    } else {
        dutchpayAmount = totalAmount / count;
        System.out.println("일인당 부담 금액: " + dutchpayAmount);
    }
}
  • 총 금액(totalAmount)과 사람들의 수(count)를 넘겨 받아 일인당 부담해야 할 금액(dutchpayAmount)를 계산하여 출력함
  • 만약 count가 0이 아니라면 나눗셈(totoalAmount / count)를 수행할 수 없음
  • 메소드 내에서 계산되는 일인당 부담 금액을 저장하는 변수 dutchpayAmount는 지역변수임

 


메소드 호출

  • 메소드를 이용하려면 호출해야 하고 메소드는 호출이 되면 실행됨
  • 메소드가 호출이 될 때, 프로그램의 실행은 호출된 메소드 몸체의 첫 문에서 계속됨
  • 메소드 몸체의 수행을 마친 후 프로그램의 실행은 메소드를 호출한 문으로 돌아가서 계속됨

 

같은 클래스 내의 다른 메소드를 호출하는 2가지 방법

  1. 메소드 이름()
    • 매개변수가 없는 메소드 호출하는 경우
  2. 메소드 이름(실제 매개변수 목록)
    • 매개변수(들)을 가진 메소드를 호출하는 경우

 

  • 실제 매개변수(actual parameter) 목록은 호출하는 메소드에 넘겨주는 실제 매개변수들을 쉼표로 분리한 것
  • 실제 매개변수가 하나인 경우, 실제 매개변수 목록은 그 실제 매개변수로 이루어짐
  • 실제 매개변수는 연산식이 될 수도 있음
  • 실제 매개변수 목록은 호출하는 메소드 머리부의 형식 매개변수 목록과 대응되어야 함
  • 즉, 실제 매개변수 목록에 있는 매개변수들의 수는 형식 매개변수 목록에 있는 매개변수들의 수와 같아야 함
  • 실제 매개변수의 현재 값이 호출된 메소드의 대응하는 형식 매개변수의 값이 됨
  • 실제 매개변수들과 형식 매개변수들은 왼쪽 -> 오른쪽으로 순서대로 대응됨
  • 이때 실제 매개변수의 데이터 형은 대응하는 형식 매개변수에 배정 가능한 데이터 형이어야 함
  • 따라서 메소드가 호출될 때 실제 매개변수(들)의 현재 값(들)이 순서대로 형식 매개변수(들)의 값(들)에 1대 1로 복사되어 넘겨짐
  • 호출된 메소드는 이 값들을 사용하여 작업을 수행함

findMin 메소드를 이용하여 두 정소의 최솟값을 구하는 프로그램

// 두 정수의 최솟값을 구함
public class FindMinimum {
    // 두 정수의 최솟값 구함
    // 매개 변수
    // number1: 정수 1
    // number2: 정수 2
    // 반환 값: 최솟값
    public static int findMin(int number1, int number2){
        // 두 정수들 중 작은 값을 반환
        if (number1 < number2)
            return number1;
        else
            return number2;
    }

    // 두 정수의 최솟값을 구한 후 출력
    public static void main(String[] args) {
        int value1 = 65;
        int value2 = 82;
        int minvalue;

        // 주어진 두 정수의 최솟값을 findMin 메소드를 호출하여 구함
        minvalue = findMin(value1, value2);

        // 두 정수와 최솟값 출력
        System.out.println("첫 번째 정수: " + value1);
        System.out.println("두 번째 정수: " + value2);
        System.out.println("최솟값: " + minvalue);

    }
}
  • findMin 메서드의 머리부의 맨 앞에 static라는 예약어는 객체를 생성하지 않고 이 메소드를 바로 호출할 수 있도록 하기 위함

일인당 부담해야 할 금액을 계산하는 프로그램

// 일인당 부담해야 할 금액 계산
import java.sql.SQLOutput;
import java.util.Scanner;
public class ComputeDutchPay {
    // 일인당 부담해야 할 금액을 계산하여 출력
    // 매개 변수
    // totalAmount: 총 금액
    // count: 사람들의 수
    // 반환 값: 없음
    public static void dutchpay(int totalAmount, int count){
        int dutchpayAmount; // 일인당 부담 금액

        // 일인당 부담해야 할 금액을 계산한 후 출력
        if (count == 0){
            System.out.println("사람들의 수가 0");
            return;
        }
        else {
            dutchpayAmount = totalAmount / count;
            System.out.println("일인당 부담 금액: " + dutchpayAmount);
        }
    }



    public static void main(String[] args) {
        int charage; // 총 금액
        int number; // 사람들의 수

        Scanner scan = new Scanner(System.in);

        // 총 금액을 입력받음
        System.out.print("총 금액 입력: ");
        charage = scan.nextInt();

        // 사람들의 수 입력
        System.out.print("사람들의 수 입력: ");
        number = scan.nextInt();

        // 일인당 부담해야 할 금액을 계산하여 출력
        dutchpay(charage, number);
    }
}

메소드 설계

  • 메소드는 특정 작업을 수행함
  • 메소드는 작업 수행에 필요하다면 데이터를 넘겨받아 작업을 수행한 후 결과값을 반환함
  • 메소드는 한 개체로 쉽게 이해될 수 있도록 상대적으로 짧아야 함
  • 메소드가 수행하는 작업이 너무 복잡하면 메소드가 길어지고 이해하기 어려울 수 있음
  • 더 잘 이해할 수 있는 메소드 설계를 하기 위해 긴 메소드를 필요한 만큼 여러 개의 작은 메소드들로 분할해야될 필요가 있음

 

메소드 설계는 3가지 과정으로 이루어짐

  1. 메소드 이름, 매개변수 이름과 반환 값
  2. 지역변수(들)
  3. 알고리즘

재귀 메소드(recursive method)

  • 한 메소드를 이용하기 위해 그 메소드를 호출하였음
  • 이 경우 호출하는 문은 다른 메소드내에 있다
  • 보통 메소드는 어떤 작업을 수행하기 위해 다른 메소드를 호출함, 그러나 메소드가 자기자신도 호출할 수 있음
  • 이런 메소드를 재귀 메소드라고 함
  • 재귀 메소드는 몸체 내에서 자기 자신의 메소드를 호출하는 메소드

 

재귀(recursive)

한 메소드가 어떤 작업을 수행하기 위해 자기자신을 호출하는 프로그래밍 기법

어떤 것을 자기 자신에 의해 정의하는 프로세스

ex. 선물 상자안에 선물 상자가 있는 것


1부터 주어진 정수 사이의 모든 정수들의 합을 구하는 프로그램

// 1부터 주어진 정수사이의 모든 정수들의 합을 구함
public class Calculatesum2 {

    // 1부터 N 사이의 모든 정수들의 합을 구함
    // 매개변수
    // N: 양의 정수
    // 반환 값: 1부터 N 사이의 모든 정수들의 합
    public static int findSum(int N){
        // 합을 저장하는 변수
        int sum;

        // N이 1이면 합은 1이고
        if (N == 1)
            sum = 1;
        else // N이 1이 아니라면 1부터 (N-1) 까지의 합에 N을 더한 값
        sum = findSum(N-1) + N;

        // 합 반환
        return sum;
    }

    public static void main(String[] args) {
        int number = 100;
        System.out.println("1부터 " + number + "사이의 모든 정수들의 합은 " + findSum(number) + "이다");
    }
}
  • N을 양의 정수라고 하고
  • 예를 들어 1부터 100까지의 정수들의 합은 = 1부터 99까지의 정수의 합에 100을 더한 것과 같음
  • 1부터 99까지의 정수들의 합 = 1부터 98까지의 정수들의 합에 99를 더한 것과 같음
  • ....
  • sum(N) = sum(N - 1_ + N, N >= 2
  • sum(N) = 1, N = 1

 

 

'Java' 카테고리의 다른 글

접근 수정자(Access Modifier) public / private  (0) 2023.02.03
클래스  (0) 2023.02.03
반복문 - for 문  (0) 2023.02.01
반복문 - do 문  (0) 2023.02.01
반복문 - while 문  (0) 2023.02.01