PHP - 객체 복제

이 글을 통해 PHP 객체 복제에 대한 튜토리얼을 소개해 드립니다! 이 기사에서는 PHP에서 객체 복제 개념을 탐구하고 실용적인 예제를 제공해 드리겠습니다. 이 튜토리얼이 끝나면 PHP에서 객체를 복제하는 방법과 그 유용성에 대해 잘 이해하실 수 있을 것입니다. 그럼 바로 시작해 보겠습니다!

PHP - Cloning Objects

복제란 무엇인가요?

복제는 기존 객체가 새로운 객체로 복사되는 과정입니다. 이는 원본과 복제된 객체가 복제 시점에서 동일한 속성과 값을 가지게 된다는 뜻입니다. 그러나 이 두 객체는 서로 다른 인스턴스이므로, 하나에 대한 변경은 다른 하나에 영향을 미치지 않습니다.

PHP에서는 clone 키워드나 __clone() 메서드를 구현하여 객체를 복제할 수 있습니다. 두 방법 모두 살펴보겠습니다.

예제 1: "clone" 키워드 사용

먼저 clone 키워드를 사용하는 간단한 예제를 시작해 보겠습니다. Person 클래스를 생성하고 그 인스턴스를 복제해 보겠습니다.

class Person {
public $name;
public $age;

public function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
}
}

$person1 = new Person("Alice", 30);
$person2 = clone $person1;

echo "원본 사람: " . $person1->name . ", 나이: " . $person1->age . "\n";
echo "복제된 사람: " . $person2->name . ", 나이: " . $person2->age . "\n";

출력:

원본 사람: Alice, 나이: 30
복제된 사람: Alice, 나이: 30

와 같이 복제 후 $person1$person2는 동일한 이름과 나이를 가집니다. 이제 $person1을 변경해 보고 $person2에 영향을 미치는지 확인해 보겠습니다.

$person1->name = "Bob";

echo "원본 사람: " . $person1->name . ", 나이: " . $person1->age . "\n";
echo "복제된 사람: " . $person2->name . ", 나이: " . $person2->age . "\n";

출력:

원본 사람: Bob, 나이: 30
복제된 사람: Alice, 나이: 30

와 같이 $person1의 이름을 변경해도 $person2에는 영향을 미치지 않음을 확인할 수 있습니다. 이는 두 인스턴스가 별개임을 증명합니다.

예제 2: __clone() 메서드 사용

이제 __clone() 메서드를 사용하여 복제하는 방법을 살펴보겠습니다. __clone() 메서드는 객체가 복제될 때 호출되어 복제 과정에서 추가 작업을 수행할 수 있게 합니다.

class Person {
public $name;
public $age;

public function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
}

public function __clone() {
echo "새로운 사람이 복제되었습니다!\n";
}
}

$person1 = new Person("Alice", 30);
$person2 = clone $person1;

출력:

새로운 사람이 복제되었습니다!

와 같이 $person1을 복제할 때 __clone() 메서드가 자동으로 호출되어 메시지를 출력합니다. __clone() 메서드 내에 필요한 모든 맞춤 로직을 추가할 수 있습니다.

예제 3: __clone() 메서드로 깊은 복제

그런데 만약 복제할 객체가 다른 객체를 포함하고 있을 때는 어떻게 될까요? 이 경우 깊은 복제를 구현해야 모든 내부 객체도 올바르게 복제됩니다. 다음은 그 예제입니다:

class Address {
public $street;
public $city;

public function __construct($street, $city) {
$this->street = $street;
$this->city = $city;
}
}

class Person {
public $name;
public $age;
public $address;

public function __construct($name, $age, Address $address) {
$this->name = $name;
$this->age = $age;
$this->address = $address;
}

public function __clone() {
$this->address = clone $this->address;
}
}

$address = new Address("123 Main St", "New York");
$person1 = new Person("Alice", 30, $address);
$person2 = clone $person1;

echo "원본 사람: " . $person1->name . ", 나이: " . $person1->age . ", 주소: " . $person1->address->street . "\n";
echo "복제된 사람: " . $person2->name . ", 나이: " . $person2->age . ", 주소: " . $person2->address->street . "\n";

출력:

원본 사람: Alice, 나이: 30, 주소: 123 Main St
복제된 사람: Alice, 나이: 30, 주소: 123 Main St

와 같이 $person1을 복제했을 때, 내부에 포함된 Address 객체도 올바르게 복제되어 복제된 사람은 자신만의 주소를 가지게 됩니다.

결론

이 튜토리얼에서는 PHP에서 객체를 복제하는 기본 방법인 clone 키워드와 __clone() 메서드를 사용하는 방법을 다루었습니다. 단순한 객체 복제와 내부 객체를 포함한 깊은 복제를 어떻게 처리하는지 배웠습니다. 복제는 PHP에서 강력한 기능으로, 서로 다른 객체 인스턴스를 작업할 때 서로 영향을 미치지 않도록 할 수 있습니다.

Credits: Image by storyset