Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

nomad-programmer

[Programming/C#] 접근 한정자로 공개 수준 결정 본문

Programming/C#

[Programming/C#] 접근 한정자로 공개 수준 결정

scii 2020. 9. 8. 13:34

객체 지향 프로그래밍에서 필요한 최소의 기능만을 노출하고 내부를 감출 것을 요구한다. 이것을 은닉성이라고 한다.

객체 지향 프로그래밍의 3대 특성

객체 지향 프로그래밍에는 여러 가지 특성이 있다. 그 중에서도 3대 특성으로 꼽히는 것들이 있다.
이 셋중의 하나가 바로 은닉성이며 나머지 2개는 상속성(Inheritance)과 다형성(Polymorphism)이다.

클래스에 선언되어 있는 필드와 메소드 중에 어떤 것들은 사용자에게 노출할 것이 있는가 하면, 절대로 노출시키지 말아야 하는 것들도 있다. 특히 필드는 상수를 제외하곤 "무조건" 감추는 것이 좋다. 

접근 한정자 (Access Modifier)는 감추고 싶은 것은 감추고, 보여주고 싶은 것은 보여줄 수 있도록 코드를 수식하며, 필드, 메소드를 비롯해 프로퍼티 등 모든 요소에 대해 사용할 수 있다. 

C#에서 제공하는 접근 한정자는 모두 여섯 가지이며, 다음과 같다.

접근 한정자 설명
public 클래스의 내부/외부 모든 곳에서 접근 가능
protected 클래스의 외부에서는 접근할 수 없지만, 파생 클래스에서는 접근 가능
private 클래스의 내부에서만 접근 가능. 파생 클래스에서도 접근 불가능
internal 같은 어셈블리에 있는 코드에서만 public으로 접근 가능. 다른 어셈블리에 있는 코드에서는 private와 같은 수준의 접근성을 가짐.
protected internal 같은 어셈블리에 있는 코드에서만 protected로 접근 가능. 다른 어셈블리에 있는 코드에서는 private와 같은 수준의 접근성을 가짐.
private protected 같은 어셈블리에 있는 클래스에서 상속받은 클래스 내부에서만 접근이 가능
접근 한정자로 수식하지 않은 클래스의 멤버는 무조건 private로 접근 수준이 자동으로 지정된다. 즉, 클래스 내의 멤버는 일단 감추고 보고, 그 후 공개할지를 결정하는 것이 순서라는 뜻이다.
using System;

namespace CSharpExample
{
    class WaterHeater
    {
        protected int temperature;

        public void SetTemperature(int temperature)
        {
            if (temperature < -5 || temperature > 42)
            {
                throw new Exception("out of temperature range");
            }
            this.temperature = temperature;
        }

        internal void TurnOnWater()
        {
            Console.WriteLine($"turn on water: {temperature}");
        }
    }

    class MainApp
    {
        static int Main(string[] args)
        {
            try
            {
                WaterHeater heater = new WaterHeater();
                heater.SetTemperature(20);
                heater.TurnOnWater();

                heater.SetTemperature(-2);
                heater.TurnOnWater();

                heater.SetTemperature(50);
                heater.TurnOnWater();
            }
            catch (Exception err)
            {
                Console.WriteLine(err.Message);
            }

            return 0;
        }
    }
}

/* 

turn on water: 20
turn on water: -2
out of temperature range

*/
Comments