정상우
hELLO.
정상우
전체 방문자
382,758
오늘
92
어제
709
  • hELLO. (121)
    • 컴퓨터과학 (4)
      • 알고리즘 & 자료구조 (4)
    • 언어 & 프레임워크 (63)
      • Go (23)
      • PHP & Laravel (40)
    • 웹 (7)
    • 블록체인 (12)
      • 메인넷 (9)
      • 암호화폐 플랫폼 (3)
    • 포트폴리오 (10)
    • 칼럼 (20)
      • 에세이 (4)
      • 개발자스럽게 살기 (14)
      • 회고 (2)
    • 티스토리 (5)

블로그 메뉴

  • ⚡ 개발자 이력서
  • 🌟 깃허브
  • 💻 강의
  • ✨ 예제코드
  • ⭐ 브런치
  • 태그 클라우드
  • 방명록

공지사항

  • 2차 도메인을 설정했습니다 ✨

인기 글

  • JWT(JSON Web Token)의 개념부⋯
    2021.07.29
    JWT(JSON Web Token)의 개념부⋯
  • 'REST' 를 보다 'RESTful' 하게⋯
    2021.08.14
    'REST' 를 보다 'RESTful' 하게⋯
  • [Laravel] 라라벨 프레임워크⋯
    2021.06.10
    [Laravel] 라라벨 프레임워크⋯
  • 깃허브를 포트폴리오로 쓰려면⋯
    2021.12.25
    깃허브를 포트폴리오로 쓰려면⋯
  • 암호화폐 트레이딩 봇을 만들었⋯
    2021.05.12
    암호화폐 트레이딩 봇을 만들었⋯

태그

  • go
  • 프로그래머스
  • 포트폴리오
  • 개발
  • 코딩테스트
  • 블록체인
  • php
  • 라라벨
  • 개발 리뷰
  • Algorithm

최근 댓글

  • 고맙습니다 ~^^
    정상우
  • 오늘 블로그 만들었는데 검색하⋯
    엥뿌삐
  • 좋은 스킨 정말 감사드립니다.⋯
    이태홍
  • 고맙습니다 ㅎㅎ
    정상우
  • 제가 원하던 최고의 스킨입니다⋯
    _HEON

최근 글

  • 빠르게 성장하는 개발자의 세⋯
    2022.06.08
    빠르게 성장하는 개발자의 세⋯
  • 개발자와 엔지니어, 그 사이에서
    2022.05.10
    개발자와 엔지니어, 그 사이에서
  • 아임포트(Iamport)로 결제기능⋯
    2022.04.03
    아임포트(Iamport)로 결제기능⋯
  • 아임포트(Iamport)로 결제기능⋯
    2022.04.01
    아임포트(Iamport)로 결제기능⋯
  • [Laravel] 카페24 호스팅에 라⋯
    2022.03.29
    [Laravel] 카페24 호스팅에 라⋯

티스토리

hELLO · Designed By 정상우.
정상우

hELLO.

언어 & 프레임워크/PHP & Laravel

PHP: 객체 비교와 복사

2020. 4. 25. 04:48

객체 비교

객체에 대한 비교는 단순히 가지고 있는 값이 똑같은지 비교하는 것과 객체의 주소값이 같은지를 비교하는 것이 있습니다. 각각 ==, === 연산자를 사용하고, 아래의 코드를 보면, 두 개의 객체는 서로 다른 주소값을 가지고 있기 때문에 === 를 사용했을 때 false 를 반환합니다. 아주 단순하지만 이는 중요합니다.

$class1 = new stdClass();
$class2 = new stdClass();

var_dump($class1 == $class2); // -> true
var_dump($class1 === $class2); // -> false

객체 복사

결론부터 이야기하자면 PHP는 clone 키워드를 통해 복사하는 경우 기본적으로 얕은 복사입니다. 복사는 단순 복사, 얕은 복사, 깊은 복사가 존재하는데 저마다 다릅니다. 또한 참조까지 잠깐 이야기해보도록 하겠습니다.

단순 복사

단순 복사는 객체의 주소값만 복사합니다. 따라서 어느 한 쪽의 상태가 변경되면 다른 한 쪽의 상태도 변경됩니다. 

// $class3 = $class1 = <Object Id>
$class3 = $class1;

$class1->message = 'Hello, world';
var_dump($class3->message); // -> Hello, world

참조

참조는 단순 복사와 비슷하게 움직이지만, 내부적으로 다릅니다. 주소값을 복사한다기 보다는 그냥 같은 공간을 공유하고 있는 것이죠.

// ($myclass3, $myclass1) = <Object Id>
$class3 =& $class1;

$class1->message = 'Hello, world';
var_dump($class3->message); // -> Hello, world

얕은 복사

얕은 복사는 외부 객체는 깊은 복사처럼 객체를 새로 만들지만, 만약 객체 내부에 또 다른 객체가 있다면 그 객체는 주소값만 복사됩니다. clone 키워드를 통해 사용합니다.

$class3 = clone $class1;
var_dump($class1 === $class3); // -> false

$array1 = new ArrayObject([ 1, 2, new ArrayObject([ 3, 4 ]) ]);
$array2 = clone $array1;

var_dump($array1[2] === $array2[2]); // -> true

깊은 복사

깊은 복사는 객체 내부에 있는 객체까지 새로 만듭니다. 이것은 별도로 구현해야 합니다. 매직 메서드 __clone() 은 clone 키워드로 복사를 할 때 호출되는데, 여기서 깊은 복사를 처리해줄 수 있습니다. 예를 들면 다음과 같이 말이죠!

class MyArrayObject implements ArrayAccess, IteratorAggregate
{
    public function __clone()
    {
        array_walk($this->container, fn (&$value) => is_object($value) ? $value = clone $value : null);
    }
    
    // ...
}

$array1 = new MyArrayObject([ 1, 2, new MyArrayObject([ 3, 4 ]) ]);
$array2 = clone $array1;

var_dump($array1 === $array2); // -> false
var_dump($array1[2] === $array2[2]); // -> false

내부에 있는 객체를 돌면서 요소가 객체라면 clone 을 사용하여 복사처리를 해주는 것을 볼 수 있습니다.

Serialize

직렬화를 사용해도 깊은 복사를 할 수 있습니다. 매직 메서드를 사용할 필요도 없이 그저 serialize(), unserialize() 를 사용하면 됩니다.

$array2 =  unserialize(serialize($array1));

var_dump($array1 === $array2); // -> false
var_dump($array1[2] === $array2[2]); // -> false

더 읽을거리

https://www.inflearn.com/course/php7-reboot

https://www.inflearn.com/course/php7-oop

PHP 카테고리 목차 및 문서 정리

2020년, PHP 언어가 가지는 의미

https://www.php.net/manual/en/

    '언어 & 프레임워크/PHP & Laravel' 카테고리의 다른 글
    • PHP: 쿠키와 세션
    • PHP: HTML 폼 (GET, POST)
    • PHP: 참조 (WeakReference)
    • PHP: 제네레이터 (Iterator)
    clone, php, 깊은 복사, 단순 복사, 복사, 비교, 얕은 복사
    정상우
    정상우
    과거의 배움으로 현재를 바꾸고 미래를 만듭니다. #25+2살 #INFJ #개발자 #브런치작가
    댓글쓰기
    다음 글
    티스토리 플러그인, 아직도 사용 안 하니?
    이전 글
    PHP: 참조 (WeakReference)
    • 이전
    • 1
    • ···
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • ···
    • 121
    • 다음

    티스토리툴바