Unity C#/개념 및 문법 정리

[Unity C#] 객체 지향 _ 캡슐화(접근 제한자, 프로퍼티)

routine96 2025. 1. 16. 11:22

캡슐화

관련있는 데이터와 메소드로 객체를 만들고(하나의 단위로 묶는다), 객체 밖에서 알아야 할 필요가 없는 내부 멤버를 숨기는 것이다. 캡슐화의 가장 큰 장점은 정보 은닉에 있다. 외부에서 객체의 속성과 기능을 변경하지 못하게 하고, 데이터가 변경되더라도 다른 객체에 영향을 주지 않아 독립성을 확보할 수 있다.

 결론적으로 캡슐화의 목적은 멤버를 하나의 단위로 묶어서 코드를 읽기 쉽고 수정하기 편리하게 만드는 것과 멤버를 보호함으로써 다른 사람에 의해 코드가 수정되거나 훼손되지 않게 막기 위해서이다.

 

 

 

 

 

접근 제한자(Access Modifier)

접근 제한자는 멤버의 공개 설정 범위를 결정하는 역할을 한다. 간단하게 자주 사용하는 public, protected, private에 대해 알아보자

 

public : 가장 개방적인 접근 권한 제공, 해당 클래스의 내부와 외부 모두 자유롭게 접근하고 사용이 가능하다.

protected : 클래스 내부와 해당 클래스를 상속받은 파생 클래스에서만 접근이 가능하다.

private : 해당 클래스 내부에서만 접근이 가능하다.

 

 

 

이 3가지 이외에도 다른 접근제한자가 존재한다. 자세한 건 공식 문서를 참조하자

접근 제한자 공식 문서 : https://learn.microsoft.com/ko-kr/dotnet/csharp/programming-guide/classes-and-structs/access-modifiers

 

액세스 한정자 - C#

C#의 모든 형식과 형식 멤버에는 다른 코드에서 사용될 수 있는지 여부를 제어하는 액세스 가능성 수준이 있습니다. 이 액세스 한정자 목록을 검토합니다.

learn.microsoft.com

 

 

 

 

 

 

프로퍼티(Property)

다른 개발자의 코드를 보게 될 떄 get, set이라는 것을 자주 본 적이 있다. 그렇다면 이것은 뭐고 왜 써야할까? 프로퍼티란 속성이라는 의미를 가지고, 클래스안에서 변수를 선언 후 다른 클래스에서 사용을 하려면 Public을 붙여 줘야하는데 정보 은닉을 위해 private로 선언 후  get,set 메소드를 통해 데이터에 접근을 하게 해준다.

 

프로퍼티 개념을 알기 전에 private로 선언된 변수를 다른 클래스에서 가져오는 예시 코드를 보자

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestProperty
{
    private int num = 10;

    public int GetNum()
    {
        return num;
    }

    public void SetNum(int value)
    {
        num = value;
    }
}
public class PropertyEx : MonoBehaviour
{
    TestProperty testProperty = new TestProperty();

    void Start()
    {
        Debug.Log(testProperty.GetNum()); // 결과 : 10
        testProperty.SetNum(50); 
        Debug.Log(testProperty.GetNum()); // 결과 : 50
    }
}

 위 코드처럼 TestProperty클래스에서 private으로 선언한 num 변수는 PropertyEx 클래스에서 접근이 불가능하다. 하지만 public으로 선언한 GetNum과 SetNum을 호출해서 값을 가져오거나 설정할 수 있다. 여기서 GetNum을 접근자 메소드, SetNum을 설정자 메소드라고 부른다.

 그렇다면 그냥 num을 public으로 선언하면 되는데 왜 굳이 저렇게 사용해야 할까? 그렇게 사용해도 무방하지만 예를 들어 public으로 num을 선언한 뒤 다른 100개의 클래스에 num을 사용한다고 치자. 그렇다면 num에 대한 조건 검사나 변경점이 필요할 때 100군데에서 체크를 해야 한다. 코드를 변경해보자

 

    public void SetNum(int value)
    {
        if (value >= 100)
            return;
        num = value;
    }

이렇게 조건을 SetNum에 구현한다면 코드 관리가 훨씬 편리하다. 하지만 위처럼 구현하게 되면 고작 num의 정보를 알기 위해서 코드가 너무 길어진다는 느낌이 있다. 그래서 등장한 게 프로퍼티라는 개념이다.

 

 

프로퍼티 사용 예시

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestProperty
{
    private int num = 10;

    public int Num
    {
        get { return num; }
        set
        {
            if (value >= 100)
                return;
            num = value;
        }
    }
    
}
public class PropertyEx : MonoBehaviour
{
    TestProperty testProperty = new TestProperty();

    void Start()
    {
        Debug.Log(testProperty.Num); // 결과 : 10
        testProperty.Num = 50;
        Debug.Log(testProperty.Num); // 결과 : 50
    }
}

위 처럼 get, set을 활용해 코드를 변환하고 사용하는 방식을 변수처럼 사용할 수 있다.  get은 바꾸기 전 코드랑 구조가 비슷하다. set구조는 뭔가 다르다. 바꾸기 전 코드는 SetNum함수에 매개변수를 value를 받아서 조건을 검사하고 value를 num값에 넣어준다. 하지만 set은 아무것도 없는데 넣어주는 게 코드상으로 이상하다. 이는 C# 컴파일러가 value를 매개변수로 간주해주므로 두 코드의 결과는 같다. 처음엔 어색할 수 있지만 후에 본다면 오히려 더 깔끔하게 사용할 수 있을 것 같다.

 

 

자동 구현 프로퍼티

위에서 배운 프로퍼티를 더 축약이 가능하다. 처음 코드처럼 아무 조건없이 그냥 num값만 이용할 경우에 자동 구현 프로퍼티로 아래 그림처럼 더 축약이 가능하다.







자동 구현 프로퍼티

왼쪽 처럼 간단한 내용이라면 더 축약이 가능하다. 컴파일러가 알아서 int num같은 변수를 만들어서 대입한다.

 

C# 공식 문서 :https://learn.microsoft.com/ko-kr/dotnet/csharp/programming-guide/classes-and-structs/using-properties

 

속성 사용 - C#

다음 예제에서는 C#의 속성을 사용하는 방법을 보여줍니다. get 및 set 접근자가 읽기 및 쓰기 액세스를 구현하고 속성 사용법을 알아보는 방법을 확인합니다.

learn.microsoft.com

 

오늘 정리한 내용은 코딩을 공부하면서 정말 많이 봐왔던 것들이다. 확실하게 이해하고 넘어가자!