01.추상화와 캡슐화 란?
01.1 추상화란?
01.2 캡슐화란?
01.2.1 포함관계로 캡슐화 완성하기
- 공통의 속성이나 기능을 묶어 이름을 붙이는 것
- 객체 지향적 관점에서 클래스를 정의하는 것을 바로 추상화라고 할 수 있음
- 예를 들면 사자, 호랑이, 코끼리, 원숭이가 있다면
- 이것들을 각각의 객체라 하며 이 객체들을 하나로 묶으려 할때,
- 만약 동물 또는 생물이라는 어떤 추상적인 객체로 크게 정의한다고 할때
- 이때 동물 또는 생물이라고 묶는 것을 추상화라고 함
- 만약 동물 또는 생물이라는 어떤 추상적인 객체로 크게 정의한다고 할때
- 구체적인 것을 분해해서 관찰자가 관심있는 특성만을 가지고 재조합하는 것
- 객체들의 공토 속성과 행위를 추출하는 것
- 컴퓨터를 예로 들면
- Ram, SSD, CPU 등 가지고 있는 속성
- 주소를 연결하고 프로그램을 실행하는 것 공통된 행위
- 노트북을 실행하는 기능을 정의하는 것이 아니라
- 어떤 노트북이든 공통적으로 가지고 있는 속성과 행위를 추출하는 것
- 컴퓨터를 예로 들면
-
데이터 구조와 데이터를 다루는 방법들을 겹합 시켜 묶는 것
-
단 , 무작정 묶는 것이 아님
- 객체가 맡은 역할을 수행하기 위한 하나의 목적을 한데 묶는다고 생각해야함
- 많이 들어본 의미로는 은닉화라고 함
- 객체가 맡은 역할을 수행하기 위한 하나의 목적을 한데 묶는다고 생각해야함
-
또한, 데이터를 절대로 외부에서 직접 접근하면 안되고, 오로지 함수를 통해서만 접근해야함
- 이를 가능하게 해주는 것을 캡슐화
- 그래서 캡슐화에 성공하면 당연히 은닉화도 자연스럽게 효력이 나타남
-
쉽게 설명하면 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메소드를 통해 복용 과정이 모두 자동화 됨
- 어떤 클래스가 있는것을 몰라도됨
- 가정: 코감기는 콧물, 재채기, 코막힘을 늘 동반한다. 할때
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();
}
}