인자(매개변수)전달에는 크게 두 가지가 있다.
개념을 이해를 돕기위해 C언어로 간단한 예제를 만들어보았다.
※ Call By Value와 Call By Reference
- Call By Value(값에 의한 전달)
인자로 값을 넘겨주는 방법
#include <stdio.h>
void swap(int a, int b){ // a와 b의 값을 바꿔주는 함수
int temp;
temp = a;
a = b;
b = temp;
}
int main(void) {
int x = 10;
int y = 20;
printf("x = %d, y = %d \n",x,y);
swap(x,y);
printf("x = %d, y = %d \n",x,y);
return 0;
}
x = 10, y = 20
x = 10, y = 20
Swap함수를 통해 x와 y 값을 바꾸어 주었지만 결과는 바뀌지 않았다.왜 그런 것일까?그림으로 이해하자면
값을 전달 받아서 서로 swap했지만 a와 b가 가리키는 값이 바뀔 뿐 main 함수에 있는 x, y의 값은 변동이 없다.
- Call By Reference(참조에 의한 전달)
인자로 주소값을 넘겨주는 방법
#include <stdio.h>
void swap(int *a, int *b){ // a와 b의 값을 바꿔주는 함수
int *temp;
*temp = *a;
*a = *b;
*b = *temp;
}
int main(void) {
int x = 10;
int y = 20;
printf("x = %d, y = %d \n",x,y);
swap(&x,&y);
printf("x = %d, y = %d \n",x,y);
return 0;
}
x = 10, y = 20
x = 20, y = 10
포인터를 사용해서 Swap함수를 구현하니 원하는 결과를 얻을 수 있었다.
참조에 의한 복사를 그림으로 이해하자면
주소값을 전달받아 포인터 연산자를 통해 주소값에 있는 값에 접근한다. 이때 이 값은 x, y가 가리키는 값이기 때문에 *a와 *b를 swap해주는 것은 main함수의 x, y를 swap해주는 것과 같기 때문에 값이 바뀌게 된다.
※ JAVA의 인자 전달
- 자바에서 지원하는 타입에는 primitive type과 reference type이 있다.
- primitive type : byte, char, short, int, long, float, double, boolean 등과 같은 자바 기본 타입
- reference type : java.lang.object를 상속받는 모든 객체
1. primitive type이 인자로 전달되는 경우
public class test1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int a = 10;
System.out.println("a = "+a);
add(a);
System.out.println("a = "+a);
}
static void add(int x) { // a의 값을 1증가 시켜주는 함수
x++;
}
}
a = 10 a = 10
값이 바뀌지 않는 것을 보아 Call By Value임을 알 수 있다.
2. 객체 레퍼런스가 인자로 전달되는 경우
class Point{
int x;
Point(int x){
this.x = x;
}
}
public class test2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Point p = new Point(10);
System.out.println("a = "+p.x);
add(p);
System.out.println("a = "+p.x);
}
static void add(Point a) { // a.x 값을 1 증가 시켜주는 함수
a.x++;
}
}
a = 10 a = 11
값이 바뀌는 것을 보아 Call By Reference임을 알 수 있다.
3. 배열이 인자로 전달되는 경우
public class test2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int a[] = {10, 20};
System.out.println("x = "+a[0]+", y = "+a[1]);
swap(a);
System.out.println("x = "+a[0]+", y = "+a[1]);
}
static void swap(int x[]) { // x[0]와 x[y] 값을 교환하는 함수
int temp = x[0];
x[0] = x[1];
x[1] = temp;
}
}
x = 10, y = 20 x = 20, y = 10
값이 바뀌는 것을 보아 Call By Reference임을 알 수 있다.
[정리] primitive type은 Call By Value, reference type은 Call By Value
참고자료 : 생능출판 명품 JAVA Programming
'Programming Study' 카테고리의 다른 글
[명품자바프로그래밍] 5장 실습문제(2) (0) | 2017.08.12 |
---|---|
[JAVA] ==와 equals() 문자열 비교 (0) | 2017.07.07 |
댓글