C#/이것이 C#이닀

22. 은닉성, μ ‘κ·Ό ν•œμ •μž

Rainbow🌈Coder 2022. 2. 10. 17:05
728x90

객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ° 3λŒ€ νŠΉμ„± : 은닉성, 상속성, λ‹€ν˜•μ„±

 

객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—λŠ” 클래슀의 μ‚¬μš©μžμ—κ²Œ ν•„μš”ν•œ μ΅œμ†Œμ˜ κΈ°λŠ₯만 λ…ΈμΆœν•˜κ³  λ‚΄λΆ€λ₯Ό 감좜 것을 μš”κ΅¬ν•œλ‹€.

이것을 은닉성이라고 ν•œλ‹€.

 

ν΄λž˜μŠ€μ— μ„ μ–Έλ˜μ–΄ μžˆλŠ” ν•„λ“œμ™€ λ©”μ†Œλ“œ 쀑 μ–΄λ–€ 것듀은 μ‚¬μš©μžμ—κ²Œ λ…ΈμΆœν•  것이 μžˆλŠ”κ°€ ν•˜λ©΄

μ ˆλŒ€λ‘œ λ…ΈμΆœμ‹œν‚€μ§€ 말아야 ν•˜λŠ” 것듀도 μžˆλ‹€.

μ ‘κ·Ό ν•œμ •μžλŠ” 감좔고 싢은 것은 감좔고, 보여주고 싢은 것은 보여쀄 수 μžˆλ„λ‘ μ½”λ“œλ₯Ό μˆ˜μ‹ν•˜λ©°

ν•„λ“œ, λ©”μ†Œλ“œλ₯Ό λΉ„λ‘―ν•΄ ν”„λ‘œνΌν‹° λ“± λͺ¨λ“  μš”μ†Œμ— λŒ€ν•΄ μ‚¬μš©ν•  수 μžˆλ‹€.

C#μ—μ„œ μ œκ³΅ν•˜λŠ” μ ‘κ·Ό ν•œμ •μžλŠ” λͺ¨λ‘ μ—¬μ„―κ°€μ§€λ‘œ, λ‹€μŒκ³Ό κ°™λ‹€.

μ ‘κ·Ό ν•œμ •μž μ„€λͺ…
public 클래슀 λ‚΄λΆ€/μ™ΈλΆ€ λͺ¨λ“  κ³³μ—μ„œ μ ‘κ·Όν•  수 μžˆλ‹€.
protected 클래슀의 μ™ΈλΆ€μ—μ„œλŠ” μ ‘κ·Όν•  수 μ—†μ§€λ§Œ, νŒŒμƒ ν΄λž˜μŠ€μ—μ„œλŠ” 접근이 κ°€λŠ₯ν•˜λ‹€.
private 클래슀의 λ‚΄λΆ€μ—μ„œλ§Œ μ ‘κ·Όν•  수 μžˆλ‹€. νŒŒμƒ ν΄λž˜μŠ€μ—μ„œλ„ 접근이 λΆˆκ°€λŠ₯ν•˜λ‹€.
internal 같은 μ–΄μ…ˆλΈ”λ¦¬μ— μžˆλŠ” μ½”λ“œμ—μ„œλ§Œ public으둜 μ ‘κ·Όν•  수 μžˆλ‹€. λ‹€λ₯Έ μ–΄μ…ˆλΈ”λ¦¬μ— μžˆλŠ” μ½”λ“œμ—μ„œλŠ” private와 같은 μˆ˜μ€€μ˜ 접근성을 κ°€μ§„λ‹€.
protected internal 같은 μ–΄μ…ˆλΈ”λ¦¬μ— μžˆλŠ” μ½”λ“œμ—μ„œλ§Œ protected둜 μ ‘κ·Όν•  수 μžˆλ‹€. λ‹€λ₯Έ μ–΄μ…ˆλΈ”λ¦¬μ— μžˆλŠ” μ½”λ“œμ—μ„œλŠ” private와 같은 μˆ˜μ€€μ˜ 접근성을 κ°€μ§„λ‹€.
private protected(μ΄ˆκ°•λ ₯) 같은 μ–΄μ…ˆλΈ”λ¦¬μ— μžˆλŠ” ν΄λž˜μŠ€μ—μ„œ 상속받은 클래슀 λ‚΄λΆ€μ—μ„œλ§Œ 접근이 κ°€λŠ₯ν•˜λ‹€.

μ€‘μš”ν¬μΈνŠΈ : μ ‘κ·Ό ν•œμ •μžλ‘œ μˆ˜μ‹ν•˜μ§€ μ•Šμ€ 클래슀의 λ©€λ²„λŠ” 무쑰건 private둜 μ ‘κ·Ό μˆ˜μ€€μ΄ μžλ™ μ§€μ •λœλ‹€.

클래슀 λ‚΄μ˜ λ©€λ²„λŠ” 일단 감좔고 λ‚˜μ€‘μ— κ³΅κ°œν• μ§€λ₯Ό κ²°μ •ν•˜λŠ” 것이 μˆœμ„œμ΄κΈ° λ•Œλ¬Έμ΄λ‹€. 

 

 

using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;

namespace UsingOut
{
    class WaterHeater 
    {
        protected int temperature;
        public void SetTemperature(int temperature)//SetTemperature() λ©”μ†Œλ“œλŠ” -5~42 μ‚¬μ΄μ˜ κ°’λ§Œ 받아듀이고, 이 λ²”μœ„λ₯Ό λ²—μ–΄λ‚œ 값에 λŒ€ν•΄μ„œλŠ” μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¨λ‹€.
        {
            if(temperature < -5 || temperature > 42)
            {
                throw new Exception("Out of temperature range");
            }
            this.temperature = temperature;
        }
        internal void TurnOnWater()
        {
            WriteLine($"Turn on water : {temperature}");
        }
    }
    class MainApp
    {
        static void Main(string[] args)
        {
            try
            {
                WaterHeater heater = new WaterHeater();
                heater.SetTemperature(20);
                heater.TurnOnWater();

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

                heater.SetTemperature(50); //μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ—¬ λ‹€μŒ 행은 μ‹€ν–‰λ˜μ§€ μ•Šκ³  κ·Έ λ‹€μŒ ν–‰μ˜ catch λΈ”λ‘μœΌλ‘œ μ‹€ν–‰ μœ„μΉ˜κ°€ μ΄λ™ν•œλ‹€.
                heater.TurnOnWater();
            }
            catch(Exception e)
            {
                WriteLine(e.Message);
            }
        }
    }
}

<좜λ ₯ κ²°κ³Ό>

Turn on water : 20
Turn on water : -2
Out of temperature range

<μ—°μŠ΅>

using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;

namespace UsingOut
{
    class HeatedWater
    {
        protected int temperature;
        public void SetTemperature(int temperature)
        {
            if (temperature < 5 || temperature > 100)
                throw new Exception("Out of range!!!");
            this.temperature = temperature;
        }
        internal void PrintTemperature()
        {
            WriteLine($"물의 μ˜¨λ„λŠ”... {temperature}도 이닀.");
        }
    }
    class MainApp
    {
        static void Main(string[] args)
        {
            try
            {
                HeatedWater oneWater = new HeatedWater();
                oneWater.SetTemperature(50);
                oneWater.PrintTemperature();

                HeatedWater twoWater = new HeatedWater();
                twoWater.SetTemperature(-5);
                twoWater.PrintTemperature();

                HeatedWater threeWater = new HeatedWater();
                threeWater.SetTemperature(105);
                threeWater.PrintTemperature();

                HeatedWater fourWater = new HeatedWater();
                fourWater.SetTemperature(55);
                fourWater.PrintTemperature();
            }
            catch(Exception eeee)
            {
                WriteLine(eeee.Message);
            }
        }
    }
}

<μ—°μŠ΅ 좜λ ₯κ²°κ³Ό>

물의 μ˜¨λ„λŠ”... 50도 이닀.
Out of range!!!

<μ—°μŠ΅ 2>

using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;

namespace UsingOut
{
    class HeatedWater
    {
        protected int temperature;
        public void SetTemperature(int temperature)
        {
            if (temperature < 5 || temperature > 100)
                throw new Exception("Out of range!!!");
            this.temperature = temperature;
        }
        internal void PrintTemperature()
        {
            WriteLine($"물의 μ˜¨λ„λŠ”... {temperature}도 이닀.");
        }
    }
    class MainApp
    {
        static void Main(string[] args)
        {
            try
            {
                HeatedWater oneWater = new HeatedWater();
                oneWater.SetTemperature(50);
                oneWater.PrintTemperature();

                HeatedWater fourWater = new HeatedWater();
                fourWater.SetTemperature(55);
                fourWater.PrintTemperature();
            }
            catch(Exception eeee)
            {
                WriteLine(eeee.Message);
            }
        }
    }
}

<μ—°μŠ΅ 2 좜λ ₯κ²°κ³Ό>

물의 μ˜¨λ„λŠ”... 50도 이닀.
물의 μ˜¨λ„λŠ”... 55도 이닀.

<μ—°μŠ΅ 3>

using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;

namespace UsingOut
{
    class HeatedWater
    {
        protected int temperature;
        public void SetTemperature(int temperature)
        {
            if (temperature < 5 || temperature > 100)
                throw new Exception("Out of range!!!");
            this.temperature = temperature;
        }
        internal void PrintTemperature()
        {
            WriteLine($"물의 μ˜¨λ„λŠ”... {temperature}도 이닀.");
        }
    }
    class MainApp
    {
        static void Main(string[] args)
        {
            try
            {
                HeatedWater oneWater = new HeatedWater();
                oneWater.SetTemperature(50);
                oneWater.PrintTemperature();

                oneWater.SetTemperature(-5);
            }
            catch(Exception eeee)
            {
                WriteLine(eeee.Message);
            }
        }
    }
}

<μ—°μŠ΅ 3 좜λ ₯ κ²°κ³Ό>

물의 μ˜¨λ„λŠ”... 50도 이닀.
Out of range!!!
728x90