배열 객체 복사와 관련해 질문이 있습니다.

조회수 860회

본 질문은 수강생의 질문을 해쉬코드로 옮긴 것입니다.

.

안녕하세요. 선생님~

질문이 있습니다.

.

function copyArray(array) {
  for ( var copy=[], i=0, l=array.length; i<l; ++i ) {
    copy[i] = array[i];
  }
  return copy;
}

var a = copyArray([3,6,9]);
var yu = [3,6,9,12];
var a = copyArray(yu);

.

에서 yu == ayu === a 처럼 false 가 나옵니다. yu == atrue 일 거라고 예상했습니다. 그래서 yu[1] == a[1]를 찍어보니 true입니다.

yu == afalse 일까요?

  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • 안녕하세요 ^ ㅡ ^

    질문에 답변 드립니다.

    먼저 코드를 통해 "참조"를 정리해봅시다.

    .

    // 변수 a,b,c 정의
    var a, b, c;
    
    // 변수에 동일한 객체 참조
    a = b = c = [3, 8, 12];
    
    // 각 변수가 동일한 객체를 참조하는 지 검증 
    console.log(a == b); // true
    console.log(b === c); // true
    
    // b 변수를 통해 객체를 변형
    b.shift(); // [8, 12]
    
    // 각 변수가 동일한 객체를 참조하는 지 검증 
    console.log(a == b); // true
    console.log(b === c); // true
    

    .

    각 변수가 참조하는 객체는 동일한 객체 라는 사실을 검증했습니다.

    그럼 이제는 질문을 살펴보고 이유를 알아봅시다. ^ ㅡ ^

    역시 코드를 먼저 본 후 이야기를 해보겠습니다.

    .

    // a변수에 배열 참조
    var a = [ 10, false, [1] ];
    
    // b 변수에 a 변수가 참조하는 배열 객체를 복사한 후 할당
    var b = copyArray(a); // [ 10, false, [1] ]
    
    // a, b 변수는 동일해보이지만, 동일한 객체를 참조하지 않음
    // 이유는 객체는 복사가 되면 더 이상 같은 객체가 아니기 때문
    console.log(a == b); // false
    console.log(a === b); // false
    

    .

    이 부분이 핵심입니다. 참조는 동일한 객체를 다수의 변수가 공유하지만, 복사된 객체는 더 이상 객체를 공유하지 않습니다. 즉, 복사된 객체는 동일해보여도 전혀 다른 객체입니다.

    자 그럼 코드를 적용해 결과를 봅시다.

    .

    var yu = [3,6,9,12];
    var a = copyArray(yu); // [3,6,9,12]
    
    console.log(yu == a); // false
    console.log(yu === a); // false
    

    .

    위에서 살펴본 코드 결과와 마찬가지로

    객체는 복사가 되면 동일한 객체처럼 보이나,

    동일한 객체가 아니라는 사실입니다.

    .

    이제 이유를 아시겠죠?

    yu == afalse 인지 말이죠.

    그리고 a[1] == yu[1]이 같은 이유는

    배열 복사 과정에서 원시 값은 값 복사 되었기 때문에

    데이터 값이 같다고 나오는 겁니다. ^ - ^

    • (•́ ✖ •̀)
      알 수 없는 사용자
  • 선생님, 제가 이해한 것이 맞는지 한 번 더 여쭤봅니다~

    -- yu, a 에 들어간 값은 같지만, 복사된 객체라 참조 위치가 다르기 때문에 ==, === 이 false라는 결과가 나옴

    -- 그러면 결론적으로 객체에 ==, === 연산자를 사용할 때, 원시타입과는 다르게 객체가 저장된 위치(?) 도 함께 비교되는 것으로 이해하면 될까요? ^

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 복사된 객체는 전혀 다른 객체로 메모리 상에 기억되는 위치가 다릅니다. 말씀하신 것처럼 참조 위치가 다른 거죠. ^^ 그리고 원시 타입은 상수 값으로 값 그 자체에 대한 비교 입니다. 비교 시 === 연산자는 타입을 변형 시키지 않는 반면, == 는 자동으로 타입을 변형 시켜 비교하기 때문에 == 는 사용하지 않는 것이 좋습니다. 마지막으로 객체가 참조하는 메모리 상의 주소가 다르면 같은 데이터가 아니므로 == 와 === 결과는 동일합니다. 알 수 없는 사용자 2018.9.6 00:27
    • 언제나 친절하게 궁금증을 해소해 주셔서 감사합니다~ 알 수 없는 사용자 2018.9.6 06:43
    • 언제나 친절하게 궁금증을 해소해 주셔서 감사합니다~ 알 수 없는 사용자 2018.9.6 06:43
    • 언제나 친절하게 궁금증을 해소해 주셔서 감사합니다~ 알 수 없는 사용자 2018.9.6 06:43

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)