학생을 위한 OOP.

 

===================================================== ==================================================== ====================

이 스레드에는 OOP를 사용하는 아주 간단한 몇 가지 예가 있습니다.

초보 프로그래머의 질문을 환영합니다. OOP를 정말로 이해하고 싶은 분.

내가 뭔가 잘못하고 있다고 생각하는 "똑똑한"사람은 자신의 주제를 시작하고 바로 거기에서하십시오. 아무도 여기에 당신을 필요로하지 않습니다.

OOP의 필요성과 무의미함에 대한 논쟁도 여기서 부적절하다.

===================================================== ==================================================== ====================


1. 좌표평면의 점들로 무엇인가를 한다고 가정하자.

10명만 둡니다.

다양한 방법으로 메모리에 저장할 수 있습니다.

그래서:

 double x1, y1, x2, y2, x3, y3, x4, y4, x5, y5, x6, y6, x7, y7, x8, y8, x9, y9, x10, y10;

또는 다음과 같이:

 double pointsX[ 10 ];
double pointsY[ 10 ];

또는 다음과 같이:

 double points[ 10 ][ 2 ];

하지만 이렇게 하는 것이 훨씬 쉽습니다.

 struct POINT
{
   double x;
   double y;
};

POINT points[ 10 ];

평면의 한 점인 새로운 데이터 유형이 있습니다.

우리는 별도의 엔티티와 마찬가지로 점으로 작업합니다.

예를 들어 점 사이의 거리를 계산하는 함수를 작성해 보겠습니다.

POINT p1, p2;

double D = Distance( p1, p2 );

double Distance( const POINT& p1, const POINT& p2 )
{
   double dx = p1.x - p2.x;
   double dy = p1.y - p2.y;
   return sqrt ( dx * dx + dy * dy );
}

따라서 OOP는 문제 언어로 프로그래밍할 수 있는 능력을 제공합니다.


계속하려면...

 

2. 다형성 .

다음 코드가 있다고 가정해 보겠습니다.

 int iA = 1 ;
int iB = 3 ;

double dA = 4.5 ;
double dB = 3.14 ;

string sA = "abcd" ;
string sB = "efgh" ;

int iC = iA + iB;

double dC = dA + dB;

string sC = sA + sB;

이 세 가지 경우에는 더하기 기호 뒤에 세 가지 다른 덧셈 함수가 있습니다.

이것을 다형성이라고 합니다.

OOP를 사용하면 이 작업을 다른 데이터로 확장할 수 있습니다.

예를 들어 행렬 클래스가 있습니다. matrix.mqh 파일에 있습니다.

그러면 다음과 같은 코드를 작성할 수 있습니다.

#include < matrix.mqh >

matrix < double > mA( 2, 2 );
mA[0][0] = 1.0;
mA[0][1] = 2.0;
mA[1][0] = 3.0;
mA[1][1] = 4.0;

matrix < double > mB( 2, 2 );
mB[0][0] = 5.0;
mB[0][1] = 6.0;
mB[1][0] = 7.0;
mB[1][1] = 8.0;

matrix < double > mC = mA + mB;

여기서 OOP를 사용하면 프로그램의 다른 부분 간에 책임을 공유할 수 있습니다.

우리는 행렬 클래스를 작성할 때 그것이 어떻게 사용될지 생각하지 않습니다.

작성하고 디버깅할 때 더 이상 행렬을 더하고 곱하는 규칙에 대해 생각하지 않고 다양한 작업에서 사용합니다.

그리고 +와 *를 넣으면 됩니다.


계속하려면 ...

 

3. 가상 기능 .

기하학적 모양을 나타내는 여러 클래스를 작성했다고 가정합니다.

그것들은 모두 동일한 Shape 기본 클래스에서 상속됩니다.

 class Shape
{
public :
  Shape();

   virtual void Draw() = 0 ;
};

class Circle : public Shape
{
public :
  Circle();

   virtual void Draw();
};

class Rectangle : public Shape
{
public :
  Rectangle();

   virtual void Draw();
};

class Star : public Shape
{
public :
  Star();

   virtual void Draw();
};

기본 클래스에 대한 포인터 배열을 선언하면 이러한 모든 모양을 하나의 배열에 넣을 수 있습니다.

Shape* shapes[ 10 ];

Init() 함수에서 이 배열을 채웁니다.

 void Init()
{
   for ( int i = 0 ; i < 10 ; i++ )
  {
     switch ( i % 3 ){
       case 0 :
        shapes[i] = new Circle();
         break ;
       case 1 :
        shapes[i] = new Rectangle();
         break ;
       case 2 :
        shapes[i] = new Star();
         break ;
    }
  }
}

OnPaint() 함수는 화면에 모든 모양을 표시해야 할 때 호출됩니다.

 void OnPaint()
{
   for ( int i = 0 ; i < 10 ; i++ )
   {
      shapes[i].Draw();
   }
}

우리는 모든 모양을 반복하고 각각에 대해 Draw() 함수를 호출합니다.

여기에서 각 모양에 대해 이 특정 모양을 그리는 방법을 알고 있는 자체 함수가 호출됩니다.

이것이 가상 기능의 본질입니다.

물론 마지막에 삭제하는 것을 잊지 마십시오.

 void OnDeinit ()
{
   for ( int i = 0 ; i < 10 ; i++ ){
     delete shapes[i];
  }
}


계속하려면 ...

 

아니요, 그들은 (학생) 이해하지 못할 것입니다. 특히 매트릭스. 그들은 다음과 같이 말할 것입니다: 우리에게 이 다형성은... 무엇입니까? 더욱이 에뮬에서 그 효과는 적어도 10가지 옵션이 있어야만 나타납니다.

전역 변수 와 그와 관련된 혼란 을 없애기 위해 아마도 함수와 변수를 결합하는 가능성으로 시작해야 할 것입니다.

 
Dmitry Fedoseev :

아니요, 그들은 (학생) 이해하지 못할 것입니다. 특히 매트릭스. 그들은 다음과 같이 말할 것입니다: 우리에게 이 다형성은... 무엇입니까? 더욱이 에뮬에서 그 효과는 적어도 10가지 옵션이 있어야만 나타납니다.

전역 변수 와 그와 관련된 혼란 을 없애기 위해 아마도 함수와 변수를 결합하는 가능성으로 시작해야 할 것입니다.

아마 )))

나는 개인적으로 아직도 이 OOP가 필요한지 아닌지를 이해하지 못한다. 나는 어떤 명백한 이점도 보지 못한다(같은 유형의 작업을 다루지 않는다면 아마). 그리고 이 주제에 대한 간단하고 명확한 소개를 찾지 못했습니다. (아마도 제가 정말 노력하지 않았기 때문일까요?) )))))))

 

4. 캡슐화.

여기에서 "왜 OOP에 묻힌 클래스 멤버 를 만들어야 합니까? 우리는 모든 것이 열려 있고 어디서나 사용할 수 있기를 원합니다."라는 말을 자주 듣습니다.

그러나 OOP는 모든 구성원을 비공개로 강제하지 않습니다. 프로그래머 자신이 숨겨야 할 것과 숨겨야 할 것을 결정합니다.

그리고 그들은 일반적으로 우발적인 데이터 손상 가능성을 줄이기 위해 숨겨야 할 것을 숨깁니다.

예를 들어, 모든 색상으로 설정할 수 있는 버튼이 있습니다.

 class ColorButton
{
   color myColor;

public :
   ColorButton( color clr ) : myColor( clr ){}

   color GetColor() const
   {
       return myColor;
   }

   void SetColor( color clr )
   {
      myColor = clr;
      Update();
   }

   void Update();
};

myColor 변수를 공개하고 간단한 할당으로 언제든지 버튼의 색상을 변경할 수 있습니다.

그러나 이 변수에 할당하면 버튼이 즉시 다시 그려지지 않습니다.

따라서 myColor 변수를 비공개로 만듭니다. 그리고 색상을 변경하기 위해 SetColor() 함수를 호출합니다.

이 기능은 변수를 할당하는 것 외에도 시스템에 버튼을 다시 그려야 한다고 알려줍니다.

다른 필요한 조치를 그 안에 배치할 수도 있습니다.

버튼의 색상을 얻으려면 GetColor() 함수를 사용하십시오. 호출은 변수에 대한 직접 액세스보다 비용이 전혀 들지 않습니다.

컴파일러가 쉽게 최적화할 수 있기 때문입니다.

 
Koldun Zloy :

4. 캡슐화.


이 예에서 이것이 속어, 동일한 getter 및 setor라는 것을 올바르게 이해하고 있습니까?

 
Roman :

이 예에서 이것이 속어, 동일한 getter 및 setor라는 것을 올바르게 이해하고 있습니까?

네. 모든 것이 맞습니다.

 
emkule에는 getter와 setter가 없습니다.
 
Dmitry Fedoseev :
emkule에는 getter와 setter가 없습니다.

이것은 MQL이 아니라 프로그래머가 결정합니다. 원합니다.

 
Ihor Herasko :

이것은 MQL이 아니라 프로그래머가 결정합니다. 원합니다.

프로그래밍 언어를 정의합니다.