1
6장 메소드
이충기
명지대학교
컴퓨터공학과
들어가며
Q: 1인 기업 사장은 사업이 잘 되어 혼자서 모든 일을 더 이상 할 수 없게 되면 어떻게 하는가?
A:
3
메소드
자바 프로그램은 클래스들의 모음이다.
메소드는 클래스의 주요 구성 요소이다.
메소드는 특정 작업을 수행하는 자바 문들의 모음이다.
메소드는 작업 수행에 필요하다면 데이터를 넘겨 받아 작업을 수행한다.
메소드를 이용하려면 메소드를 호출해야 한다.
메소드
주: 1. 데이터를 넘겨 받지 않을 수도 있다 2. 결과 값을 반환하지 않을 수도 있다
데이터 1 메소드
데이터 2 결과값
5
메소드 정의
public 반환유형 메소드이름(형식매개변수 목록) {
문 1;
문 2;
. . . 문 N;
}
주: 1. 결과 값을 반환하지 않는 메소드의 반환유형은 void이다.
2. 메소드가 데이터를 넘겨 받지 않는다면 형식 매개변수 목록은 빈 칸이 된다.
메소드 몸체
메소드 머리부
return 문
메소드가 실행을 마친 후 결과 값을 반환할 때 사용하는 문이 return 문이다.
return <연산식>;
<연산식>을 계산한 결과 값의 데이터 형은 메소드 머리부의 반환 유형과 일치해야 한다.
결과 값을 반환하지 않는 메소드는 <연산식>이 없는 return문을 사용할 수 있다.
7
지역 변수
메소드가 작업을 수행하면서 저장해야 할 데이터가 있다면 이 데이터를 저장하는 변수가 지역 변수이다.
지역 변수는 메소드내에서 선언할 수 있다.
메소드의 형식 매개변수들은 메소드가 호출될 때 자동적으 로 생성되므로 지역 변수들이다.
메소드 실행이 끝나면 모든 지역 변수들(형식 매개변수들
포함)은 없어진다.
메소드 작성
한 메소드가 특정 작업을 어떻게 수행하는지는 보통 알고리즘 에 의해 기술된다.
알고리즘은 특정 문제를 풀기 위한 과정을 단계별로 기술한 것이다.
알고리즘은 보통 의사코드나 순서도를 사용하여 기술한다.
의사코드는 한글 문장들과 자바 문들을 혼합한 코드이다.
순서도는 어떤 문제를 해결하는 데 필요한 논리적인 단계들을 그 림으로 표시한다.
9
예: 메소드 작성
두 정수들을 입력 받아 그 중 작은 정수를 찾는 메소드를 작성해 보자.
메소드 머리부 작성
- 메소드 이름을 정한다: findMin
- 입력 받는 두 정수들을 나타내는 형식매개변수들의 이름들을 정해야 한다.
number1, number2
- 메소드가 반환하는 최솟값은 정수이므로 반환형은 int 이어야 한다.
예: 메소드 머리부 작성
int findMin(int number1, int number2)
반환유형
메소드이름 형식매개변수 목록
주: 형식매개변수 목록은 각 매개변수의 데이터 유형과 이름을 기술한다
11
메소드 알고리즘
최솟값을 저장하는 변수 minimum을 선언한다
minimum을 반환한다
끝
number1 < number2?
예
minimum = number1 minimum = number2 아니요
시작
예: 메소드 몸체 작성
메소드 몸체는 여는 중괄호({)로 시작하고 닫는 중괄호(})로 끝난다.
{
int minimum;
if (number1 < number2) minimum = number1;
else
minimum = number2;
return minimum;
}
주: return 문의 연산식의 결과 값의 데이터 형은 메소드의 반환유형과 같아
13
메소드 호출
메소드를 이용하려면 호출해야 한다.
메소드가 호출이 될 때, 프로그램의 실행은 호출된 메소드 몸체의 첫 문에서 시작된다.
메소드 몸체의 실행을 마친 후에 프로그램의 실행
은 메소드를 호출한 문으로 돌아가서 계속된다.
메소드 제어 흐름
호출된 메소드가 같은 클래스내에 있는 경우에는 호출시 메소드 이름만 필요하다.
myMethod();
myMethod
main
15
메소드 호출 방법
1. 메소드이름( )
2. 메소드이름(실제 매개변수 목록)
첫 번째 호출 유형은 매개변수가 없는 메소드를 호출한다.
두 번째 호출 유형은 매개변수(들)을 가진 메소드를 호출한다.
메소드가 호출될 때마다 호출문에 있는 실제 매개변수(들)은 형 식 매개변수(들)에 복사된다.
예: 메소드 호출
minvalue = findMin(value1, value2);
int findMin(int number1, int number2) { int minimum;
if (number1 < number2) minimum = number1;
else
minimum = number2;
return minimum;
17
메소드 분할
메소드는 한 개체로 쉽게 이해될 수 있도록 상대적으로 짧아야 한다.
긴 메소드는 명료하게 필요한 만큼 여러 개의 더 작은 메소드들로 분할되어야 한다.
재귀 메소드
특정 작업을 수행하기 위해 메소드는 보통 다른 메소드를 호출한다.
재귀 메소드(recursive method)는 몸체 내에서 자기 자신을 호출한다.
19
재귀
재귀(recursion)는 어떤 것을 자기 자신에 의해 정의하는 프로세스이다.
예 1: 선물 상자는 선물이다.
혹은 선물 상자는 선물과 선물 상자이다.
예 2: 숫자 목록은 숫자이다.
혹은 숫자 목록은 숫자, 숫자 목록이다.
58
38, 93, 28, 49
재귀 메소드 작성
1부터 N(≥ 1)까지의 합을 구하는 메소드를 작성하라.
sum(N) = 1 + 2 + . . . + N 의 재귀 정의
- sum(1) = 1
- sum(N) = sum(N - 1) + N, N ≥ 2
재귀 메소드 머리부 작성
- 메소드 이름: findSum
- 형식 매개변수: N – 넘겨 받는 정수
21
재귀 메소드 설계
가정: 입력받은 정수 N은 0보다 큰 정수이다 변수 sum: 1부터 N까지의 정수들의 합
알고리즘
1. 넘겨 받은 정수 N이 1이라면 합은 1이다. N이 1이 아니라면 합은 1부터 (N – 1)까지의 합에 N을 더한 값이다.
주: 1부터 (N – 1)까지의 합은 자기 자신의 메소드를 (N -1)
의 값을 가지고 다시 호출하여 구할 수 있다.
완성된 재귀 메소드
// 1부터 N(≥ 1)까지의 모든 정수들의 합을 구한다
int findSum(int N) { int sum;
if (N == 1) sum = 1;
else
sum = findSum(N - 1) + N;
return sum;
}
23
예제 프로그램
문제: 양의 정수 내에 있는 홀수 숫자들의 개수를 구하는 메소드를 작성하라.
반복을 이용하는 메소드 설계
매개 변수: N – 넘겨 받는 양의 정수 반환 값: 홀수 숫자들의 개수
지역 변수
- result: 홀수 숫자들의 개수
알고리즘
N > 0?
시작 result = 0
result = result + N % 2
result를 반환한다 아니요
예
N = N / 10
25
완성 메소드
// 양의 정수 내에 있는 홀수 숫자들의 개수를 구한다 public static int findNoOddNumbers1(int N)
{ int result = 0;
while (N > 0) {
result = result + N % 2;
N = N / 10;
}return result;
}
재귀 메소드 설계
매개 변수: N – 넘겨 받는 양의 정수 반환 값: 홀수 숫자들의 개수
의사코드 알고리즘
1.
N이 한 자리 숫자인 경우N 내의 홀수 숫자들의 개수는 N을 2로 나눈 나머지이다.
2.
N이 두 자리 이상의 숫자인 경우N 내의 홀수 숫자들의 개수는 N(혹은 N의 마지막 숫자)을 2로 나눈 나머지에 N의 마지막 숫자를 제거한 뒤 남은 숫자 내에 있는 홀수 숫자들의 개수를 더한 값이다.
27
재귀 메소드 순서도
N < 10?
시작
아니요
예
(findNoOddNumbers2(N / 10) + N % 2)를 반환한다
N%2를 반환한다
완성된 재귀 메소드
// 양의 정수 내에 있는 홀수 숫자들의 개수를 구한다 public static int findNoOddNumbers2(int N)
{
if (N < 10) return N % 2;
else return findNoOddNumbers2(N / 10) + N % 2;
}
29
메소드 작성 - 오류가 있는 예제
public char letterGrade (int Grade) { if (Grade >= 0 && Grade <=100) {
if (Grade >= 90) return (“A”);
if (Grade >= 80 || Grade < 90) return (“B”);
if (Grade >= 70 || Grade < 80) return (“C”);
if (Grade >= 60 || Grade < 70) return (“D”);
if (Grade <= 60) return (“F”);
} }
무엇이 잘못되었는가?
메소드 작성 – 고친 예제
public char letterGrade (int Grade) { char ReturnValue = ‘I’;
if (Grade >= 0 && Grade <=100) { if (Grade >= 90)
ReturnValue = ‘A’;
else if (Grade >= 80 && Grade < 90) ReturnValue = ‘B’;
else if (Grade >= 70 && Grade < 80) ReturnValue = ‘C’;
else if (Grade >= 60 && Grade < 70) ReturnValue = ‘D’;
elseReturnValue = ‘F’;
}
맞았는가?
31