본문 바로가기
Programming Study

[JAVA] Java의 인자 전달

by 푸고배 2017. 7. 8.

인자(매개변수)전달에는 크게 두 가지가 있다.

개념을 이해를 돕기위해 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

반응형

댓글