PHP - 생성자와 소멸자
PHP 프로그래밍의 세계 여정에 오신 것을 환영합니다! 오늘 우리는 PHP 클래스에서 가질 수 있는 두 가지 특별한 함수에 대해 깊이 탐구해보겠습니다: __construct()
와 __destruct()
. 이 두 함수는 각각 생성자와 소멸자로 알려져 있으며, 객체의 수명 관리에서 중요한 역할을 합니다. 시작해보겠습니다!
__construct() 함수
__construct()
함수는 클래스의 객체가 생성될 때 자동으로 호출되는 특별한 메서드입니다. 새로운 객체를 위한 환영 파티 같은东西입니다! 이를 통해 속성을 초기화하거나 객체에 필요한 설정 작업을 수행할 수 있습니다.
예제 1: 기본 생성자
class Fruit {
public $name;
public function __construct($fruitName) {
$this->name = $fruitName;
}
}
$apple = new Fruit("Apple");
echo $apple->name; // 출력: Apple
이 예제에서 우리는 Fruit
클래스를 정의하고, 생성자가 $fruitName
이라는 매개변수를 받는 생성자를 추가했습니다. 새로운 Fruit
객체를 생성할 때 "Apple"을 인자로 전달하여 객체의 $name
속성을 "Apple"로 설정합니다.
매개변수화된 생성자
매개변수화된 생성자는 생성자에 매개변수를 전달할 수 있게 하여 더 유연하게 만듭니다. 이렇게 하면 제공된 매개변수에 따라 다른 초기 상태의 객체를 생성할 수 있습니다.
예제 2: 매개변수화된 생성자
class Car {
public $make;
public $model;
public $year;
public function __construct($make, $model, $year) {
$this->make = $make;
$this->model = $model;
$this->year = $year;
}
}
$myCar = new Car("Toyota", "Camry", 2020);
echo $myCar->make; // 출력: Toyota
echo $myCar->model; // 출력: Camry
echo $myCar->year; // 출력: 2020
이 예제에서 우리는 Car
클래스를 확장하여 $make
, $model
, $year
매개변수를 받는 매개변수화된 생성자를 추가했습니다. 새로운 Car
객체를 생성할 때 이 값을 지정할 수 있어 다양한 제조사, 모델, 연식의 차량을 생성할 수 있습니다.
생성자 오버로딩
PHP에서는 생성자 오버로딩이 직접 지원되지 않지만, 선택적 매개변수나 기본 값을 사용하여 유사한 기능을 달성할 수 있습니다. 이를 통해 다양한 수와 유형의 매개변수를 가진 여러 생성자를 만들 수 있습니다.
예제 3: 생성자 오버로딩 (선택적 매개변수 사용)
class Book {
public $title;
public $author;
public $pages;
public function __construct($title, $author = null, $pages = null) {
$this->title = $title;
$this->author = $author;
$this->pages = $pages;
}
}
$book1 = new Book("Harry Potter");
$book2 = new Book("Lord of the Rings", "J.R.R. Tolkien");
$book3 = new Book("The Great Gatsby", "F. Scott Fitzgerald", 180);
이 예제에서 우리는 Book
생성자에 선택적 매개변수를 추가했습니다. 새로운 Book
객체를 생성할 때 제목만 제공하거나, 작가와 페이지 수도 함께 제공할 수 있습니다. 선택적 매개변수를 제공하지 않으면 기본적으로 null
이 됩니다.
생성자에서 타입 선언
PHP는 자유 타입 언어이므로 생성자에서 타입 선언은 필요하지 않습니다. 그러나 타입 검사를 강제하고 싶다면 assert()
함수를 생성자 내에서 사용할 수 있습니다.
예제 4: 생성자에서 타입 선언 (assert() 사용)
class Student {
public $name;
public $age;
public function __construct($name, $age) {
assert(is_string($name), "Name must be a string");
assert(is_int($age), "Age must be an integer");
$this->name = $name;
$this->age = $age;
}
}
$student = new Student("Alice", 25); // 오류 없음
$student2 = new Student(123, "Bob"); // 오류: Name must be a string, Age must be an integer
이 예제에서 우리는 Student
생성자에 assert()
을 사용하여 타입 검사를 추가했습니다. 제공된 인자가 기대하는 타입과 일치하지 않으면 오류가 발생합니다. PHP에서는 이 방법을 자주 사용하지 않지만, 코드의 유연성을 떨어뜨리고 유지보수가 어려워질 수 있습니다.
__destruct() 함수
__destruct()
함수는 객체가 파괴되거나 범위 밖으로 나갈 때 자동으로 호출되는 또 다른 특별한 메서드입니다. 이는 객체의 작별 파티와 같은东西입니다! 이를 통해 자원을 정리하거나 연결을 닫거나 객체가 메모리에서 제거되기 전에 수행해야 할 다른 정리 작업을 수행할 수 있습니다.
예제 5: 기본 소멸자
class FileHandler {
private $file;
public function __construct($filename) {
$this->file = fopen($filename, 'r');
}
public function __destruct() {
fclose($this->file);
}
}
$fileHandler = new FileHandler('example.txt'); // 파일을 엽니다
// ... 파일에 대한 작업 수행 ...
// $fileHandler가 범위 밖으로 나가면 파일이 자동으로 닫힙니다
이 예제에서 우리는 FileHandler
클래스를 정의하고, 생성자에서 파일을 엽니다. 소멸자에서는 파일을 닫습니다. 새로운 FileHandler
객체를 생성하고 범위 밖으로 나가면 소멸자가 자동으로 호출되어 파일이 닫힙니다.
오늘의 강의는 여기서 끝입니다! 우리는 PHP의 생성자와 소멸자의 기본을 다루었습니다. 이 특별한 메서드는 객체의 수명을 관리하고 적절한 자원 관리를 보장하는 강력한 도구입니다. 행복한 코딩을 기원합니다!
Credits: Image by storyset