Post

[매일매일]프론트엔드 기술일기: JS 함수에서 참조가 바뀌면 어떤 일이 일어날까?

이번 포스트에서는 Call by Value, Call by Reference, Call by Sharing 개념을 예제 기반으로 명확하게 정리합니다.​안녕하세요, [매일매일] 기술일기입니다.오늘은 자바스크립트 함수 호출 방식인 Call by Value, Call by Reference, 그리고 Call by Sharing 개념을 다룰 거예요.​예제를 먼저 살펴보고, 어떤 값이 왜 바뀌었는지 차근차근 분석해보겠습니다.이번 정리는 매일메일 문제와 함께, 직접 실습한 예제를 바탕으로 정리해봅니다.​💻 예제 코드

function change(a, b, c) { a = ‘a changed’ b = { b: ‘changed’ }; c.c = ‘changed’; }

let a = ‘a unchanged’; let b = { b: ‘unchanged’ }; let c = { c: ‘unchanged’ };

change(a, b, c);

console.log(a, b, c); // ?

​🔍 실행 결과

// 결과 출력 “a unchanged” { b: “unchanged” } { c: “changed” }

​JavaScript Call by Value vs Reference

🧠 왜 이렇게 나올까? — 파라미터 전달 방식의 차이자바스크립트는 함수에 인자를 넘길 때 모두 Call by Value 방식으로 처리합니다.하지만 값의 “종류”가 원시 타입인지 객체인지에 따라 동작 방식이 달라집니다.

1️⃣ a = ‘a unchanged’ (문자열 - 원시값)a는 문자열이므로 값 자체의 복사본이 함수로 전달됩니다.함수 안에서 a = ‘a changed’를 해도, 복사된 값만 바뀌고 원본에는 영향을 주지 않습니다.🧾 결과: 그대로 “a unchanged”

2️⃣ b = { b: ‘unchanged’ } (객체 - 참조형)객체는 참조값(주소)의 복사본이 전달됩니다.하지만 함수 안에서 b = { b: ‘changed’ }처럼 새 객체를 할당하면,→ 함수 안의 b는 완전히 새로운 참조를 갖게 됨→ 외부의 b에는 영향이 없음🧾 결과: 여전히 { b: ‘unchanged’ }

3️⃣ c = { c: ‘unchanged’ } (객체 - 참조형)c도 참조형이지만, 이번엔 객체의 속성만 변경합니다: c.c = ‘changed’이 경우는 같은 객체의 속성을 바꾸는 것이므로 외부에서도 변경이 반영됩니다.🧾 결과: { c: ‘changed’ }

🔑 요약 정리​

항목

전달 방식

함수 내 변경 방식

외부에 영향 있음?

결과

a

Call by Value (원시값 복사)

a = ‘a changed’ (재할당)

❌

“a unchanged”

b

참조값 복사

b = { b: ‘changed’ } (새 객체 할당)

❌

{ b: ‘unchanged’ }

c

참조값 복사

c.c = ‘changed’ (속성 변경)

✅

{ c: ‘changed’ }

🧪 관련 개념: Call by Value vs. Reference vs. Sharing✅ Call by Value자바스크립트의 기본 방식함수로 넘어가는 건 값의 복사본 (객체는 참조값의 복사본)​✅ Call by Reference값이 아닌 참조 주소 자체를 넘긴다 (JS에는 없음)​✅ Call by Sharing (JS에서 일어나는 실제 방식)참조값(주소)의 복사본을 넘겨서, 내부에서 속성을 변경하면 외부도 영향받음하지만 재할당은 외부에 영향을 주지 않음​

This post is licensed under CC BY 4.0 by the author.