유형의 캡슐화 및 확장성

OOP는 소프트웨어를 작성하는 균형 잡힌 접근법입니다. 데이터와 동작이 함께 채워집니다. 이 캡슐화는 사용자 정의 데이터 유형을 생성하여 언어 데이터 유형을 확장하고 상호 작용합니다. 유형 확장성은 기본 유형뿐만 아니라 사용하기 쉬운 사용자 정의 데이터 유형에도 추가할 수 있는 기회입니다.

문자열과 같은 추상 데이터 유형은 잘 알려진 이상적인 동작 유형에 대한 설명입니다.

문자열 사용자는 연결 또는 인쇄와 같은 문자열 작업에 특정 동작이 있음을 알고 있습니다. 연결 및 인쇄 작업을 메서드라고 합니다.

ADT의 특정 구현에는 일부 제한이 있을 수 있습니다. 예를 들어 문자열의 길이가 제한될 수 있습니다. 이러한 제한은 모두에게 열려 있는 동작에 영향을 미칩니다. 동시에 내부 또는 프라이빗 구현 세부 정보는 사용자가 개체를 보는 방식에 직접적인 영향을 미치지 않습니다. 예를 들어 문자열은 종종 배열로 구현되지만 이 배열의 내부 기본 주소와 이름은 사용자에게 필수적이지 않습니다.

캡슐화는 사용자 정의 유형에 대한 개방형 인터페이스가 제공될 때 구현 세부 정보를 숨기는 기능입니다. MQL5에서뿐 아니라 C++에서 클래스 및 구조 정의(클래스구족)는 액세스 키워드 private, protected and public과 함께 캡슐화 프로비저닝에 사용됩니다.

퍼블릭 키워드는 뒤에 있는 멤버에 대한 액세스가 제한 없이 열려 있음을 나타냅니다. 이 키워드가 없으면 클래스 멤버는 기본적으로 잠깁니다. 프라이빗 멤버는 해당 클래스의 멤버 함수만 액세스할 수 있습니다.

보호된 클래스 함수는 클래스뿐 아니라 상속자 클래스에서도 사용할 수 있습니다. 공개 클래스 기능은 클래스 선언의 범위 내의 모든 기능에 사용할 수 있습니다. 보호를 통해 클래스 구현의 일부를 숨길 수 있으므로 데이터 구조의 예기치 않은 변경을 방지할 수 있습니다. 액세스 제한 또는 데이터 숨김은 객체 지향 프로그래밍의 기능입니다.

일반적으로 클래스 함수는 protected 한정자로 보호 및 선언되며, 값의 읽기 및 쓰기는 public 액세스 한정자로 정의된 특수한 set-and-get 메서드를 사용하여 수행됩니다.

 

예제:

class CPerson
  {
protected:
   string            m_name;                     // 이름
public:
   void              SetName(string n){m_name=n;}// 이름을 설정합니다
   string            GetName(){return (m_name);} // 이름을 반환합니다
  };

 

이 접근 방식은 여러 가지 이점을 제공합니다. 첫째, 함수 이름으로 클래스 멤버의 값을 설정하거나 얻을 수 있는 기능을 이해할 수 있습니다. 둘째로, 미래에는 CPerson 클래스나 그 파생형 클래스에서 m_name 변수의 유형을 변경해야 할 것입니다.

이 경우 SetName() 및 GetName() 함수의 구현만 변경하면 되고, 사용자는 m_name의 데이터 유형이 변경되었는지도 모르기 때문에 코드 변경 없이 CPerson 클래스의 개체를 프로그램에서 사용할 수 있습니다.

예제:

struct Name
  {
   string            first_name;                 // 이름
   string            last_name;                  // 성(last name)
  };
 
class CPerson
  {
protected:
   Name              m_name;                     // 이름
public:
   void              SetName(string n);
   string            GetName(){return(m_name.first_name+" "+m_name.last_name);}
private:
   string            GetFirstName(string full_name);
   string            GetLastName(string full_name);
  };
 
void CPerson::SetName(string n)
  {
   m_name.first_name=GetFirstName(n);
   m_name.last_name=GetLastName(n);
  }
 
string CPerson::GetFirstName(string full_name)
  {
   int pos=StringFind(full_name," ");
   if(pos>0) StringSetCharacter(full_name,pos,0);
   return(full_name);
  }
 
string CPerson::GetLastName(string full_name)
  {
   string ret_string;
   int pos=StringFind(full_name," ");
   if(pos>0) ret_string=StringSubstr(full_name,pos+1);
   else      ret_string=full_name;
   return(ret_string);
  }

더 보기

데이터 타입