Computer >> 컴퓨터 >  >> 프로그래밍 >> PHP

PHP 게터(Getter)와 세터(Setter) 메서드란? 개념부터 예제까지

PHP에서 객체 지향 프로그래밍을 하다 보면 클래스의 프로퍼티(속성)에 대한 접근을 제어해야 하는 경우가 자주 발생합니다. 이때 활용되는 것이 바로 게터(Getter)세터(Setter) 메서드입니다. 이 글에서는 PHP에서 게터와 세터를 구현하는 가장 좋은 방법을 예제와 함께 알아보겠습니다.

게터와 세터는 주로 private으로 선언된 변수에 사용자가 직접 접근하는 것을 막고, 메서드를 통해서만 값을 읽거나 설정하도록 만들 때 사용됩니다.

  • 게터(Getter): 객체 내부의 변수 값을 가져오거나 반환하는 메서드입니다.
  • 세터(Setter): 객체 내부의 변수 값을 설정하거나 변경하는 메서드입니다.

예제 1: private 프로퍼티에 직접 접근하면 어떻게 될까?

먼저, private 프로퍼티에 직접 접근했을 때 어떤 문제가 발생하는지 살펴보겠습니다.

<?php
class Person {
    private $name;

    public function setName($name) {
        $this->name = $name;
    }

    public function getName() {
        return $this->name;
    }
}

$person = new Person();
echo $person->name;
?>

출력 결과

Fatal error: Uncaught Error: Cannot access private property Person::$name

코드 설명

위의 Person 클래스에는 $name이라는 private 프로퍼티가 있습니다. 프로퍼티의 가시성(visibility)이 private으로 선언되었기 때문에 클래스 외부에서 $person->name;처럼 직접 접근할 수 없으며, 위 예제처럼 실행하면 치명적인 오류(Fatal Error)가 발생합니다.

예제 2: 게터와 세터를 사용한 올바른 접근 방법

그렇다면 private 프로퍼티에 안전하게 접근하고 값을 설정하려면 어떻게 해야 할까요? 바로 클래스에 미리 정의해 둔 세터 메서드 setName()과 게터 메서드 getName()을 활용하면 됩니다.

<?php
class Person {
    private $name;

    public function setName($name) {
        $this->name = $name;
    }

    public function getName() {
        return 'welcome ' . $this->name;
    }
}

$person = new Person();
$person->setName('Alex');
$name = $person->getName();
echo $name;
?>

출력 결과

welcome Alex

코드 설명

Person 객체를 인스턴스화한 후, 세터 메서드인 setName('Alex')를 호출하여 private 프로퍼티 $name의 값을 'Alex'로 설정했습니다. 그다음 게터 메서드 getName()을 통해 해당 값을 읽어와 출력했습니다. 이 과정에서 private 프로퍼티에 직접 접근하지 않았음에도 불구하고, 원하는 값을 자유롭게 저장하고 조회할 수 있었습니다.

또한 게터 메서드 안에서 단순히 값을 반환하는 것을 넘어 'welcome'이라는 문자열을 붙여 출력 형식을 조정한 것처럼, 값을 반환하기 전에 원하는 처리를 추가할 수 있다는 점도 눈여겨볼 만합니다.

게터와 세터를 사용해야 하는 이유

게터와 세터는 단순히 오류를 피하기 위한 수단이 아니라, 객체 지향 프로그래밍의 핵심 원칙인 캡슐화(Encapsulation)를 실천하는 대표적인 방법입니다.

  • 캡슐화: 내부 데이터를 외부로부터 보호하고, 정의된 메서드를 통해서만 접근하도록 강제합니다.
  • 유효성 검사: 세터 메서드에서 입력값을 검증하여 잘못된 데이터가 저장되는 것을 사전에 방지할 수 있습니다.
  • 유연성: 내부 구현이 변경되더라도 외부에서 호출하는 메서드의 형태를 그대로 유지할 수 있습니다.
  • 읽기 전용 / 쓰기 전용 속성: 게터만 제공하면 읽기 전용, 세터만 제공하면 쓰기 전용 프로퍼티를 구현할 수 있습니다.

정리하자면, PHP에서 private 프로퍼티를 다룰 때는 게터와 세터 메서드를 통해 간접적으로 접근하는 것이 표준적이며 안전한 방법입니다. 이를 습관화하면 코드의 안정성과 유지보수성이 크게 향상됩니다.