Skip to content

Latest commit

 

History

History
204 lines (171 loc) · 4.64 KB

22.03.01_추상화와캡슐화란.md

File metadata and controls

204 lines (171 loc) · 4.64 KB

22.03.01_추상화와캡슐화란?

목차

01.추상화와 캡슐화 란?

01.1 추상화란?

01.2 캡슐화란?

01.2.1 포함관계로 캡슐화 완성하기

01.추상화와 캡슐화 란?

01.1 추상화란?

  • 공통의 속성이나 기능을 묶어 이름을 붙이는 것
  • 객체 지향적 관점에서 클래스를 정의하는 것을 바로 추상화라고 할 수 있음
    • 예를 들면 사자, 호랑이, 코끼리, 원숭이가 있다면
    • 이것들을 각각의 객체라 하며 이 객체들을 하나로 묶으려 할때,
      • 만약 동물 또는 생물이라는 어떤 추상적인 객체로 크게 정의한다고 할때
        • 이때 동물 또는 생물이라고 묶는 것을 추상화라고 함
  • 구체적인 것을 분해해서 관찰자가 관심있는 특성만을 가지고 재조합하는 것
  • 객체들의 공토 속성과 행위를 추출하는 것
    • 컴퓨터를 예로 들면
      • Ram, SSD, CPU 등 가지고 있는 속성
      • 주소를 연결하고 프로그램을 실행하는 것 공통된 행위
      • 노트북을 실행하는 기능을 정의하는 것이 아니라
        • 어떤 노트북이든 공통적으로 가지고 있는 속성과 행위를 추출하는 것

01.2 캡슐화란?

  • 데이터 구조와 데이터를 다루는 방법들을 겹합 시켜 묶는 것

  • 단 , 무작정 묶는 것이 아님

    • 객체가 맡은 역할을 수행하기 위한 하나의 목적을 한데 묶는다고 생각해야함
      • 많이 들어본 의미로는 은닉화라고 함
  • 또한, 데이터를 절대로 외부에서 직접 접근하면 안되고, 오로지 함수를 통해서만 접근해야함

    • 이를 가능하게 해주는 것을 캡슐화
    • 그래서 캡슐화에 성공하면 당연히 은닉화도 자연스럽게 효력이 나타남
  • 쉽게 설명하면 Car라는 클래스를 잘 정의하고 그것과 관련 있는 것을 적절히 담는 것

  • 예시

    • 가정: 코감기는 콧물, 재채기, 코막힘을 늘 동반한다. 할때
      • 약의 복용 순서가 중요하다면?
    • Before
    class SiniveCap
    {
      void take()
      {
        Console.WriteLine("콧물이 완화됨");
    	}
    }
    
    class SneezeCap
    {
      void take()
      {
        Console.WriteLine("재채기가 완화됨");
    	}
    }
    
    class SuffleCap
    {
      void take()
      {
        Console.WriteLine("코막힘이 완화됨");
    	}
    }
    
    class ColdPatient
    {
      void takeSiniveCap(SinivelCap cap)
      {
        cap.take();
      }
      void takeSiniveCap(SinivelCap cap)
      {
        cap.take();
      }
      void takeSiniveCap(SinivelCap cap)
      {
        cap.take();
      }  
    }
    
    class BadEncapsulation
    {
      public static void Main(string[] args)
      {
        ColdPatient suf = new ColdPatient();
        
        //콧물 캠슐 구매 후 복용
        suf.takeSinivelcap(new SinivelCap());
        
        //재채기 캡슐 구매 후 복용
        suf.takeSneezeCap(new SneezeCap());
        
        //코막힘 캡슐 구매 후 복용
        suf.takeSiniveCap(new SnuffleCap());
    	}
    }
    • 위와 같이 되면 클래스 사용방법과 관련하여 알아야하는 사항이 많아야함

      • 복용해야할 약의 종류
      • 복용해야할 약의 순서
    • After

    class SinusCap
    {
      void sniTake()
      {
        Console.WriteLine("콧물이 완화됨");
      }
      
      void sneTake()
      {
        Console.WriteLine("재채기가 완화됨");
      }
      
      void snuTake()
      {
        Console.WriteLine("코막힘이 완화됨");
      }
      
      void take()
      {
        sniTake();
        sneTake();
        snuTake();
    	}
    }
    
    class ColdPatient
    {
      void takeSinus(SinusCap cap)
      {
        cap.take();
      }
    }
    class GoodEncapsulation
    {
      public static void Main(string[] args)
      {
        ColdPatient suf = new ColdPatient();
    		suf.takeSinus(new SinusCap());
    	}
    }
    • 코감기 관련해서 알아야할 사실들이 많이 줄어듦
      • 어떤 클래스가 있는것을 몰라도됨
        • SinusCap클래스 하나만 알면됨
      • 복용순서도 몰라도됨
        • take메소드를 통해 복용 과정이 모두 자동화 됨

01.2.1 포함관계로 캡슐화 완성하기

class SiniveCap
{
  void take()
  {
    Console.WriteLine("콧물이 완화됨");
	}
}

class SneezeCap
{
  void take()
  {
    Console.WriteLine("재채기가 완화됨");
	}
}

class SuffleCap
{
  void take()
  {
    Console.WriteLine("코막힘이 완화됨");
	}
}

class SinusCap
{
	SinivelCap siCap = new SinivelCap();
  SneezeCap  szCap = new SneezeCap();
  SnuffleCap sfCap = new SnuffleCap();
  
  void take()
  {
    siCap.take();
    szCap.take();
    sfCap.take();
	}
}