본문 바로가기

비개발자의 개발 일지

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

시리즈 보기
php

PHP getter/setter 패턴 — private 멤버변수와 캡슐화 완전 정리

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

 

 

Web Development · PHP OOP

PHP getter/setter 패턴 완전 정리

private 멤버변수를 왜 숨기고, 왜 getter/setter로만 접근하는가
시작 오늘 분석할 코드

Member 클래스에 5개의 private 멤버변수를 선언하고, 각각에 setter(저장)와 getter(조회) 메서드 쌍을 만든 뒤, 객체를 생성해서 값을 넣고 꺼내는 전형적인 OOP 패턴이다.

class Member { private $id; private $lastname; private $firstname; private $email; private $password; public function setID($id) { $this->id = $id; } public function getID() { return $this->id; } // setLastname/getLastname, setFirstname/getFirstname ... } $member = new Member; $member->setID("1"); $member->setLastname('당신의 성'); print $member->getID() . "<BR>"; print $member->getLastname() . "<BR>";
실제 출력 미리보기
1
당신의 성
당신의 이름
당신의 메일주소
패스워드

→ getter가 멤버변수 값을 호출한 자리로 반환해서 순서대로 출력된다

용어 핵심 용어 정리
private클래스 외부에서 직접 접근 불가. 같은 클래스 안에서만 읽고 쓸 수 있다
public어디서든 접근 가능. getter/setter는 public으로 열어야 외부 호출 가능
setter외부에서 값을 받아 멤버변수에 저장하는 메서드. 보통 return 없음
getter멤버변수에 저장된 값을 꺼내 반환하는 메서드. return $this->변수명 형태
$this현재 객체 자신을 가리키는 키워드. $this->id는 "이 객체의 id 변수"를 뜻함
캡슐화내부 데이터를 숨기고 getter/setter로만 접근하게 만드는 OOP 원칙
카멜표기법두 단어 이상 합칠 때 두 번째 단어 첫 글자 대문자 — setLastname, getFirstname
저장객체값을 보관하고 꺼내는 역할만 하는 클래스. Member 클래스가 전형적인 예

1 private 멤버변수 — 왜 숨기는가
직접 접근하면 무슨 문제가 생기나

멤버변수를 public으로 열어두면 어디서든 $member->id = "아무값"으로 덮어쓸 수 있다. 검증 없이 잘못된 값이 들어와도 막을 방법이 없다. private으로 잠가두면 외부 코드가 직접 건드릴 수 없고, setter를 통해서만 값을 넣을 수 있어서 나중에 setter에 유효성 검사를 추가하기 쉬워진다.

public 변수 (위험)
$member->id = "";
$member->password = null;

외부에서 아무 값이나 직접 주입 가능. 유효성 검사 추가 불가.
private + setter (안전)
$member->setID("1");
setter 안에서 빈 문자열 체크, 길이 제한 등 검증 로직 추가 가능.
※ private은 "자물쇠", setter/getter는 "열쇠가 있는 창구"라고 이해하면 쉽다.

실무에서 setter에 유효성 검사를 추가하는 것은 선택이지만, 처음부터 setter를 만들어두면 나중에 검증 로직을 끼워 넣을 때 기존 코드를 전혀 바꾸지 않아도 된다. 이것이 캡슐화 설계의 핵심 이점이다.


2 setter 메서드 — 값을 저장하는 구조
왜 return이 없는가

setter의 역할은 "외부에서 값을 받아 멤버변수에 저장"하는 것이다. 저장만 하면 끝이기 때문에 반환할 것이 없다. 매개변수로 받은 값을 $this->변수명 = $매개변수로 넣어두면 그 객체가 살아있는 동안 값이 유지된다.

public function setID($id) { $this->id = $id; // return 없음 — 저장만 하고 끝 } // 나중에 유효성 검사를 추가하고 싶다면 setter 안에 넣으면 된다 public function setEmail($email) { if (strpos($email, '@') === false) { throw new Exception('이메일 형식 오류'); } $this->email = $email; }
※ setter는 나중에 검증 로직을 끼워 넣기 위한 "확장 포인트"이기도 하다. 처음엔 단순 저장으로 시작해도 된다.
※ PHP 8.0+에서는 public function __construct(private string $id, private string $email)처럼 생성자 인수로 멤버변수를 선언·초기화할 수 있다(생성자 프로퍼티 승격). 단, setter/getter 분리 패턴이 필요한 경우엔 여전히 이 방식을 쓴다.

3 getter 메서드 — 값을 꺼내는 구조
return $this->변수명 이 하는 일

getter는 private 멤버변수에 보관된 값을 "메서드가 호출된 자리로 돌려준다". print $member->getID()라고 쓰면, getID() 자리에 반환된 값이 치환되어 출력된다. 직접 $member->id에 접근하는 것이 아니라 메서드를 통해 안전하게 읽는 방식이다.

public function getID() { return $this->id; // $this->id에 저장된 값을 호출한 자리로 반환 } // 사용 예 print $member->getID(); // "1" 출력 $result = $member->getLastname(); // 변수에 받아도 됨

 

반응형

 

4 $this 키워드 — 현재 객체를 가리키는 이유
객체가 여러 개일 때 $this는 각자의 데이터를 가리킨다

클래스는 설계도다. new Member를 2번 호출하면 독립된 객체 2개가 만들어진다. 클래스 내부에서 $this는 "지금 이 메서드를 호출한 그 객체"를 뜻하기 때문에, $member1->setID("A")$member2->setID("B")는 서로 다른 객체의 id 변수에 각각 저장된다.

$member1 = new Member; $member1->setID("A"); // member1 객체의 $id = "A" $member2 = new Member; $member2->setID("B"); // member2 객체의 $id = "B" (member1과 무관) print $member1->getID(); // "A" 출력 print $member2->getID(); // "B" 출력
※ $this는 "나 자신" — 같은 클래스라도 객체마다 독립적인 멤버변수 공간을 가리킨다.

수천 명의 회원 데이터를 각각 독립된 Member 객체로 관리할 수 있는 것이 이 구조의 핵심이다. 배열이나 전역 변수 대신 객체를 쓰면 각 회원의 데이터가 서로 섞이지 않는다.


5 카멜표기법(CamelCase) — 왜 이렇게 이름 짓는가
메서드 이름을 읽기 쉽게 만드는 관례

PHP/Java 등에서 메서드명이나 변수명에 두 개 이상의 단어가 들어갈 때, 두 번째 단어부터 첫 글자를 대문자로 쓰는 관례다. 낙타의 등이 올라갔다 내려갔다 하는 모양과 비슷하다고 해서 카멜표기법이라고 부른다. 언더스코어 방식(snake_case)을 쓰지 않는 Java/PHP OOP 세계의 표준이다.

원단어 조합 카멜표기법 결과 설명
set + id setID ID는 약어라 전부 대문자로 쓰는 경우도 많다
set + lastname setLastname 두 번째 단어 L을 대문자로
get + firstname getFirstname 두 번째 단어 F를 대문자로
set + password setPassword 두 번째 단어 P를 대문자로
print + hello printHello 동사+명사 조합도 동일 규칙 적용

6 객체 생성과 메서드 호출 흐름
클래스 정의 → 객체 생성 → setter 저장 → getter 조회 순서

클래스는 정의만으로는 아무것도 실행되지 않는다. new 키워드로 객체를 생성한 뒤에야 메서드를 호출할 수 있다. 아래 흐름이 getter/setter 패턴의 기본 생애주기다.

1
클래스 정의class Member { private $id; ... } — 설계도만 존재, 아직 메모리 할당 없음
2
객체 생성$member = new Member; — 메모리에 실제 객체 공간 할당, 멤버변수는 미초기화 상태
3
setter로 값 저장$member->setID("1"); — 객체의 $id 변수에 "1" 저장
4
getter로 값 조회print $member->getID(); — $id에 저장된 "1"을 반환해서 출력
5
스크립트 종료PHP 요청이 끝나면 객체와 멤버변수 값이 모두 소멸 (세션/DB에 저장하지 않은 경우)
클래스 정의
new 객체 생성
setter 저장
getter 조회
출력/처리

7 자주 하는 실수
실수 증상 해결
$member->id = "1" 직접 접근 시도 Cannot access private property 오류 setter 메서드 $member->setID("1") 를 통해 저장
setter에서 $id = $id 오타 (this 빠짐) 멤버변수에 저장 안 됨. getter가 null 반환 반드시 $this->id = $id 로 현재 객체 변수에 저장
new Member() 대신 Member()만 호출 Call to undefined function 오류 객체 생성은 반드시 new 키워드 사용
getter 호출 시 괄호 누락 $member->getID 객체 자체가 출력되거나 오류 발생 메서드는 반드시 괄호 포함 $member->getID()
두 객체를 생성했는데 값이 섞임 예상과 다른 값 출력 $member1, $member2가 각각 new로 독립 생성됐는지 확인

핵심 한 줄 요약

private 멤버변수외부 직접 접근 차단 — setter/getter 창구로만 읽고 쓴다
setter$this->변수명 = $매개변수 — 저장만 하고 return 없음
getterreturn $this->변수명 — 저장된 값을 호출 자리로 반환
$this현재 객체 자신 — 객체마다 독립적인 멤버변수 공간을 가리킨다
캡슐화 목적데이터 보호 + setter에 검증 로직 추가 가능 → 안정적인 객체 설계
setter 확장 포인트처음엔 단순 저장, 나중에 유효성 검사·보안 처리를 setter 안에 추가 — 호출 코드 불변

Tags

#PHP getter setter #private 멤버변수 #캡슐화 #PHP OOP #접근제어자 #$this 키워드 #카멜표기법 #PHP 클래스 #객체지향 프로그래밍 #setter 메서드 #getter 메서드 #웹개발 #티스토리
▼ 티스토리 태그 입력란 복사용
PHP getter setter, private 멤버변수, 캡슐화, PHP OOP, 접근제어자, $this 키워드, 카멜표기법, PHP 클래스, 객체지향 프로그래밍, setter 메서드
반응형

댓글