JAVA/JAVA 관련

자바 매개변수 전달 방식(call by value, call by reference)

반응형

기본 자료형으로 선언된 변수를 함수의 매개변수로 사용하는 것처럼  클래스로 선언된 객체도 함수의 매개변수로 사용할 수 있다. 또한 동일한 클래스형으로 선언된 객체끼리는 대입 연산자로 값을 치환할 수 있다(대입 외의 다른 연산자는 사용 불가. 객체에서 객체를 더하고 빼고 곱하고 나누면 이상하잖아?). 만약 객체 단위로 치환하면 객체 내의 모든 멤버변수 값이 복사된다.


- 객체에 대한 값에 의한 전달 방식


값에 의한 전달 방식은 함수를 호출할 때 기술한 실 매개변수(함수를 사용할 때 넘겨준 변수)의 값만 함수 측의 형식 매개변수(함수 내에서 매개변수를 받기 위해 선언한 변수)로 전달된다. 즉, 형식 매개변수는 실 매개변수와는 별개의 기억공간이 할당되고 여기에 값만 복사된다. 실 매개변수와 동일한 클래스형으로 선언된 형식 매개변수로 객체끼리 값을 치환할 수 있지만, 함수 내부에서 멤버변수의 값을 변경해도 함수 호출 후에는 실 매개변수의 값은 바뀌지 않는다.


- 객체를 함수의 결과값으로 사용하기


이것은 함수의 반환값이 객체인 경우이다. 정수형이나 실수형 같은 기본 자료형을 함수의 결과값으로 반환할 수 있듯이 return 문 다음에 객체를 기술해 객체를 반환할 수 있다. 물론 이때 함수의 자료형은 return 다음에 기술한 값과 같아야 하므로 함수의 자료형이 클래스로 선언되어야 한다.


- 객체에 대한 주소에 의한 전달 방식


값에 의한 전달 방식과 비슷하지만, 값이 아닌 객체의 주소를 넘겨주고 이를 사용해 계산하는 방식이다. 이렇게 되면 실 매개변수 = 형식 매개변수(포인터 이므로) 라는 공식이 성립된다. 그렇기에, 함수 호출 후에 내부에서 멤버변수의 값을 변경하면 그 값들이 실 매개변수에 적용되게 된다. 물론 함수 내부에서 객체를 다룰 때에는 포인터로서 다뤄야 한다.(이는 포인터 변수와 유사하므로 크게 어려움은 없을 것이다)


- 객체에 대한 레퍼런스에 의한 전달 방식


레퍼런스 변수는 메모리를 따로 할당받지 않고 실 매개변수의 별칭으로 이름만 하나 더 부여되기 때문에 레퍼런스 변수로 접근하여 값을 변경하면 실 매개변수의 값도 변경된다. 이와 같은 원리로 객체도 레퍼런스로 선언하여 함수 내부에서 실 매개변수의 값을 변경할 수 있다. 게다가 레퍼런스 변수의 경우 별도의 메모리 할당이 없으므로 메모리를 효율적으로 사용할 수 있다. 이건 특별히 예문을 써놓겠다.


void CopyComplex(Complex &des, const Complex &src)

{

des = src;

}


-----------------------------------------------------------------


void main()

{

Complex x(10,20);

Complex y(30,40);

CopyComplex(y,x);

}


위의 예문에서 des와 src가 레퍼런스로 선언된 객체이다. main의 마지막 줄에서 CopyComplex가 호출되면 des는 객체 y를, src는 객체 x를 가르키는 레퍼런스 변수가 된다(엄밀히 따지면 객체지만 편의상 변수라고 쓰겠다). des는 실 매개변수 값이 변경되도록 하기 위해서 레퍼런스 변수로 선언한 것이고, src는 메모리를 효율적으로 사용하기 위해 레퍼런스 변수로 선언한 것이다. 이때문에 src 앞에 예약어인 const를 붙여서 함수 내부에서 src의 내용이 변질되는 것을 막아 놓았다. 이로써 CopyComplex 함수 내부에서 객체x의 값을 객체y에 대입할 수 있게 된다. 그리고 여기서 약간의 수정을 거치면 이러한 것도 가능하다.


void & CopyComplex(Complex &des, const Complex &src)

{

des = src;

return des;

}


위와 같이 함수명 앞에 &를 붙이면, 함수의 결과값을 저장할 기억공간이 따로 마련되지 않고 return문 다음에 기술한 변수의 별칭이 된다. 즉, CopyComplex 함수는 des의 별칭이 되고 des는 x의 별칭이므로 하나의 기억공간이 3개의 이름으로 사용되는 것이다.

반응형

'JAVA > JAVA 관련' 카테고리의 다른 글

Java 문자열의 toString과 valueOf의 차이  (0) 2018.05.28
인스턴스 메소드와 정적 메소드  (0) 2016.12.22
java 향상된 for문  (5) 2016.12.22
java 오토박싱 예제  (0) 2016.12.22
java 객체 비교를 위한 equals 예제  (0) 2016.12.22