컴퓨터 과학에서 **뮤테이터 메소드**(mutator method)는 변수의 변경을 통제하기 위해 사용하는 메소드이다. **세터**(setter) 메소드로 널리 알려져 있다. 프라이빗 멤버 변수의 값을 반환하는 **액세서**(accessor)로도 불리는 게터(getter)와 동반하여 자주 사용된다.

뮤테이터 메소드는 캡슐화의 원칙을 유지하면서 객체 지향 프로그래밍에 주로 사용된다. 이 원칙에 따라 클래스의 멤버 변수는 다른 코드로부터 숨겨져서 비공개되고 보호되며 원하는 새로운 값을 변수로 취하고 선택적으로 유효성을 확인하며 프라이빗 멤버 변수를 수정하는 퍼블릭 멤버 함수(뮤테이터 메소드)에 의해서만 수정이 가능하다. 뮤테이터 메소드는 할당 연산자 오버로딩과 비교되지만 이것들은 객체 계층의 레벨에서 차이가 있다.

뮤테이터 메소드는 객체 지향이 아닌 환경에서도 사용할 수 있다. 이 경우 수정할 변수의 참조는 새로운 값과 함께 뮤테이터로 전달된다. 이 시나리오에서 컴파일러는 코드가 뮤테이터 메소드를 통과하여 변수를 직접 변경하는 일에 제한을 둘 수 없다. 이 제한을 두는 책임은 개발자에게 있으며 변수가 오직 뮤테이터 메소드를 통해서만 수정이 되고 직접 수정해서는 안 되도록 보장해야 한다.

뮤테이터 메소드를 지원하는 프로그래밍 언어에서 프로퍼티는 캡슐화 활용을 포기하지 않고도 편리한 대안을 제공한다.

## 예시

### C
파일 student.h:

파일 student.c:

struct student {
 int age;
 char *name;

student *student_new {
 student *s = malloc(sizeof(student));
 s->name = strdup(name);
 s->age = age;
 return s;

void student_delete(student *s) {
 free(s->name);
 free(s);

void student_set_age {
 s->age = age;

int student_get_age(student *s) {
 return s->age;

char *student_get_name(student *s) {
 return s->name;

파일 main.c:

파일 Makefile:

all: out.txt; cat $<
out.txt: main; ./$

### C++
파일 Student.h:

파일 Student.cpp:

### C#
초기 버전의 C 샤프:

public class Student
 private string name;

 /// 
 public string Name
 get { return name; }
 set { name = value; }

나중 버전의 C# (.NET Framework 3.5 이상):

### D
인스턴스는 아래와 같이 사용이 가능하다:

### 델파이
interface

type
 TStudent = class
 strict private
 FName: string;
 procedure SetName(const Value: string);
 public
 /// 
 property Name: string read FName write SetName;
 end;

// ...

implementation

procedure TStudent.SetName(const Value: string);
begin
 FName := Value;
end;

end.

### 자바
public class Student {
 private String name;

 public String getName {
 return name;
 
 public void setName(String newName) {
 name = newName;

### 오브젝티브C
전통적인 Objective-C 1.0 문법 사용:

Mac OS X 10.6, iOS 4, Xcode 3.2에 사용되는 더 새로운 Objective-C 2.0 문법을 사용하여 위에 기술된 코드와 동일한 코드를 아래와 같이 생성할 수 있다:

OS X 10.8과 iOS 6를 기점으로 Xcode 4.4 이상을 사용 시 문법을 단순화할 수 있다:

### 펄
package Student;

sub new {
 bless {}, shift;

sub set_name {
 my $self = shift;
 $self->{name} = $_[0];

sub get_name {
 my $self = shift;
 return $self->{name};

1;

package Student;
use base qw(Class::Accessor);
__PACKAGE__->follow_best_practice;

Student->mk_accessors(qw(name));

1;

package Student;
use Moose;

has 'name' => ;

1;

### PHP
class Student
 private string $name;

 /**
 public function getName: string
 return $this->name;

 /**
 public function setName(string $newName): void
 $this->name = $newName;

class Student:
 def __init__ -> None:
 self._name = name

 @property
 def name(self):
 return self._name

 @name.setter
 def name:
 self._name = new_name

>>> bob = Student("Bob")
>>> bob.name 
Bob
>>> bob.name = "Alice"
>>> bob.name 
Alice
>>> bob._name = "Charlie" # bypass the setter
>>> bob._name # bypass the getter
Charlie

### 래킷
(define student%
 (class object%
 (init-field name)
 (define/public (get-name) name)
 (define/public (set-name! new-name) (set! name new-name))
 (super-new)))

(define s (new student% [name "Alice"]))
(send s get-name) ; => "Alice"
(send s set-name! "Bob")
(send s get-name) ; => "Bob"

(struct student (name) #:mutable)
(define s (student "Alice"))
(set-student-name! s "Bob")
(student-name s) ; => "Bob"

### 루비
개개의 액세서와 뮤테이터 메소드를 정의하면 데이터의 전처리 또는 유효성 확인을 위한 공간을 만들어준다.

 변수의 읽기 전용 단순 공개 접근:

 변수의 읽기-쓰기 단순 공개 접근:

### 러스트
struct Student {
 name: String,

impl Student {
 fn name(&self) -> &String {
 &self.name

 fn set_name {
 self.name = name

### 비주얼 베이직 닷넷
기본 코드:

VB.NET 2010 코드: