[코드잇 스프린트 3기] Pre-course - 자료형 심화3. 기본형과 참조형

YUYONI·2023년 10월 28일
0
post-thumbnail

보통 String, Number, Boolean, Null, Undefined 와 같은 자료형을 기본형이라고 하고
Object나 Array 같은 자료형은 참조형이라고 함

기본형과 참조형의 차이

먼저 기본형의 경우는

let x = 3 이라고 하고 let y = x 이라고 정의했을 때, 둘을 출력해보면 모두 3이라고 나옴.
그리고 y에 값을 재할당 했을 때, y = 8 x와 y를 출력해보면 3, 8이 나옴. 즉 y에 값을 재할당해도 바뀌지않음

하지만 참조형의 경우

let x = {name : 'yuyeon'} 을 정의하고 let y = x 라고 하면 둘 모두 {name : 'yuyeon'} 가 나옴. 그리고 y에 y.birth = 990116이라는 새로운 프로퍼티를 추가한다고 했을 때 y를 출력하면 {name : 'yuyeon', birth : 990116} 라고 나오는 건 당연하고, 이 때 x를 출력해보면 x에도 birth가 추가된 걸 볼 수 있음!

변수에 객체값을 할당할 경우 객체값 자체가 변수에 저장되는 게 아니라 객체가 어딘가에서 만들어지고 변수에는 객체값으로 가는 주소가 저장됨

그래서 각 변수는 주소값을 참조해서 객체값에 접근하기 때문에 객체나 배열같은 자료형은 참조형이라고 부름!

참조형 복사하기

만약 주소값이 아닌 값만 복사하고 싶다면 어떻게 하면되냐
slice메소드를 이용하면 됨

slice의 파라미터로 아무것도 전달하지 않으면 전체가 복사되므로 이를 이용해 복사해오면 됨

let numbers1 = [1,2,3];
let numbers2 = numbers1.slice();

numbers2.push(4);

console.log(numbers1);  // [1,2,3]
console.log(numbers2);  // [1,2,3,4]

배열의 경우는 위와 같고,

객체도 참조형이므로 아래와 같이 주소값을 참조하기 때문에 course2를변경해도 course1도 바뀜

let course1 = {
  title : 'Hello World!',
  language : 'javascript'
};

let course2 = course1;

course2.language = 'python';

console.log(course1);  // {title : 'Hello World!', language : 'python'};
console.log(course2);  // {title : 'Hello World!', language : 'python'};

그럼 객체도 배열의 slice와 같은 복사 함수가 있을까?
있다. 내장된 함수 중 object객체에 사용할 수 있는 assign함수를 이용하면 된다

let course1 = {
  title : 'Hello World!',
  language : 'javascript'
};

let course2 = Object.assign({}, course1);

course2.language = 'python';

console.log(course1);  // {title : 'Hello World!', language : 'javascript'};
console.log(course2);  // {title : 'Hello World!', language : 'python'};

혹은 그냥 for in문을 사용해서 직접 프로퍼티들을 복사해주면 됨

let course1 = {
  title : 'Hello World!',
  language : 'javascript'
};

let course2 = {}

for (let key in course1) {
  course2[key] = course1[key];
}

course2.language = 'python';

console.log(course1);  // {title : 'Hello World!', language : 'javascript'};
console.log(course2);  // {title : 'Hello World!', language : 'python'};

하지만 위와 같이 사용할 경우 범용성이 떨어짐(course2[key] = course1[key];라고 했기 때문에 course3가 새로생기면 적용 불가)
그러므로 이런 형식의 함수를 만들어 사용하는 걸 추천

참고로 array의 slice나 object의 assign, for in문을 이용한 방법 모두 요소나 프로퍼티가 일반형이기 때문에 가능한 것임.
만약 요소나 프로퍼티가 참조형으로 이루어져있다면 또 주소값을 복사해오게 되므로 다른 방법을 써야함

profile
기본기와 원리, 개념 철처하게 다지기!

0개의 댓글