setter

AI
qwen-3-235b-a22b-instruct-2507
작성자
익명
작성일
2025.09.02
조회수
5
버전
v1

setter

개요

setter는 객체지향프로그래밍OP, Object-Oriented Programming에서 객체의 속성(또는 필드, 멤버 변수) 값을 설정하기 위해 사용하는 특수한 메서드 의미합니다. 일반적으로 getter와 함께 쌍을 이루며, 객체의 내부 상태를 안전하게 접근하고 수정할 수 있도록 돕는 캡슐화(Encapsulation)의 핵심 요소입니다. setter는 외부에서 직접 필드에 접근하는 것을 제한하고, 값을 설정할 때 추가적인 검증이나 로직을 적용할 수 있게 해줍니다.


setter의 목적과 필요성

캡슐화 지원

객체지향의 핵심 원칙 중 하나인 캡슐화는 객체의 내부 데이터를 외부로부터 보호하고, 오직 정의된 인터페이스를 통해 접근하도록 하는 디자인 원칙입니다. 예를 들어, 다음과 같은 클래스가 있다고 가정해 봅시다:

public class Person {
    private String name;
    private int age;

    // setter 메서드
    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        if (age < 0) {
            throw new IllegalArgumentException("나이는 음수가 될 수 없습니다.");
        }
        this.age = age;
    }
}

위 예제에서 nameage 필드는 private으로 선언되어 외부에서 직접 접근할 수 없습니다. 그러나 setAge() 메서드를 통해 나이를 설정할 때 음수 입력 방지와 같은 검증 로직을 추가할 수 있습니다. 이처럼 setter는 데이터 무결성을 보장하는 데 중요한 역할을 합니다.

유연한 제어

setter를 사용하면 값 설정 시 다음과 같은 유연한 제어가 가능합니다:

  • 입력 값 검증 (예: 범위, 형식, null 체크)
  • 로그 기록
  • 값 변경 시 이벤트 발생 (예: 속성 변경 알림)
  • 계산된 값 반영

언어별 setter 구현 방식

Java

Java에서는 일반적으로 set + 속성명(대문자) 형태의 메서드를 사용합니다.는 JavaBeans 규약에 따라 표준화되어 있습니다.

public class Car {
    private String model;
    private int speed;

    public void setModel(String model) {
        if (model == null || model.trim().isEmpty()) {
            throw new IllegalArgumentException("모델명은 비어 있을 수 없습니다.");
        }
        this.model = model;
    }

    public void setSpeed(int speed) {
        if (speed < 0 || speed > 200) {
            throw new IllegalArgumentException("속도는 0~200 사이여야 합니다.");
        }
        this.speed = speed;
    }
}

Python

Python에서는 @property 데코레이터와 함께 @속성명.setter를 사용하여 더 직관적인 방식으로 setter를 정의할 수 있습니다.

class Rectangle:
    def __init__(self, width, height):
        self._width = width
        self._height = height

    @property
    def width(self):
        return self._width

    @width.setter
    def width(self, value):
        if value <= 0:
            raise ValueError("너비는 양수여야 합니다.")
        self._width = value

    @property
    def height(self):
        return self._height

    @height.setter
    def height(self, value):
        if value <= 0:
            raise ValueError("높이는 양수여야 합니다.")
        self._height = value

이 방식은 외부에서 rect.width = 10처럼 자연스럽게 값을 설정하면서도 내부적으로 검증 로직을 수행할 수 있게 해줍니다.

C

C#은 속성(Property)을 통해 getter와 setter를 간결하게 정의할 수 있습니다.

public class BankAccount
{
    private decimal _balance;

    public decimal Balance
    {
        get { return _balance; }
        set
        {
            if (value < 0)
                throw new ArgumentException("잔고는 음수일 수 없습니다.");
            _balance = value;
        }
    }
}


setter 사용 시 주의사항

  • 과도한 사용 지양: 모든 필드에 setter를 제공하면 캡슐화의 의미가 퇴색될 수 있습니다. 불필요한 변경을 허용하지 않도록 제한해야 합니다.
  • 불변성 고려: 일부 객체는 생성 후 상태가 변하지 않아야 할 경우가 있습니다. 이 경우 setter를 제공하지 않고 생성자에서만 값을 설정하는 불변 객체(Immutable Object) 패턴을 사용하는 것이 좋습니다.
  • 성능 고려: 프로퍼티 접근 방식은 직접 필드 접근보다 약간 느릴 수 있으므로, 성능이 중요한 경우 최적화를 고려해야 합니다.

관련 개념

  • getter: 객체의 속성 값을 읽기 위한 메서드.
  • getter/setter 패턴: 데이터 캡슐화를 위해 getter와 setter를 함께 사용하는 디자인 패턴.
  • 프로퍼티(Property): Python, C# 등에서 getter/setter를 보다 자연스럽게 사용할 수 있도록 제공하는 언어 수준 기능.

참고 자료


setter는 객체의 내부 상태를 안전하고 통제된 방식으로 수정할 수 있도록 해주는 중요한 기법이며, 잘 설계된 객체지향 시스템에서는 빠질 수 없는 요소입니다. 적절한 사용을 통해 코드의 유지보수성과 안정성을 높일 수 있습니다.

AI 생성 콘텐츠 안내

이 문서는 AI 모델(qwen-3-235b-a22b-instruct-2507)에 의해 생성된 콘텐츠입니다.

주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.

이 AI 생성 콘텐츠가 도움이 되었나요?