개발 저장소/개발 지식 저장소

[C#] 접근 한정자(private, protected)가 필요한 이유

이거비버 2023. 2. 4. 12:14
반응형

객체 지향 프로그래밍의 3대 특성(은닉성, 상속성, 다형성) 중 은닉성은 '최소한의 기능만을 노출하고 내부를 감추는 것'을 얘기한다.

왜 기능들을 감춰야 할까?

여러 클래스에서 널리 쓰이게 하면 편하지 않을까?

 

예시를 들어보자면,

어떠한 난방장치를 만드는데 기준 온도가 10도~30도 사이라고 해보자.

난방장치를 사용하는 사용자는 이 장치의 온도를 지정된 범위 내에서만 조절할 수 있어야 한다.

그랬을때 이 장치는 아래와 같이 설계 되어야 한다.

 

실제 온도를 조절하는 회로 또는 배선 : 변수

사용자가 온도를 조절할 수 있게 해주는 버튼 : 메소드

 

만약 사용자가 회로, 배선을 잘 못 건드려서 온도가 100도까지 올라가면 안되기 때문에, 설계자는 이 회로나 배선을 건들지 못하도록 감춰야 한다.

즉 변수를 감춰야 한다.

 

그리고 버튼이라는 메소드에 온도 조절에 대한 제한을 두고 사용자에게 이 버튼을 제공함으로써 사용자에게 기획에 맞는 온도 조절 기능을 제공함과 동시에 사고를 방지할 수 있는 것이다.

 

아래에 예시 코드를 작성해봤다.

 

using System;

namespace Hello
{
    class Heater // 온도 조절 클래스
    {
        protected int temperature; // 변수 은닉, protected로 파생 클래스에서 활용 가능
        public void SetTemperature(int temperature) // temperature에 접근할 수 있는 메소드 제공
        {
            if (temperature < 0 || temperature >30)
            {
                throw new Exception("조절할 수 있는 온도 범위를 초과하였습니다.");
            }
            this.temperature= temperature;
        }

        internal void Update()
        {
            Console.WriteLine($"온도 변경 : {temperature}");
        }
    }

    class MainApp
    {
        static void Main(string[] args)
        {
            int k;
            while (true)
            {
                try
                {

                    Heater heater = new Heater();
                    Console.Write("온도 입력 : ");
                    k = Convert.ToInt32(Console.ReadLine());
                    heater.SetTemperature(k);
                    heater.Update();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
            

        }
    }
}

 

결과 화면은 다음과 같다.

콘솔 실행 화면

반응형