제로의영역

7.7 접근 한정자로 공개 수준 결정하기(은닉성) 본문

C#

7.7 접근 한정자로 공개 수준 결정하기(은닉성)

아이큐제로 2019. 5. 28. 18:07

* 본 블로그 글은 머리가 아~~~주 나쁜 왕X100초보가 프로그래밍을 공부하면서 정리를 위해 작성하는 글입니다. 잘못 정리되거나 제가 잘못 이해한 글은 이해 및 조언 부탁드립니다.

* 공부는 '이것이 C#이다' 책을 보고 하고 있습니다. 참고로 저같은 왕초보가 보기 어렵게 써져 있어서 별도의 정리 문서를 만들게 되었습니다.

 

 (1) 객체지향 프로그래밍의 3대 특성인 은닉성, 상속성, 다형성 중 은닉성에 대한 글.

 

 (2) 정의: 필요한 최소의 기능만을 노출하고 내부를 감추는 것.

 

 (3) 용도

  1) 클래스에 선언되어 있는 필드와 메소드 중 감추어야 할 것이 있을 때 사용.   

  2) 필드(클래스 안에 선언된 변수들)는 상수를 제외하고는 "무조건" 감추는 것이 좋음.

  3) 필드, 메소드, 프로퍼티 등 모든 요소에 대해 사용 가능.

 

 (4) 사용법

  1) 접근 한정자(Access Modifier)를 사용하여 코드를 수식함.

    >> 접근 한정자를 맨 앞에 붙임: public class MyClass, public void PrintMember(MyClass mc).. 등

  2) 접근 한정자로 수식하지 않은 클래스의 멤버는 무조건 private로 접근 수준이 자동으로 지정.

 

 (5) 접근 한정자의 종류 기능

 

  1) public

   A. 클래스의 내부/외부 모든 곳에서 접근 가능

   B. 확장된 기능을 만들거나 상속을 하는 등의 기능을 위해 사용.

 

  2) protected

   A. 클래스 내부, 파생클래스(자식클래스)에서는 접근 가능, 클래스의 외부에서는 접근 불가능. >> 파생클래스: 상속을 받아 만든 클

    래스.

   B. 기능 보완 및 커스터마이징을 위해 사용.  

 

  3) private

   A. 클래스의 내부에서만 접근 가능, 파생클래스에서는 접근 불가능.

   B. 외부로 노출되면 안되는 민감한 정보와 혼란을 줄 수 있는 코드를 클래스 내부에서만 사용하기 위해서 사용.

-------------------------------------------------------------------------------------------------------------------------------

* 여기 부터는 어셈블리 단위로 사용되는 한정자.

* 어셈블리(책에서는 설명이 없음):

 1. 버전 관리되고 배포 되는 프로그램의 단위

 2. .NET의 실행 가능한 프로그램 또는 실행프로그램의 일부

 3. 한 프로젝트가 뽑아내는 결과물 >> 가장 이해가 쉬운 말인듯 

 

  4) internal

   A. 같은 어셈블리에 있는 코드에서만 public으로 접근 가능, 다른 어셈블리에 있는 코드에서는 private과 동일 >> 외부

    프로젝트에서는 접근이 안되고 같은 프로젝트 내에서 접근이 가능.

   B. 도움 클래스 등을 만드는데 사용.

 

  5) protected internal: 같은 어셈블리에 있는 코드에서만 protected로 접근 가능, 다른 어셈블리에 있는 코드에서는  

   private과 동일. >> 같은 프로젝트 코드와 상속받은 프로젝트에서는 접근 가능하지만 다른 프로젝트에서는 접근 불가

  능.

 

  6) private protected: 같은 어셈블리에 있는 클래스에서 자식 클래스 내부에서만 접근 가능.

 

 총체적으로 책만 봐서는 이해 불가능하여 검색해서 보완 정리함.

 

예제)

using System;

namespace ex7_8
{
   class WaterHeater
   {
      protected int temperature;             // protected로 수식했기 때문에 외부에서 접근 불가능

      public void SetTemperature(int temperature) 
      {
         if (temperature < -5 || temperature > 42)
         {
            throw new Exception("Out of temperature range");  // catch 블록을 실행
         }
         
         this.temperature = temperature;     //클래스 변수가 protect로 수식 되었기 때문에 this 키워드를 통해 클래스 변수에 접근
      }

      internal void TurnOnWater()	// internal로 수식했기 때문에 같은 어셈블리에서만 접근 가능
      {
         Console.WriteLine($"Turn on water:{temperature}");
      }
}

   class MainApp
   {
      static void Main(string[] args)
      {
         try
         {
            WaterHeater heater = new WaterHeater();	//heater를 생성
            heater.SetTemperature(20);	//변수가 20인 SetTemperature() 호출
            heater.TurnOnWater();	//TurnOnWater() 호출

            heater.SetTemperature(-2);	//변수가 -2인 SetTemperature()호출
            heater.TurnOnWater();	//TurnOnWater() 호출

            heater.SetTemperature(50); //변수가 50인 SetTemperature()호출 
            heater.TurnOnWater();	//TurnOnWater() 호출
         }
         catch(Exception e)	// 변수가 50인 SetTemperature에서 예외가 발생해서 throw로 점프
         {
            Console.WriteLine(e.Message);
         }
      }
   }
}

 

출력결과:

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