티스토리 뷰

자바스크립트를 공부하면서 나의 생각이 유연하지 못하구나.. 라는 생각을 자주한다. function 또한 나에게 혼란을 많이 가져왔고 아직 어려운 존재임에는 틀림이 없다. 우선 간단한 일반적인 예제다.

function square(number) {
  return number * number;
}

function 이란 키워드로 시작하며, { } (curly braces)을 기준으로  묶여 있다. 무엇을 리턴하는지 명시하지 않아도 되며, 받는 인자가 무슨 타입인지 선언하지 않는다. return 키워드를 쓰면 무언가를 계산해서 리턴하는 구나 라고 생각하면된다. 


자 이제, 궁금한게 생긴다. 함수를 호출할 때 건네주는 파라메터들은 Call by Value 와 Call by Reference 둘 중 어떤 방식으로 적용되는 것일까. 함수안에서 값을 변경하여 다른 값을 할당해주면 그 값은 함수 밖에서도 바뀌어 있을것인가.. 결론은 자바와 매우~ 비슷하다.


기본 자료형(string, number, boolean, null, undefined)을 파라메터로 넘겼을때 값(value)를 복사해서 넘겨준다. 그러므로 함수안에서 그 파라메터에 어떤 값을 할당하던지 뭘 하던지 간에 그건 그 함수안에서만 영향이 있을 뿐이다. 하지만 Object 를 넘겼을 때(기본자료형이 아닌, 배열이나 사용자정의 object 등을 말한다), 함수안에서 Object 의 속성값들을 변경할 수 있고 함수가 종료되더라도 원 데이터에 영향을 미친다. 하지만 새로운 객체를 따로 생성해서 값 자체를 새로 할당해서 변경할 수는 없다. 말이 점점 이상해지고 어려워지고 있지만. 예를 보면 명확하다.

function test7()
{
	var a = 0;
	console.log(a);		//변경전값 로그확인
	changeValue(a);		//함수호출!
	console.log(a);		//변경후값 로그확인
}

function changeValue(value)
{
	value = 10;
}

결과를 실행해보면 알겠지만 전혀 변하지 않는다. 원시데이터타입(기본자료형)은 값을 복사해 넘기기 때문에 원본데이터를 변형할 수 없다. 


그러면 배열이나 객체형에 대한 속성값 변경은 어떨까. 밑의 예제를 보자.

function test8()
{
	var mycar = {make: "Honda", model: "Accord", year: 1998},
		x,
		y;
	 
	x = mycar.make;     // x 변수에 mycar의 make 속성값을 저장한다.
	myFunc(mycar);		// 함수호출!
	y = mycar.make;     // y 변수에 mycar의 make 속성값을 저장한다.
	
	console.log("x : "+x+", y : "+y);
	//x : Honda, y : Toyota --> 이렇게 출력된다.
}


function myFunc(theObject) {
  theObject.make = "Toyota";
}

결과를 확인해보면 아주 잘 변경이 되는 것을 볼 수 있다. 


마지막으로 배열이나 객체형을 넘겨주지만 속성값이 아닌 그 값자체를 변경하려 했을 때는 어떻게 될까.

function test9(){ 
	var mycar = {make: "Honda", model: "Accord", year: 1998},
		x,
		y;
	 
	x = mycar.make;     // x 변수에 mycar의 make 속성값을 저장한다.
	myFunc2(mycar);
	y = mycar.make;     // y 변수에 mycar의 make 속성값을 저장한다.
	
	console.log("x : "+x+", y : "+y);
}

function myFunc2(theObject) {
  theObject = {make: "Ford", model: "Focus", year: 2006};
}

아.. 변경되지 않는다. 값 자체를 새로할당 하는 것은 허용되지 않는다. 위에서 알아본 3가지 케이스모두 자바(java)와 같은 결과를 보여주고 있다. 자바에 익숙하신분이라면 새로울 것도 놀랄 것도 없겠지만 생소하신분은 유념해서 함수(function)를 사용해야 할 듯 하다.


결론 : 자바스크립트는 항상 Call by value 이며, 객체나 배열같은 참조형(Reference) 타입인 경우에도 실제로는 그 복사본을 만들어 value로  function 에 파라메터를 전달하게 되는 것이다. 그래서 function으로 넘겨받은 파라메터안에 있는 해당 속성(properties)들의 값은 변경이 가능해도 막상 자기자신의 값을 초기화해서 다시 새로운 값으로 할당받을 수가 없는 것이다.


반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
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
글 보관함