일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- DrawEllipse
- Json.NET
- 경기도 버스정보시스템
- C# 파일 암/복호화
- Winform
- solid
- sqlite3
- DrawRectangle
- eventhandler
- JSON
- 디자인 패턴
- C# MDB Handle
- 경기도 버스
- GDI+
- 버스 API
- Cell Border Style
- WPF
- MVC
- eventargs
- Excel Cell Format
- MDB Select
- C# MDB
- c#
- delegate
- NUnit
- 객체지향
- 시
- TDD
- 공공 데이터 포털
- MDB Connect
- Today
- Total
White Whale Studio
[객체지향 개발] 캡슐화(Capsulation) 본문
객체지향 개발을 위해서는 캡슐화를 잘 하라고 합니다.
캡슐화는 내부적으로 기능 구현을 어떻게 한건지 숨기는 것을 말합니다.
메서드 내부에 기능구현이 변경되더라도 해당 메서드를 호출하는 코드에서는 영향을 받지 않도록 또는 최소화하기 위함입니다.
절차지향적 구현방법과 객체지향적 방법으로 살펴보겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 | // 절차지향 // item.getExpiryDate() => 만료 일자 데이터를 가져옴 if (item.getExpiryDate() != null && item.getExpiryDate().getDate() < System.DateTime.Now) { // 만료된 경우의 처리 } // 객체지향 if (item.isExpired()) { // 만료된 경우의 처리 } | cs |
절차지향적 코딩에서는 데이터를 기반으로 작업을 수행합니다. 만료일자를 가져와서 오늘날짜와 비교하고 만료일자가 지난건지 안지난건지
판단하는 코드를 포함하고 있습니다.
반면에 객체지향코드의 경우(위의 코드에서는 추측하건데 True / False의 Bool 값을 반환하겠죠?)
참조하는 객체 자체에서 만료가 된거냐 안된거냐를 판단해서 호출하는 메서드 쪽에서는 그저 만료된지 여부만 확인을 합니다.
즉, item 내부에서 만료가 된것을 어떻게 확인하는지 무엇이랑 비교하는 지 그딴건 관심이 없는겁니다.
또한 isExpired() 메서드가 변경이 되어도 호출하는 메서드에서는 코드를 수정할 필요도 없습니다.
이와 같이 데이터가 아닌 기능을 요청하는 겁니다.
캡슐화를 위해서는 2개의 규칙을 지키는 것이 중요하다고 하네요.
1. 데이터를 물어보지 말고 기능을 실행해 달라고 해라
2. 디미터/데미테르의 법칙(Law of Demeter)
우선 1번의 경우는 위의 코드에서 보는 것처럼 기능 실행을 요청하는 방식으로 코드를 작성하도록 노력합니다.
디미터 법칙은 다음과 같은 규칙을 따릅니다.
1. 메서드에서 생성한 객체의 메서드만 호출
2. Parameter로 받은 객체의 메서드만 호출
3. Field로 참조하는 객체의 메서드만 호출
예를 들어
item.getDate().getTime()
이런식으로 구현하는 경우는 1번을 위반하는 겁니다.
getDate()만으로 한방에 끝나는 경우라면 관계가 없는데
getDate를 호출하고 또다시 getTime()을 호출했기 때문입니다.
즉, 이러한 경우에 굳이 getTime()이라는 기능이 필요하다면
item.getTime()으로 한번의 메서드만 호출하도록 변경해야한다는 것입니다.
'IT Engineering > 객체지향&디자인 패턴' 카테고리의 다른 글
[SOLID] 단일책임원칙 / SRP : Single Responsibility Priciple (0) | 2016.06.24 |
---|---|
Facade Pattern (파사드 패턴) (0) | 2016.06.17 |
Decorator Pattern (데코레이터 패턴) (0) | 2016.06.17 |
Template Method Pattern (템플릿 메서드 패턴) (0) | 2016.06.14 |
Strategy Pattern (전략 패턴) (0) | 2016.06.14 |