이번 포스팅은 일반적인 함수의 내용과 예제, 마지막으로 재귀함수의 내용을 다루고 있다.
1. 함수의 기본 이론
1) 함수의 3요소
- input은 입력되는 값으로, 인자·인수·입력값·매개변수·파라미터·args라고도 나타낼 수 있다.
- output은 출력되는 값으로, 리턴값·return·반환값·출력값·결과값으로 나타낼 수 있다.
- 기능
2) 추가 설명
함수는 호출이 되어야만 동작하며, 코드의 재사용이 가능하다.
인자로 사용되는 자료형에 제약이 없으며, 인자 개수에 대하여도 제약이 없다.
ex. 메서드명 (int num1, double num2) 등이 선언 가능하다.
2. 함수의 유형과 선언방법
1) 함수의 선언
public static output 함수명 (input){
(*리턴값이 있을 경우*)리턴값
(*리턴값이 있을 경우*)return;
}
2) 함수의 4가지 유형
- input X output X
public static void function (void:생략가능){ }
- input O output X
public static void function (int num){ }
- input X output O
- input O output O
3) return의 사용
일반적으로 값을 반환하기 위해 사용된다.
위에 설명된 3, 4유형이 아니더라도 함수 종료의 목적으로 가끔 사용된다.
이의 경우 함수를 즉시 종료시키는 역할을 하며, break와 비슷한 용도로 사용된다.
3. 함수명의 중복정의(OverLoading)
: 내용이 같거나, 매우 유사할때 주로 사용(ex. 두 정수의 합 / 두 실수의 합 등)
package calss03;
public class Test03 {
// 두 정수의 합
static int function(int num1, int num2) {
return num1 + num2;
}
//두 실수의 합
static double function(double num1, double num2) {
return num1 + num2;
}
//세 정수의 합
static int function(int num1, int num2, int num3) {
return num1 + num2 + num3;
}
public static void main(String[] args) {
System.out.println(function(3.77, 8.79));
System.out.println(function(8, 5));
System.out.println(function(6, 7, 2));
}
}
이처럼 3개의 메서드가 모두 "function"이라는 이름으로 동일하게 선언되어 있더라도,
입력할 값에 따라 상황에 맞게 사용 가능하다.
4. 예제
1) 예제 1
*오버로딩을 사용할 것*
Q 1. 하나의 정수가 입력되면 1~입력된 정수까지의 합을 출력한다. 이때, 1 미만의 값이 입력될 경우 사용 불가능.
Q 2. 두개의 정수가 입력되면 두 수 사이의 합을 출력.
package calss03;
public class Test03 {
// 하나의 정수
static void func(int num) {
int sum=0;
if (num<1) {
System.out.println("사용 불가능");
}
for(int i=1; i<=num; i++) {
sum += i;
}
System.out.println(sum);
}
// 두개의 정수
static void func(int num1, int num2) {
int sum=0;
if(num2<num1) {
int tmp = num1;
num1=num2;
num2=tmp;
}
for(int i=num1; i<=num2; i++) {
sum+=i;
}
System.out.println(sum);
}
public static void main(String[] args) {
func(9);
func(7, 4);
}
}
이와 같이 정상적으로 출력 되는 것을 확인 할 수 있다.
2) 예제 2
*학생수를 입력받은 만큼 배열을 생성하고 랜덤으로 점수 삽입*
Q 1. 0~59점은 F, 60~69점은 C, 70~79점은 B, 80~100점은 A를 메서드를 이용하여 출력하기
Q 2. 총합과 평균값을 메서드를 이용하여 나타내기
Q 3. 각 등급별 인원수 나타내기
package calss03;
import java.util.Random;
import java.util.Scanner;
public class Test02 {
static char fun1(int score) {
char grade;
if(score<60) {
grade = 'F';
}else if(score<70) {
grade = 'C';
}else if(score<80) {
grade = 'B';
}else {
grade = 'A';
}
return grade;
}
static void fun2(int [] stuData) {
int sum = 0;
for(int v:stuData) {
sum += v;
}
System.out.println("총합 : " + sum);
double avg = sum*1.0/stuData.length;
System.out.println("평균 : " + avg);
}
public static void main(String[] args) {
// 입력받은 학생수만큼의 배열 생성, 랜덤으로 점수 생성
Scanner sc = new Scanner(System.in);
Random r = new Random();
System.out.println("학생 수 입력: ");
int cnt = sc.nextInt();
int [] data = new int [cnt];
for(int i=0; i<data.length; i++) {
data[i] = r.nextInt(101);
}
for(int v:data) {
System.out.print(v + " ");
}
System.out.println();
//fun1 사용
int [] dataCnt = new int [4];
for(int i=0; i<data.length; i++) {
char grade = fun1(data[i]); // 입력받을 score는 data[i]
System.out.println( grade +"학점 입니다. "); // 여기까지 fun1을 이용한 출력
// 학점별 인원수 카운트
if(grade=='A') {
dataCnt[0]++;
}else if(grade=='B') {
dataCnt[1]++;
}else if(grade=='C') {
dataCnt[2]++;
}else {
dataCnt[3]++;
}
}
for(int v : dataCnt) {
System.out.print(v + " ");
}
System.out.println();
fun2(data);
}
}
3) 예제 3
Q 1. 배열만큼의 값을 랜덤으로 생성하고 메서드를 이용하여 가장 큰 값이 든 Index번호를 출력하라.
package calss03;
import java.util.Random;
public class Test01 {
// 배열이 들어오면 가장 큰 값의 index를 알려주는 메서드
static int fun(int [] data) {
int maxIndex =0; // 0이라고 가정하자
for(int i=0; i<data.length; i++) {
if(data[maxIndex]<data[i]) {
maxIndex = i;
}
}
return maxIndex;
}
public static void main(String[] args) {
Random r = new Random();
int [] data = new int [5];
for(int i=0; i<data.length; i++) {
data[i] = r.nextInt(11);
}
for(int v:data) {
System.out.print(v + " ");
}
System.out.println();
//메서드의 사용
int index = fun(data);
System.out.println("가장 큰 값이 든 index 번호는 [" + index + "]입니다.");
}
}
5. 재귀함수
1) 재귀함수란
: 종료조건을 필요로 하며, 함수 본인을 해결하기 위해 자기 자신을 불러오는 함수(순환호출하는 함수)이다. 예시로는 팩토리얼을 들 수 있다.
2) 팩토리얼
N!=N x N-1 x N-2 x ... x 2 x 1
N!=N x (N-1)!
f(x)=xf(x-1)
1!=1
3!=3x2x1=6
4!=4x3x2x1=24
5!=5x4x3x2x1=120
즉, 5!=5x4!
이처럼 팩토리얼은 자신을 해결하기 위해서는 기존의 값 혹은 결과물이 필요하다.
이와같이 본인을 해결하기 위해 본인을 순환호출하는 함수는 재귀함수임을 다시 한 번 확인할 수 있다.
static int function(int num) { // input=int : output=int
if(num<=1) { // 1!은 1이므로
return 1; // 1을 반환한다
}
return num * function(num - 1);
}
3) 실습
: 입렵된 정수의 각각의 1의자리를 호출 (ex. 1234입력 -> 1 2 3 4출력)
package dd;
public class Test01 {
static void function(int num) {
if(num/10!=0) { //스텍오버플로우 방지!0이 아니면 불러라
function(num/10); //
}
System.out.print(num%10+" "); //일의자리 출력
}
public static void main(String[] args) {
function(1342);
}
}
1 3 4 2가 출력된다.
메모리 상황을 간략하게 그림으로 확인하자면 아래와 같다
package dd;
public class Test01 {
static void function(int num) {
System.out.print(num%10+" "); //일의자리 출력
if(num/10!=0) { //스텍오버플로우 방지!0이 아니면 불러라
function(num/10); //
}
}
public static void main(String[] args) {
function(1342);
}
}
2 4 3 1이 출력된다.
'JAVA' 카테고리의 다른 글
[알고리즘] 퀵정렬 (0) | 2021.12.31 |
---|---|
[알고리즘] 버블정렬 & 이진탐색 (0) | 2021.12.31 |
[알고리즘] 선택정렬 (0) | 2021.12.26 |
[반복문] 랜덤과 중복제거 (0) | 2021.12.23 |
[제어문] 과제_up, down game (0) | 2021.12.23 |