티스토리 뷰
자바스크립트를 공부하면서 나의 생각이 유연하지 못하구나.. 라는 생각을 자주한다. 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
- 맥북
- 이클립스
- docker
- eclipse
- 알뜰요금제
- java
- ktm모바일
- heroku
- Spring
- ubuntu
- R
- 자급제폰
- javascript
- MongoDB
- MySQL
- vagrant
- ggplot2
- 도넛차트
- 아이맥
- github
- Oracle
- 마인크래프트
- MyBatis
- ipTIME
- SVN
- ggplot
- Google Chart Tools
- 셀프개통
- python
- 막대그래프
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |