[C#] 접근제한자와 프로퍼티, 캡슐화

Lumos Velog·2025년 7월 22일
0

접근 제한자(Access Modifier)

접근 제한자는 클래스, 변수, 함수(메서드) 등 객체 지향 프로그래밍 요소의 접근 가능 범위를 지정하는 키워드이다.
코드의 특정 멤버가 클래스 내부, 외부, 자식 클래스 등에서 어떤 범위로 접근될 수 있는지 명확하게 제한 한다.


  • public
    어디서든 접근이 가능함을 의미
public int health;

  • private
    선언된 클래스 내부에서만 접근이 가능
private int score;

  • protected
    선언된 클래스 및 이를 상속한 자식 클래스에서만 접근 가능
protected float speed;

  • internal
    동일한 어셈블리(프로젝트) 내에서만 접근 가능, 유니티에서는 잘 사용되지 않는다.



장점

캡슐화를 위한 기본 도구이며, 외부 접근을 제한하기 무분별한 외부 참조나 실수를 방지 할 수 있고, 또 다른 사람이 코드를 읽을때 ‘외부에서 사용되는구나’ 하는 가독성 측면에서 장점이 있다. 실제로 타인의 코드를 볼때 전부다 public 으로 되어있으면 시작부터 굉장한 스트레스를 받고 시작하는 경우가 더러 있었다.




캡슐화(Encapsulation)

캡슐화는 객체 지향 프로그래밍의 4대 특징 중 하나로, 데이터와 그 데이터를 처리하는 메서드를 하나로 묶고,
외부로부터 데이터를 보호(은닉)하는 개념이다.
즉, 내부 구현 내용을 숨기고, 외부에서는 지정된 인터페이스(메서드, 프로퍼티)만을 통해 접근하도록 제한한다.

캡슐화의 목적으로는 주로 다음과 같다.

  • 데이터 보호: 객체 내부 데이터의 직접적인 접근을 막음으로써 잘못된 사용이나 변경으로부터 보호
  • 유지보수성 향상: 내부 구현을 변경하더라도, 외부에는 영향을 주지 않음
  • 코드의 신뢰성 증대: 데이터 무결성을 유지



구현방법

주로 private 접근 제한자를 사용하여 변수(필드)를 숨기고,
외부에서 값을 읽거나 쓸 필요가 있을 때는 public 메서드(getter/setter) 또는 프로퍼티(property) 를 사용한다.

public class Player
{
    private int health; // 직접 접근 불가

    // Getter, Setter 메서드
    public int GetHealth()
    {
        return health;
    }

    public void SetHealth(int value)
    {
        // 유효성 검사 등의 로직 추가 가능
        health = value;
    }

    // 또는 C# 프로퍼티
    public int Health
    {
        get { return health; }
        set { health = value; }
    }
}

  • 유니티에서의 활용
    유니티에서는 public 필드로 선언하면 Inspector 창에서 값을 직접 수정할 수 있지만
    무분별한 public 사용은 코드의 안전성을 해칠 수 있으므로,
    [SerializeField] private 형태로 필드를 선언하고,
    필요하다면 public 프로퍼티를 통해 값을 노출하는 것이 권장된다.
public class Enemy : MonoBehaviour
{
    [SerializeField]
    private int hp; // Inspector 노출, 외부 직접 접근 불가

    public int Hp // 외부에서 읽기 전용
    {
        get { return hp; }
    }
}



프로퍼티(Property)

프로퍼티(Property)는 객체 지향 프로그래밍(C#)에서 필드의 값을 안전하게 읽거나 쓸 수 있도록 제공하는 특수한 메서드 집합이다.
즉, 필드(변수)에 직접 접근하지 않고, get/set 접근자를 통해 간접적으로 값에 접근할 수 있는 기능이다


목적

  • 캡슐화 강화: 필드에 대한 직접적인 접근을 막고, 값의 읽기/쓰기를 통제할 수 있습다.

  • 데이터 무결성 유지: 값을 변경할 때 유효성 검사, 로깅, 트리거 등의 부가적인 로직을 삽입할 수 있다.

  • 외부와의 인터페이스 제공: 외부에서 필드를 사용하는 방식은 단순하지만, 내부적으로는 세밀한 제어가 가능하다.




구현방법

  • get 접근자: 프로퍼티의 값을 가져올 때 실행되는 코드 블록
  • set 접근자: 프로퍼티에 값을 대입할 때 실행되는 코드 블록

value는 set 접근자 내부에서 대입되는 값을 나타낸다.

private int age; // private 필드

public int Age // 프로퍼티
{
    get { return age; }        // 값을 읽을 때 실행
    set { age = value; }       // 값을 쓸 때 실행
}


읽기 전용/쓰기 전용

  • 읽기 전용 프로퍼티: set 접근자를 생략
  • 쓰기 전용 프로퍼티: get 접근자를 생략
public int Age
{
    get { return age; }
}

// 쓰기 전용
public int Age
{
    set { age = value; }
}


자동구현 프로퍼티
간단히 값을 저장하고 반환하는 경우, C#에서는 자동 구현 프로퍼티 문법을 제공한다.

public int Age { get; set; }


활용
프로퍼티를 사용하면, 값의 변경에 제약을 두거나 안전하게 값을 변경 할 수 있다.

private int hp;

public int Hp
{
    get { return hp; }
    set
    {
        if (value < 0)
            hp = 0;       // 0 이하로 내려가지 않도록 제약
        else
            hp = value;
    }
}

0개의 댓글