인스턴스 생성
인스턴스란 말은 앞에서 선언한 클래스를 통해 객체변수를 생성하는 것을 말합니다.
함수는 정의 후에 바로 호출하여 사용할 수 있었습니다. 하지만 객체 클래스는 선언을 했다고 해서 바로 함수처럼 호출하여 사용할 수 있는 것은 아닙니다. 사용하기 전에 인스턴스화 작업을 통해 클래스 객체를 생성을 한 번 더 해줘야 합니다. 인스턴스화는 클래스 선언된 정보를 통해 객체변수를 생성 합니다.
인스턴스화를 통하여 객체를 생성하면 클래스에 정의된 프로퍼티와 메서드를 함께 생성하여 새로운 객체를 생성 합니다. 정확히 말하면 객체를 생성하여 지정된 변수에 할당(대입)하는 것입니다. 객체변수를 통해 프로퍼티와 메서드에 접근하게 됩니다.
new 키워드
정의한 클래스를 객체 인스턴스 형태로 생성하는 방법은 매우 간단합니다.
단지 정의한 클래스명 앞에 new 키워드를 통해 변수에 대입하면 됩니다.
문법)
$인스턴스 변수 = new 클래스명;
new 키워드로 대입한 변수는 객체 데이터 타입으로 생성됩니다.
예제 파일 class-02.php
<?php
class JinyClass
{
public function test($msg)
{
return $msg;
}
}
$JinyClass = new JinyClass();
echo "JinyClass 인스턴스<br>";
echo $JinyClass->test("JinyClass") . "<br>";
$obj1 = new JinyClass;
$obj2 = new JinyClass;
echo "클래스 인스턴스1<br>";
echo $obj1->test(1) . "<br>";
echo "클래스 인스턴스2<br>";
echo $obj2->test(2) . "<br>";
?>
결과
JinyClass 인스턴스
JinyClass
클래스 인스턴스1
1
클래스 인스턴스2
2
위의 예제는 클래스 객체를 생성하는 예제입니다.
예제 소스를 살펴보면 아래와 같이 클래스를 인스턴스화하여 객체를 생성할 때 어떤 예는 변수명과 클래스명이 같은 경우를 종종 볼 수 있습니다.
$JinyClass = new JinyClass();
인스턴스 객체변수로 클래스명과 같은 이름을 사용할 수도 있습니다. 하지만 변수명과 클래스 이름은 서로 다른 의미 입니다. 객체변수는 변수이고, 클래스명은 클래스 이름이라는 것입니다. 서로 같지 않습니다. 이름만 같을 뿐 서로 영향을 주지 않습니다. 이름이 같다고 해도 왼쪽은 객체변수이고 오른쪽은 그냥 클래스명입니다.
선언된 클래스는 new 키워드를 통해 객체를 생성하면 객체는 클래스의 선언된 타입과 같습니다.
$obj1 = new JinyClass;
$obj2 = new JinyClass;
위의 예처럼 한 개의 클래스를 통해 동일한 객체 내용을 가지고 있는 데이터 타입 변수 두 개를 생성할 수 있습니다.
$obj1과 $obj2는 서로 다른 객체변수입니다. 하지만 동일한 클래스의 구조를 가지고 있습니다.
함수 VS 클래스
함수는 선언과 호출 2단계 작업을 한 쌍으로 사용합니다.
반면에 클래스는 선언과 인스턴스 생성, 호출 3단계의 작업을 한 쌍으로 사용합니다.
괄호 없는 new 인스턴스의 멤버 직접 참조 (Parentheses-less new) — [PHP 8.4+]
PHP 8.3 이전에는 클래스를 인스턴스화하면서 그 멤버(메서드나 프로퍼티)에 바로 접근하려면, new 구문 전체를 소괄호 ()로 감싸야만 구문 오류가 생기지 않았습니다.
// PHP 8.3 이전 방식 (소괄호 필수)
$name = (new User())->getName();
PHP 8.4부터는 인스턴스를 생성하면서 감싸는 소괄호 없이도 멤버나 메서드를 직접 체이닝하여 호출할 수 있습니다. 이를 통해 구문이 훨씬 단결하고 깔끔해집니다.
예제:
<?php
class Logger {
public function log(string $message): void {
echo "[LOG] {$message}<br>";
}
}
// PHP 8.4부터는 감싸는 소괄호 없이 바로 메소드 호출이 가능합니다.
new Logger()->log("인스턴스 생성 및 메서드 직접 호출 성공");
?>
이 문법은 일회성으로 사용할 헬퍼 객체를 생성하거나, 팩토리 패턴 등에서 임시 인스턴스를 사용한 체이닝을 구성할 때 보일러플레이트 코드를 줄여주어 매우 유용합니다.