본문 바로가기

비개발자의 개발 일지

현장 팀장에서 수출 ERP까지 — AI와 함께 시스템을 만든 기록

시리즈 보기
php

PHP new 키워드 — 객체 생성 완전 정리

by 왕진 2026. 7. 12.
반응형

 

 

Web Development · PHP Class

PHP new 키워드 — 객체 생성 완전 정리

클래스(설계도)에서 객체(실체)를 만드는 과정 | 인스턴스·변수·메서드 호출 흐름
시작 오늘 분석할 코드

new 키워드로 User 클래스의 객체를 생성하고 변수에 저장하는 예제다. 클래스 선언이 new 아래에 위치해 있다는 점에도 주목한다.

// user2.php — new 키워드로 객체 생성 <?php $user = new User(); // User 클래스의 객체를 생성해서 $user에 저장 // $user는 이제 User클래스의 객체(인스턴스)다 class User { public $name = '철수'; public function print_hello() { print $this->name; print "님 안녕하세요!<BR>"; } } ?>
실제 출력 미리보기
철수님 안녕하세요!

이 파일은 객체는 생성했지만 메서드를 호출하지 않았으므로 실제로는 아무것도 출력되지 않는다. $user->print_hello() 를 추가해야 위 결과가 나온다.


용어 핵심 용어 정리
new클래스의 객체(인스턴스)를 생성하는 PHP 키워드. Java와 동일한 문법이다.
객체 (Object)클래스라는 설계도를 실체화한 것. new User()의 결과물이다.
인스턴스객체와 같은 뜻. "User 클래스의 인스턴스"처럼 클래스를 강조할 때 주로 쓴다.
$user객체를 저장하는 변수. 이 변수를 통해 멤버변수와 메서드에 접근한다.
-> 연산자객체를 통해 멤버에 접근하는 연산자. $user->print_hello() 처럼 쓴다.
클래스 선언 위치PHP는 파일 어디에 클래스를 선언해도 동작한다. new 아래 선언해도 무방.
복수 객체같은 클래스에서 객체를 여러 개 생성 가능. 각 객체는 독립된 멤버변수를 갖는다.
설계도 vs 실체class = 설계도(코드), new = 실체 생성(메모리에 올라감). 설계도는 1개, 실체는 여러 개.
$this클래스 메서드 안에서 자기 자신의 객체를 가리키는 예약변수. $this->name처럼 자신의 멤버에 접근할 때 쓴다.
clone객체를 완전히 독립 복사하는 키워드. $u2 = clone $u1은 별개의 복사본을 만들고, 단순 대입(=)은 같은 객체를 공유한다.

1 new 키워드의 역할
왜 클래스만 선언해서는 아무것도 안 되나?

class User { ... }는 설계도에 불과하다. 집 설계도만 가지고는 실제로 살 수 없듯이, 클래스 선언만으로는 메서드도 실행되지 않고 변수도 사용할 수 없다.

new User()를 실행하면 PHP 엔진이 메모리에 User 클래스의 구조를 갖춘 실체(객체)를 만들어낸다. 이 실체를 변수에 저장해서 사용한다.

class User { ... }
new User()
메모리에 객체 생성
$user 변수에 저장
new User() 뒤에 괄호 ()는 생성자(constructor)를 호출하는 문법이다. 이 예제처럼 생성자를 따로 정의하지 않으면 PHP가 기본 생성자를 자동으로 실행한다.

2 객체를 변수에 저장하는 이유
왜 $user 변수에 객체를 담아야 하나?

new User()로 생성한 객체는 변수에 저장하지 않으면 즉시 사라진다. 변수 $user에 저장해야 이후 코드에서 같은 객체를 계속 참조할 수 있다.

$user = new User(); // 객체 생성 후 $user에 저장 $user->print_hello(); // $user 객체의 print_hello 메서드 호출 print $user->name; // $user 객체의 $name 멤버변수 출력

변수명은 무엇이든 상관없다. $u, $myUser 등 어떤 이름이든 동일하게 동작한다. 단, 의미를 명확히 하는 이름을 사용하는 것이 좋다.

※ PHP에서 객체 변수는 실제 객체를 직접 담는 게 아니라 객체에 대한 참조(reference)를 담는다. 따라서 $user2 = $user처럼 대입하면 같은 객체를 두 변수가 공유하게 된다.

3 객체와 인스턴스 — 같은 말인가?
왜 두 용어가 혼용되나?

현장에서 객체(object)인스턴스(instance)는 거의 같은 의미로 사용된다. 다만 강조하는 맥락이 약간 다르다.

용어 강조하는 맥락 예시 문장
객체 (object) 실체 자체, 메모리의 존재 "$user는 User 객체다"
인스턴스 (instance) 어떤 클래스에서 만들어졌는지 "$user는 User 클래스의 인스턴스다"
※ 실무에서는 "user객체", "User 인스턴스" 어느 표현을 써도 의사소통에 문제없다. 두 단어를 구별해서 쓰는 것보다 클래스와 객체의 관계를 이해하는 것이 더 중요하다.

 

반응형

 

4 같은 클래스에서 객체를 여러 개 만들기
왜 객체는 여러 개 만들 수 있나?

클래스는 설계도이기 때문에 같은 설계도로 건물을 여러 채 지을 수 있듯, 같은 클래스로 독립된 객체를 여러 개 생성할 수 있다. 각 객체는 별도의 멤버변수 공간을 가진다.

$user1 = new User(); $user2 = new User(); // 완전히 별개의 객체 $user1->name = '철수'; $user2->name = '영희'; // $user1의 name에는 영향 없음 print $user1->name; // 철수 print $user2->name; // 영희
※ 이것이 클래스 기반 프로그래밍의 핵심이다. 같은 User 클래스를 이용해 수천 명의 사용자 객체를 만들 수 있다.

5 클래스 선언 순서 — new 아래에 class가 있어도 괜찮은 이유
왜 이 예제는 클래스보다 new가 먼저 나와 있나?

이 예제(user2.php)를 보면 $user = new User()class User { ... }보다 위에 있다. 일반적으로 선언이 먼저 와야 할 것 같지만, PHP는 이를 허용한다.

1
PHP는 파일을 실행 전 1회 파싱(parsing)한다이 단계에서 클래스 선언을 미리 인식한다
2
실행 단계에서 new User()를 만남파싱 단계에서 이미 User 클래스를 알고 있으므로 오류 없이 객체 생성
3
클래스 선언이 아래 있어도 동작단, 조건문·함수 안에 클래스를 선언하면 파싱 단계에서 처리되지 않아 오류 발생 가능
if (...) { class User { ... } } 처럼 조건문 안에 클래스를 선언하면 실행 전 파싱으로 인식되지 않아 오류가 날 수 있다. 클래스는 항상 최상위 레벨에 선언하는 것이 안전하다.

6 객체 생성 후 멤버변수와 메서드 접근
생성한 객체로 무엇을 할 수 있나?

객체를 생성하면 -> 연산자로 멤버변수에 접근하거나 메서드를 호출할 수 있다. 읽기와 쓰기 모두 가능하다.

$user = new User(); // 멤버변수 읽기 print $user->name; // 철수 (기본값) // 멤버변수 쓰기 (변경) $user->name = '영희'; print $user->name; // 영희 // 메서드 호출 $user->print_hello(); // 영희님 안녕하세요!
public으로 선언된 멤버변수는 외부에서 자유롭게 읽고 쓸 수 있다. 하지만 외부에서 직접 변경하면 예상치 못한 버그가 생길 수 있다. 이 문제를 해결하는 것이 private + getter/setter 패턴이다.

7 $this — 객체 내부에서 자기 자신을 가리키는 예약변수
왜 $this가 필요한가?

메서드 안에서 같은 객체의 멤버변수나 다른 메서드를 참조하려면 $this를 사용한다. $this는 "지금 이 메서드를 호출한 객체"를 자동으로 가리키므로, 어떤 객체가 메서드를 불렀느냐에 따라 자동으로 바뀐다.

class User { public $name = '철수'; public function print_hello() { print $this->name; // $this = 이 메서드를 부른 객체 print "님 안녕하세요!<BR>"; } } $a = new User(); $a->name = '영희'; $a->print_hello(); // $this->name = 영희 출력 $b = new User(); $b->print_hello(); // $this->name = 철수 (기본값) 출력
$this는 클래스 내부 메서드에서만 유효하다. 클래스 밖에서는 $user처럼 객체 변수를 통해 접근한다. 두 객체 $a$b가 같은 메서드를 호출해도 각각의 $this는 다른 객체를 가리킨다.

8 자주 하는 실수
실수 증상 해결
new User (괄호 생략) PHP 8.0 미만에서 경고, 이후 오류 가능 항상 new User() 처럼 괄호를 붙일 것
존재하지 않는 클래스로 new Fatal error: Class "Xxxx" not found 클래스가 선언되었는지, require로 불러왔는지 확인
$user에 저장 후 User->print_hello() Parse error — 클래스명으로 직접 접근 불가 반드시 변수(객체)를 통해 $user->print_hello() 접근
객체를 변수에 저장하지 않고 사용 다음 줄에서 객체를 참조할 수 없음 $user = new User(); 처럼 변수에 저장 후 사용
$user2 = $user$user2->name 변경 같은 객체를 공유하므로 $user->name도 함께 변경됨 독립 복사가 필요하면 $user2 = clone $user 사용

핵심 한 줄 요약

new 키워드클래스(설계도)로부터 객체(실체)를 메모리에 생성하는 명령
$user = new User()User 클래스의 객체를 생성해 $user 변수에 저장
$user->name / ->print_hello()-> 연산자로 객체의 멤버변수와 메서드에 접근
복수 객체 생성같은 클래스로 독립된 객체를 여러 개 만들 수 있다
클래스 선언 위치PHP는 파싱 단계에서 클래스를 인식하므로 new 아래 선언해도 동작
$this메서드 내부에서 자기 자신의 객체를 가리키는 예약변수. 어떤 객체가 호출했느냐에 따라 자동으로 결정됨

Tags

#PHP new 키워드 #객체 생성 #인스턴스 #클래스 #PHP 객체 #객체지향 #OOP #멤버변수 #메서드 호출 #-> 연산자 #PHP강의 #웹개발 #티스토리
▼ 티스토리 태그 입력란 복사용
PHP new 키워드, 객체 생성, 인스턴스, 클래스, PHP 객체, 객체지향, OOP, 멤버변수, 메서드 호출, PHP강의, 웹개발, 티스토리
반응형

댓글