충분히 쌓여가는
메소드 본문
자바 프로그램은 하나의 클래스로만 이루어져 있음
그 클래스는 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가지 방법
- 메소드 이름()
- 매개변수가 없는 메소드 호출하는 경우
- 메소드 이름(실제 매개변수 목록)
- 매개변수(들)을 가진 메소드를 호출하는 경우
- 실제 매개변수(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가지 과정으로 이루어짐
- 메소드 이름, 매개변수 이름과 반환 값
- 지역변수(들)
- 알고리즘
재귀 메소드(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 |