본문 바로가기

비개발자의 개발 일지

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

시리즈 보기
php

PHP private 멤버변수 — 외부 접근 오류 완전 정리

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

 

 

Web Development · PHP Class

PHP private 멤버변수 — 외부 접근 오류 완전 정리

public 변수는 접근 가능, private 변수는 오류 — 왜 이렇게 만들었나?
시작 오늘 분석할 코드

멤버변수에도 접근제어자를 적용할 수 있다. public $str1은 외부에서 읽기 가능하지만, private $str2는 외부에서 직접 읽으려 하면 오류가 발생한다.

<?php // 실행하면 오류가 표시됩니다. class Test { public $str1 = '공개'; // 외부 접근 허용 private $str2 = '비밀'; // 외부 접근 차단 } $test = new Test(); print $test->str1; // ✓ "공개" 출력 print "<BR>"; print $test->str2; // ✗ Fatal error! print "<BR>"; ?>
실제 출력 미리보기
공개
Fatal error: Uncaught Error: Cannot access private property Test::$str2

$str1은 정상 출력되고, $str2 접근 시 Fatal error가 발생해 이후 코드 실행이 중단된다.


용어 핵심 용어 정리
public $str1외부에서 자유롭게 읽고 쓸 수 있는 멤버변수. $test->str1 으로 접근 가능.
private $str2같은 클래스 안에서만 접근 가능. 외부 접근 시 Fatal error 발생.
Cannot access privateprivate 멤버에 외부에서 접근할 때 PHP가 발생시키는 오류 메시지.
캡슐화 (Encapsulation)객체의 내부 데이터를 숨기고 공개 메서드를 통해서만 접근하게 하는 OOP 원칙.
직접 접근$test->str2 처럼 객체를 통해 변수에 바로 접근하는 방식.
간접 접근getter 메서드(getStr2())를 통해 private 변수 값을 가져오는 방식.
데이터 보호private로 외부에서 멤버변수를 임의로 변경할 수 없게 막아 데이터 일관성 유지.
getter / setterprivate 변수를 읽는(get) 또는 쓰는(set) 공개 메서드 패턴. private3에서 다룬다.

1 멤버변수에도 접근제어자가 필요한 이유
변수를 왜 숨겨야 하나?

멤버변수를 모두 public으로 두면 외부 코드가 아무 값이나 직접 넣을 수 있다. 예를 들어 회원 나이 변수에 $user->age = -999를 넣어버려도 막을 방법이 없다.

private로 선언하면 외부에서 직접 변경하지 못하게 막을 수 있고, 값의 유효성을 메서드 안에서 검증해서 안전하게 저장할 수 있다.

모두 public — 위험
$test->str2 = "해킹" 아무 값이나 직접 입력
• 유효성 검사 우회 가능
• 객체 상태를 예측할 수 없게 됨
• 버그 추적이 어려워짐
private + getter/setter — 안전
• 외부에서 직접 변경 불가
• setter 메서드에서 유효성 검사
• 객체 상태를 클래스가 통제
• 버그 발생 지점이 명확해짐

2 public 변수와 private 변수의 동작 비교
왜 str1은 되고 str2는 안 되나?

두 멤버변수의 유일한 차이는 접근제어자다. publicprivate의 외부 접근 가능 여부가 완전히 다르다.

변수 접근제어자 외부 읽기 외부 쓰기 클래스 내부
$str1 public ✓ 가능 ✓ 가능 ✓ 가능
$str2 private ✗ Fatal error ✗ Fatal error ✓ 가능
$test = new Test(); print $test->str1; // ✓ 공개 — 정상 출력 $test->str1 = '변경'; // ✓ 공개 — 값 변경 가능 print $test->str2; // ✗ Cannot access private property $test->str2 = '변경'; // ✗ Cannot access private property

3 오류 메시지 분석
Fatal error 메시지를 어떻게 읽나?

PHP가 발생시키는 오류 메시지를 읽는 법을 익혀두면 디버깅이 훨씬 빨라진다.

Fatal error: Uncaught Error: Cannot access private property Test::$str2 in /var/www/html/private2.php:13
오류 구성 요소 의미
Fatal error 실행을 즉시 중단시키는 치명적 오류
Cannot access private property private 접근제어자가 걸린 멤버에 외부에서 접근 시도
Test::$str2 Test 클래스의 $str2 멤버변수 (클래스명::변수명 형식)
in ... line 13 오류가 발생한 파일과 줄 번호
Test::$str2 형식은 "Test 클래스 소속의 $str2"를 의미한다. PHP 오류 메시지에서 ::(이중 콜론)은 클래스와 멤버를 구분하는 기호다.

 

반응형

 

4 private 변수에 내부에서 접근하는 방법
클래스 안에서 $str2를 쓰는 것은 가능한가?

외부에서는 불가능하지만, 같은 클래스 안의 메서드에서는 $this->str2로 자유롭게 접근할 수 있다. 이것이 private의 핵심: "외부로부터 보호, 내부에서는 자유."

class Test { private $str2 = '비밀'; public function showStr2() { print $this->str2; // ✓ 내부 접근 — 정상 } public function setStr2($value) { $this->str2 = $value; // ✓ 내부 수정 — 정상 } } $test = new Test(); $test->showStr2(); // "비밀" 출력 $test->setStr2('새값'); $test->showStr2(); // "새값" 출력
외부: $test->str2 ✗
public showStr2()
내부: $this->str2 ✓
'비밀' 반환

5 왜 이 설계가 더 안전한가?
캡슐화의 실제 이점

private + 공개 메서드 구조는 외부 코드가 객체의 내부 상태를 "통제된 방식으로만" 변경하게 만든다. 이것이 캡슐화(Encapsulation)다.

// 캡슐화 적용 예시 — 나이는 0 이상이어야 한다 class User { private $age; public function setAge($value) { if ($value < 0) { print "나이는 0 이상이어야 합니다."; return; } $this->age = $value; // 유효한 값만 저장 } }
※ public이었다면 $user->age = -999를 막을 방법이 없다. private + setter 메서드를 쓰면 유효성 검사를 거쳐야만 값을 저장할 수 있다.

6 private 변수의 올바른 해결 — getter/setter 패턴 소개
이 문제를 어떻게 해결하나? (private3에서 상세 다룸)

이 예제(private2)는 의도적으로 오류를 보여주는 코드다. 실제 해결책은 getter 메서드를 통해 private 변수를 읽는 것이다. 자세한 구현은 private3 파일에서 다룬다.

접근 방식 코드 결과
직접 접근 (잘못된 방법) print $test->str2; Fatal error — Cannot access private
getter 메서드 (올바른 방법) print $test->getStr2(); 정상 출력 — "비밀"
getter / setter 패턴
  • getter: private 변수를 읽는 public 메서드 — getStr2()
  • setter: private 변수에 값을 쓰는 public 메서드 — setStr2($v)
  • 이 패턴으로 외부 접근을 허용하면서도 클래스가 내부 상태를 통제한다

7 자주 하는 실수
실수 증상 해결
private 변수에 직접 접근 ($test->str2) Fatal error: Cannot access private property getter 메서드 getStr2()를 통해 간접 접근
private 변수를 직접 수정 ($test->str2 = '값') Fatal error: Cannot access private property setter 메서드 setStr2('값')를 통해 간접 수정
오류 발생 후 이후 print 실행될 것으로 착각 Fatal error 이후 모든 코드 중단 try/catch 예외 처리 또는 private 변수 직접 접근 시도 자체를 제거
모든 멤버변수를 public으로 선언 외부에서 임의 값 삽입 가능 — 데이터 오염 기본적으로 private 선언, 필요한 것만 getter/setter 공개
자식 클래스에서 부모의 private 변수 접근 시도 Fatal error: Cannot access private property 자식에서도 쓸 변수는 protected로 선언

핵심 한 줄 요약

public $str1외부에서 $test->str1 으로 자유롭게 읽고 쓸 수 있다
private $str2외부에서 직접 접근 시 Fatal error. 클래스 내부에서만 $this->str2 접근 가능
Cannot access privateprivate 멤버에 외부 접근 시 PHP가 발생시키는 오류 메시지
캡슐화내부 데이터를 숨기고 통제된 방법(메서드)으로만 접근하게 하는 OOP 원칙
해결책getter 메서드를 만들어 private 변수를 간접적으로 읽는다 → private3 참고

Tags

#PHP private 변수 #멤버변수 접근제어 #캡슐화 #public 변수 #private 접근 오류 #PHP 클래스 #OOP #getter setter #PHP강의 #웹개발 #티스토리
▼ 티스토리 태그 입력란 복사용
PHP private 변수, 멤버변수 접근제어, 캡슐화, public 변수, private 접근 오류, PHP 클래스, OOP, getter setter, PHP강의, 웹개발, 티스토리
반응형

댓글