본문 바로가기

javascript

자바스크립트 기본타입과 참조타입


자바스크립트에서 기본 규칙은 다음과 같다.
기본타입은 값에 의해서 조작되고 참조 타입은 참조에 의해서 조작된다.

숫자와 불리언 타입은 기본타입이며 객체는 참조 타입이다.
객체의 특수한 종류인 배열이나 함수도 마찬가지로 참조 타입이다.

문자열도 기본타입으로 취급된다.

값에 의한 데이터 조작과 참조에 의한 데이터 조작의 예를 살펴보자.

값에 의한 데이터 조작의 예

// 먼저, 값에 의한 복사를 보여준다.
var n = 1;     // 변수 n은 값 1을 담는다.
var m = n;    // 값에 의한 복사. 변수 m은 별개의 값 1을 담는다.

//값에 의한 전달을 보여 주는 용도로 사용할 함수
function add_to_total(total, x)
{
     total = total + x;     // 이 줄은 total의 내부 복사본만 변경된다.
}

// 이제 위의 함수를 호출하면서 값에 의해 변수 n과 m에 담겨 있는 숫자들을 전달한다.
// n의 값은 복사되고 복사된 값은 함수 내에서 total이라는 이름을 갖게 된다.
// 함수 내에서 m의 복사본을 n의 복사본에 더한다. 그러나 복사본에 무언가를 더하는 것은
// 함수 외부에 있는 n의 원본 값에 영향을 주지 않는다.
// 따라서, 이 함수 호출은 아무 일도 수행하지 않는다.
add_to_total(n, m);

// 이제 값에 의한 비교를 해보면 다음 줄에서 1은 프로그램 내에 나타난 확실히 구분되는 숫자 값이다.
// 이 1을 변수 n에 담겨있는 값과 비교한다.
// 값에 의한 비교에서는 두 숫자 값이 동일한지 알아보기 위해서 두 숫자를 구성하는 바이트들을 비교한다.
if (n == 1) m = 2;     // n의 값은 1의 값과 동일하다. 이제 m은 2가 되었다.


참조에 의한 데이터 조작의 예

// 2011년 크리스마스를 표현하는 객체를 생성한다.
// 변수 xmas는 생성된 객체 자체를 담지 않고, 그 객체에 대한 참조를 담는다.
var xmax = new Date(2011, 12, 25);

// 참조에 의한 복사를 수행하면 원본 객체에 대한 새로운 참조를 얻는다.
var solstice = xmas;     // 이제 두 변수 모두 동일한 객체 값을 참조한다.

// 여기서 객체에 대한 참조를 통해 객체를 변경한다.
solstice.setDate(21);

// 변경사항은 원본 참조에서도 보인다.
xmas.getDate();     // 원본 값인 25가 아닌 21을 반환한다.

// 객체나 배열이 함수에 전달되는 경우에도 동일하게 적용된다.
// 다음 함수는 배열의 각 원소에 어떤 값을 더한다.
// 함수에 배열의 복사본이 아닌 배열에 대한 참조가 전달되었다.
// 따라서 함수는 참조를 통해 배열의 내용을 변경할 수 있고
// 변경사항은 함수가 종료된 후에도 보인다.
function add_to_totals(totals, x)
{
     totals[0] = totals[0] + x;
     totals[1] = totals[1] + x;
     totals[2] = totals[2] + x;
}

// 마지막으로 참조에 의한 비교를 살펴보자.
// 비록 우리는 두 변수가 서로 다른 날짜를 참조하게 만들려고 했지만
// 둘다 동일한 객체를 참조하고 있으므로 두 변수를 비교하면 동일하다는 결과가 나온다.
(xmas == solstice)     // true로 출력

// 다음에 정의되는 두 변수는 동일한 날짜를 표현하지만 서로 별개인 두 객체를 참조한다.
var xmas = new Date(2011, 12, 25);
var xmas2 = new Date(2011, 12, 25);

// 별개의 객체는 동일하지 않다.
(xmas != xmas2)     // true로 출력

'javascript' 카테고리의 다른 글

WebApps FUTURECON 2011 서울 후기  (0) 2011.02.24
자바스크립트 null & undefined  (0) 2011.02.21
dynamic selectbox with getJSON  (0) 2011.02.18