Menu
Coddy logo textTech

인스턴스 vs 정적 프로퍼티

Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 91개 중 15번째.

클래스에서 프로퍼티를 생성할 때, 해당 프로퍼티가 각 개별 객체에 속할지 아니면 클래스 자체에 속할지를 결정해야 합니다. 이러한 구분이 바로 인스턴스 프로퍼티와 정적 프로퍼티의 차이입니다.

인스턴스 속성이 기본값입니다. 각 객체는 해당 속성의 고유한 복사본을 가지며, 한 객체에서 이를 변경해도 다른 객체에는 영향을 미치지 않습니다:

<?php
class User {
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
    }
}

$alice = new User("Alice");
$bob = new User("Bob");

echo $alice->name . "\n";
echo $bob->name . "\n";

출력:

Alice
Bob

정적 프로퍼티는 특정 객체가 아니라 클래스에 속합니다. static 키워드를 사용하여 선언하며, 객체와 함께 ->를 사용하는 대신 클래스 이름과 함께 ::를 사용하여 접근합니다:

<?php
class User {
    public static $count = 0;
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
        self::$count++;
    }
}

$alice = new User("Alice");
$bob = new User("Bob");

echo User::$count;

출력:

2

$count가 모든 인스턴스에서 어떻게 공유되는지 확인해 보세요. 새로운 User를 생성할 때마다 동일한 $count 변수가 증가합니다. 클래스 내부에서는 정적 속성을 참조하기 위해 self::$count를 사용합니다.

핵심 포인트: 각 객체가 고유한 값을 필요로 할 때는 인스턴스 프로퍼티를 사용하세요. 인스턴스 수를 세거나 설정을 저장하는 것과 같이, 클래스의 모든 객체 간에 데이터를 공유해야 할 때는 정적 프로퍼티를 사용하세요.

challenge icon

챌린지

쉬움

인스턴스 속성(각 방문자에게 고유함)과 정적 속성(모든 방문자가 공유함)의 차이점을 보여주는 방문자 추적 시스템을 구축해 보겠습니다.

코드를 정리하기 위해 두 개의 파일을 생성합니다:

  • Visitor.php — 개별 방문자를 추적하고 총 방문자 수를 유지하는 Visitor 클래스를 정의합니다. 각 방문자는 자신만의 $name 속성(인스턴스 속성)을 가져야 하며, $totalVisitors 속성은 모든 인스턴스에서 공유되어야 합니다(정적 속성). 생성자는 이름을 받아 설정하고 총 방문자 수를 증가시킵니다. "[name] is visitor #[totalVisitors]"를 반환하는 getInfo() 메서드를 추가하세요.
  • main.php — Visitor 클래스 파일을 포함한 다음, "Alice", "Bob", "Charlie"라는 이름으로 세 명의 방문자를 순서대로 생성합니다. 세 명을 모두 생성한 후, 각 방문자에 대해 getInfo()를 호출한 결과를 출력하고(각각 별도의 줄에), Visitor::$totalVisitors를 사용하여 클래스에서 직접 정적 속성에 액세스하여 총 방문자 수를 출력하세요.

클래스 내부에서는 self::$propertyName을 사용하여 정적 속성에 액세스하고, 클래스 외부에서는 ClassName::$propertyName을 사용한다는 점을 기억하세요. 인스턴스 속성은 평소와 같이 $this->propertyName으로 액세스합니다.

출력 결과에는 각 방문자와 할당된 번호가 표시되어야 하며, 마지막 줄에는 최종 총 합계가 표시되어야 합니다.

치트 시트

인스턴스 속성은 각 개별 객체에 속하며, 정적 속성은 클래스 자체에 속하고 모든 인스턴스에서 공유됩니다.

인스턴스 속성:

각 객체는 속성의 자체 복사본을 가집니다:

<?php
class User {
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
    }
}

$alice = new User("Alice");
$bob = new User("Bob");

echo $alice->name; // Alice
echo $bob->name;   // Bob

정적 속성:

static 키워드로 선언되며 모든 인스턴스에서 공유됩니다:

<?php
class User {
    public static $count = 0;
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
        self::$count++;
    }
}

$alice = new User("Alice");
$bob = new User("Bob");

echo User::$count; // 2

정적 속성 접근하기:

  • 클래스 내부: self::$propertyName
  • 클래스 외부: ClassName::$propertyName

인스턴스 속성 접근하기:

  • 클래스 내부: $this->propertyName
  • 클래스 외부: $object->propertyName

직접 해보기

<?php
// Visitor 클래스 포함
require_once 'Visitor.php';

// TODO: "Alice", "Bob", "Charlie"라는 이름의 방문자 세 명을 생성합니다 (해당 순서대로)

// TODO: 각 방문자에 대해 getInfo()의 결과를 출력합니다 (각각 별도의 줄에)

// TODO: Visitor::$totalVisitors를 사용하여 총 방문자 수를 출력합니다
?>
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨