함수 사용
Theme. 함수 호출 및 정의
함수를 사용하기 위한 기본적인 형식은 다음과 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
package test;
public class MainClass {
public static void main(String[] args) {
// 함수의 사용 방법
// 함수를 호출
}
//함수를 정의
//형식
/*
static return값의 자료형 함수명(parameter의 자료형, parameter명) {
처리할 코드
return 값;
}
*/
}
|
cs |
간단하게 함수를 만들어보면,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
package test;
public class MainClass {
public static void main(String[] args) {
//함수 호출
functionOne(123); //functionOne이라는 함수를 호출.
//이때 123은 argument이다.
}
//함수 정의
//함수 호출시 아래 처리 코드로 넘어가게 된다.
static void functionOne(int n) { //return값이 없는 경우 "void"라고 적음
System.out.println("호출한 수는 " + n + "입니다.");
}
}
|
cs |
위는 return값이 없어서 "void"라고 적었고, 실행 결과는 "호출한 수는 123입니다."이다.
즉, 함수에 들어가는 값은 있는데, 나오는 값이 없는 경우라고 말할 수 있다.
그렇다면 함수를 4가지로 나눈다면, 다음과 같이 나눌 수 있을 것이다.
1. 들어가는 값도 없고 나오는 값도 없는 함수
2. 들어가는 값은 있고 나오는 값은 없는 함수 (바로 위의 사례)
3. 들어가는 값은 없고 나오는 값은 있는 함수
4. 들어가는 값도 있고 나오는 값도 있는 함수 (가장 일반적인 함수의 사례)
간단하게 1번과 3번의 함수를 만들어보면,
1번 함수(들어가는 값도 없고 나오는 값도 없는 함수)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
package test;
public class MainClass {
public static void main(String[] args) {
//함수 호출
function(); //function이라는 함수를 호출.
}
//함수 정의
static void function() {
System.out.println("Merry X-mas");
}
}
|
cs |
결과는 "Merry X-mas"
3번 함수(들어가는 값은 없고 나오는 값은 있는 함수)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
package test;
import java.util.Arrays;
public class MainClass {
public static void main(String[] args) {
//함수 호출
//들어가는 값은 없고, 나오는 값은 정수로 된 배열 형태의 "arr"
int[] arr = function(); //function이라는 함수를 호출.
System.out.println(Arrays.toString(arr));
}
//함수 정의
static int[] function() {
int[] arr = {100,200,300};
return arr;
}
}
|
cs |
이제 가장 일반적인 함수의 형태를 만들어 보자.
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
32
|
package test;
public class MainClass {
public static void main(String[] args) {
//함수 호출
//함수 functionOne, functionTwo 순서로 호출되고 결과가 나온다.
int num = functionOne(7);
System.out.println(num);
int n = functionTwo('e',"hello");
System.out.println(n);
}
//함수 정의
//함수 functionOne에 대한 정의
static int functionOne(int n) {
int r;
r = n * 2;
return r;
}
//함수 functionTwo에 대한 정의
static int functionTwo(char c, String s) {
int r = s.indexOf(c + ""); // String인 s에서 char c가 몇번째에 있는지 찾는다.
return r; // c + ""를 통해 자료형을 String으로 만들었다.
}
}
|
cs |
Theme. 함수 호출 방법
함수 호출 방법은 크게 2가지가 있다.
1. Call by value(값에 의한 호출)
2. Call by reference(참조에 의한 호출) - address
두 가지 방법의 가장 큰 차이점은 원래의 값이 보존되는가이다.
즉, 값에 의한 호출의 경우 원래의 값을 복사하여 처리하는 것으로 원래의 값이 보존되지만,
참조에 의한 호출의 경우 원래의 값을 복사하지 않기 때문에 값이 보존되지 않는다.
기본적인 매개변수의 경우 call by value의 방법에 해당하나, 배열과 클래스의 경우 call by reference의 방법에 해당한다.
둘의 차이를 확인해보자.
1. Call by value(값에 의한 호출)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
package test;
public class MainClass {
public static void main(String[] args) {
//함수 호출
int num = 3;
funcOne(3);
System.out.println("num = " + num);
}
//함수 정의
static void funcOne(int n) {
n = n * 2;
System.out.println("n = " + n);
}
}
|
cs |
결과는 n = 6, num = 3이 나온다.
즉, 3이라는 value가 함수를 통해 6이라는 결과(n = 6)로 처리되었지만, 그 원래의 값은 변하지 않고 3(num = 3)이 나온 것을 확인할 수 있다.
2. Call by reference(참조에 의한 호출)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
package test;
public class MainClass {
public static void main(String[] args) {
//함수 호출
int[] array = new int[1];
array[0] = 3;
funcTwo(array);
System.out.println("array[0] = " + array[0]);
}
//함수 정의
static void funcTwo(int[] arr) {
arr[0] = arr[0] * 2;
System.out.println("arr[0] = " + arr[0]);
}
}
|
cs |
결과는 arr[0] = 6, array[0] = 6이 나온다.
즉, 배열 자체가 함수에 할당되어 원래의 값이 6으로 변한 것을 확인할 수 있다.