쫑가 과정

객체 지향 프로그래밍의 캡슐화 본문

Unity/이론

객체 지향 프로그래밍의 캡슐화

쫑가 2021. 12. 28. 11:31

https://learn.unity.com/tutorial/encapsulation-in-object-oriented-programming?uv=2020.3&pathwayId=5f7e17e1edbc2a5ec21a20af&missionId=5f779f1eedbc2a00201f3e5e#60b343c0edbc2a001ea945fc 

 

Encapsulation in object-oriented programming - Unity Learn

In this tutorial, you’ll learn about the second pillar in object-oriented programming: encapsulation. Explain how encapsulation is used to write code that can only be used as intended by the programmer Control access to data within a class by applying en

learn.unity.com

Encapsulation in object-oriented programming

 

코드의 기본 복잡성과 이를 사용하는 다른 코드 간의 분리 수준을 유지하는 데 중점

 

추상화는 다른 프로그래머가 쉽게 사용할 수 있도록 코드를 요약하는 것이지만

 

캡슐화는 값과 데이터를 마치 캡슐에 갇힌 것처럼 보호하는 것입니다.

다른 사람들이 하는 일과 액세스할 수 없는 일을 제어합니다.

 

캡슐화 (encapsulation)

캡슐화

주요 주제는 코드의 안전성

코드가 의도된 대로만 사용되도록 하고 조작하는 값과 데이터가 손상되지 않도록 하는 프로세스

캡슐화된 코드에서 다른 프로그래머는 변수 값이나 개체 속성을 쉽게 변경할 수 없다.

 

다른 스크립트가 코드에 액세스할 수 있는 다양한 방법을 모두 설명하는 것은 불가능하므로 의도한 대로만 수행할 수 있도록 만든 것을 캡슐화하는 것이 훨씬 좋다.

 

변수 및 메서드의 접근성은 캡슐화에서 주요 고려 사항

 

일반적으로 가능한 자주 변수를 비공개(private)로 유지하고 어디에서나 호출해야 한다고 확신하는 경우에만 메서드를 공개(public)로 설정한다.

그렇지 않으면 누구나 사용할 수 있다.

다른 사람이 코드에서 작업할 경우 실제로 사용해서는 안 되는 변수와 메서드를 사용하면 예기치 않은 문제가 쉽게 발생할 수 있다.

 

예) 공개(public)변수를 비공개(private) 변수로 설정해 값을 고정

public float speed = 20.0f;
private float speed = 20.0f;

 

Private 변수와 Inspector 가시성


다른 코드에 노출하지 않고(public을 사용하지 않고) 직렬화(serialized)라고도 하는 Inspecto창에서 사용할 수 있도록 하는 방법 : 인스펙터에서 변수를 자유롭게 수정하면서도 안전하게 유지한다.

 

변수(public, private)의 접근 한정자는 실제로 직렬화를 제어하지 않는다.

그러나 public 변수는 기본적으로 직렬화된다.

 

[SerializeField] 태그를 추가하여 Inspector에서 개인 변수를 쉽게 노출할 수 있다.

 

예) 비공개 변수지만 [SerializeField] 태그를 사용해 Inspector창에서 색상을 변경할 수 있다.

public class Rabbit : MonoBehaviour 
{
    [SerializeField] // exposes private variables in the inspector
    private Color furColor;
}

 

Getter와 Setter를 사용하여 속성 만들기


변수를 "읽기 전용"으로 만들어 다른 클래스가 가져오지만 값을 설정할 수 없도록 하는 것

C# get 및 set 메서드를 사용할 수 있다. 이 메서드는 변수를 사용할 수 있는 방법과 시기를 제어한다.

 

get 또는 set 접근자를 변수에 추가하는 즉시 해당 변수는 속성(Property)이 된다.

이러한 특수 메서드를 통해 내부 데이터에 대한 액세스를 제공하는 특수한(specialized)종류의 변수.

 

예) public 변수이지만 get 접근자만 사용해 내, 외부 클래스에서 설정할 수 없게 만듬.

public static MainManager Instance { get; } // add getter to the end of the line

set 접근자가 없으면 이 속성은 엄격하게 읽기 전용. 값은 어디에도 설정할 수 없다.

즉, 자체 클래스 내에서도 설정할 수 없다.

 

예) private set 접근자를 추가해 내부 클래스에서는 설정 가능하게 만든다.

public static MainManager Instance { get; private set; } // add private setter
외부 세계의 오용 및 손상으로부터 안전한 자체 클래스의 수정만 허용하도록 캡슐화되어 있다.
 
단순히 값을 가져오거나 설정하는 것뿐
이 간단한 구현을 자동 구현 속성(auto-implemented property)이라고 한다
 

Setter 유효성 검사(validations)의 필요성 찾기


값을 설정할 수 있는지 여부 또는 위치를 제한하는 것(getter, setter) 외에도

값을 보다 사용자 정의된 수동 방식으로 설정할 수 있는 방법을 제한할 수도 있습니다.

 

getter 또는 setter 내에서 유효성 검사 또는 계산을 수행하려면 속성에 대한 지원 필드(backing field),

즉 공용(public) 속성에 의해 노출된 데이터를 저장하는 개인 필드(private field)(변수)가 필요하다.

 

예) 공개 변수 값을 지원 비공개 변수인 지원 필드에 저장.

private float m_ProductionSpeed = 0.5f; // 지원필드
public float ProductionSpeed // delete semicolon
{
    get { return m_ProductionSpeed; } // getter returns backing field
    set { m_ProductionSpeed = value; } // setter uses backing field
}

비공개 멤버 변수(백킹 필드)를 추가하지만 대신 이 새 비공개 필드에 값을 저장.

지원 필드(backing field)가 선언되면 이제 누군가가 공용 속성(public Property)에 액세스할 때 지원 필드를 검색하거나 할당하는 get 및 set 함수를 수동으로 추가할 수 있습니다.

 

단순한 get 및 set 메소드가 아니기 때문에 "{ get; set; }” 이전에 자동 구현 속성과 함께 사용한 축약형이다.

 

누군가 ProductionSpeed ​​속성을 설정하면 지원 필드가 입력한 값으로 설정된다.

 

음수를 방지하기 위해 setter 유효성 검사 구현


예) set 메서드 내에서 유효성 검사를 구현하여 Production Speed가 항상 양수인지 확인할 수 있다. 

set
{
    if (value < 0.0f)
    {
            
            Debug.LogError("You can't set a negative production speed!");
    }
    else
    {
            m_ProductionSpeed = value; // original setter now in if/else statement
    }
}

 

캡슐화는 값에 액세스하고 변경하는 방식을 제어하여 코드를 보호하므로 코드가 명시적으로 설계된 대로만 사용된다.
추상화와 마찬가지로 캡슐화는 코드의 근본적인 복잡성코드에 액세스할 수 있는 프로그래머 사이에 분리 계층을 배치한다.
프로젝트에서 자동 구현 속성을 사용하여 변수를 외부 클래스에 대한 읽기 전용으로 만들었다.
그런 다음, 속성이 음수로 설정되는 것을 방지하기 위해 지원 필드(backing field)가 있는 속성에 대한 getter 및 setter를 작성했다.
Comments