BLOG
C#

C# 6. 클래스 캡슐화


Feb. 26, 2022, 11:58 p.m.



객체지향 프로그래밍의 핵심은 클래스입니다. 클래스를 만들어 그것의 인스턴스(객체)를 생성하고 다루죠. 클래스 내부에는 다양한 변수들도 존재합니다. 우리는 참조를 통해서 그 변수에 접근할 수 있죠.

그러나 모든 변수를 참조 가능하게 만들면 여러가지 문제가 생길 수 있습니다.

한가지 예를 들어볼게요,

놀이공원 놀이기구 클래스가 있고 탑승 인원에 따른 티켓가격을 얻는 메소드가 있다고 생각해 보겠습니다.

이렇게 만들어 볼 수 있겠네요!

public class Ride {
    const int CostPerPerson = 10;
    public int NumberOfPeople = 0;
    public int Cost = 0;

    public void CalCost()
    {
        Cost = NumberOfPeople * CostPerPerson;
    }
}

인원당 가격을 담는 변수와 사람 수를 담는 변수, 그리고 총 가격을 담는 변수가 있습니다.

그리고 가격을 계산하는 메소드가 있습니다. 이 클래스를 활용하여 가격을 계산하려면 먼저 탑승하는 사람 수를 변경하고, 가격을 계산하는 메소드를 실행한 후 총 가격 변수를 참조하면 되겠네요.

이것이 이 클래스를 활용하는 의도입니다.

그러나 모두가 클래스를 의도대로 사용하지는 않죠. Ride 객체를 선언하고 사람 수를 변경하고 바로 가격을 읽어보겠습니다.

RollerCoaster = new Ride();

RollerCoaster.NumberOfPeople = 10;

Debug.Print(RollerCoaster.Cost);
0

당연히 가격이 제대로 계산되지 않습니다. 물론 이것은 간단한 예시이기에 제대로 사용하면 되지만 여러가지 변수와 메소드들이 얽혀있는 클래스에서는 클래스의 사용자가 이 클래스를 의도대로 사용할 수 있도록 만들어 주는 것이 중요합니다.

또한 위의 방법처럼 변수에 직접 접근하는 방식은 좋은 방법이 아닙니다. 만약 내부에서만 사용하는 변수가 있을 때 그 변수에 접근하여 값을 임의로 변경한다면 그 클래스가 정상적으로 작동할 수가 없겠죠? 예를 들어 Cost를 임의로 변경하게 되면 사람 수에 맞지않는 가격이 될 수 있습니다. 현재 Ride 클래스는 이것을 방지 할 수 없죠. 의도대로 흘러가지 않는 것입니다.

그렇기 때문에 클래스의 캡슐화가 필요합니다.


캡슐화란 클래스에 있는 데이터들을 대놓고 접근할 수 없게 숨기고 의도된 대로 클래스에 접근하고 수정, 참조할 수 있도록 하는 방법입니다.

캡슐화를 하면 사용하기 쉽고 관리하기 쉬우며 훨씬 유연하게 클래스를 사용할 수 있답니다.

숨겨야 하는 변수들을 private로 설정하고 그 값을 수정해야할 필요가 있을 때는 메서드를 이용해서만 수정할 수 있게 합니다.

Ride 클래스를 간단하게 캡슐화 해보겠습니다.

public class Ride {
    const int CostPerPerson = 10;
    private int NumberOfPeople = 0;
    private int Cost = 0;

    public void SetNumberOfPeople(int number)
    {
        NumberOfPeople = number;
        Cost = NumberOfPeople * CostPerPerson;
    }

    public int GetCost()
    {
        return Cost;
    }
}
RollerCoaster = new Ride();

RollerCoaster.SetNumberOfPeople(10);

Debug.Print(RollerCoaster.GetCost);
100

클래스를 사용하는 방법이 훨씬 깔끔해 졌습니다. 변수들은 private로 설정되어 접근할 수 없기 때문에 임의로 바꿀 수 없습니다. 또한 SetNumberOfPeople 메서드로 사람 수를 설정하고 가격도 바로 계산합니다.

마지막으로 GetCost를 통해 가격을 받아옵니다. Cost에 직접 접근할 수가 없기 때문에 Cost를 임의로 수정해서 사람 수에 맞지않는 가격을 설정할 수가 없습니다.

또한 메서드에 작동되는 내용이 명시되어 있기 때문에 훨씬 사용하기 편리하고 나중에 유지보수 하기에도 쉽겠죠?


속성을 이용하면 메소드를 이용하지 않고 참조를 하되 캡슐화의 효과를 낼 수 있습니다.

public class Ride {
    const int CostPerPerson = 10;
    private int numberofpeople = 0;
    public int Cost { get; private set; }   

    public int NumberOfPeople
    {
        get
        {
            return numberofpeople;
        }
        set
        {
            numberofpeople = value;
            Cost = numberofpeople * CostPerPerson;
        }
    }

}

이렇게 하면 변수에 참조를 하되 값을 바꿀 때 자동으로 Cost도 계산하게 하였고 Cost 변수는 임의로 설정할 수 없게 해서 계산에 착오가 생기는 일을 막았습니다.

지금까지 클래스의 캡슐화에 대해서 알아보았습니다. 꼭 구현하지 않아도 되지만 프로그램의 견고성과 오류 방지, 유지보수를 위해서라면 이러한 개념들을 사용해서 프로그램을 만들어 보시기를 바래요.

캡슐화



Search