클래스 상속
 기존의 클래스를 상속받아서 새로운 클래스를 만드는 방법이다.
class HTMLWriter : public DocWriter
{
}
DocWriter - 부모 클래스 // HTMLWriter - 자식 클래스

 자식 클래스에는 부모 클래스에 없는 새로운 멤버를 추가할 수도 있고, 부모 클래스에 이미 존재하는 멤버 함수를 새롭게 정의할 수도 있다. 자식 객체를 생성할 때는 자식 클래스의 생성자  뿐만 아니라 부모 클래스의 생성자도 호출된다. 따로 부모 클래스의 생성자 함수를 지정하지 않으면 부모 클래스의 디폴트 생성자가 호출된다. 생성자를 지정해 주려면 초기화 리스트에서 해야 한다.
 부모 클래스 생성자가 자식 클래스의 생성자보다 먼저 호출된다. 반대로 소멸는 자식 클래스의 소멸자가 호출된 후 부모 클래스의 소멸자가 호출된다.
자식 객체 생성 시 : 부모 클래스 생성자 -> 자식 클래스 생성자
자식 객체 소멸 시 : 자식 클래스 소멸자 -> 부모 클래스 소멸자

 부모 클래스의 객체를 자식 클래스로 대입하는 것은 불가능하다. 하지만 반대의 경우 ,즉 자식 클래스의 객체를 부모 클래스로 대입하는 것은 가능하다. 이때 부모 객체와 자식 객체에 공통적으로 있는 멤버들이 1:1로 대입된다.
 자식 클래스의 포인터나 레퍼런스를 사용해서 부모 객체를 가리킬 수 없다. 하지만 반대로 부모 클래스의 포인터나 레퍼런스로 자식 클래스의 객체는 가리킬 수 있다. 이 경우 실제 객체가 무엇이던 간에 상관없이 포인터 타입을 기준으로 호출되는 멤버 함수가 결정된다.

 접근제어
public : 모든 곳으로부터의 접근을 허용 한다.
protected : 자식 클래스의 멤버 함수로부터의 접근만 허용 한다.
private : 자신의 멤버 함수 외에는 접근할 수 없다.
외부로부터 숨겨야 하는 멤버는 protected로 지정한다.
그 밖의 경우는 public으로 지정한다.
반드시 자식 클래스에 숨기고 싶다면 private로 지정한다.

 Point.h
#ifndef POINT_H
#define POINT_H

// Point 클래수를 정의한다
class Point
{
public:
  // 멤버 함수
  void Print();
  void Offset(int x_delta, int y_delta);
  void Offset(const Point& pt);

  // 생성자들
  Point();
  Point(int initialX, int initialY);
  Point(const Point& pt);

  // 소멸자
  ~Point();

  // 접근자
  void SetX(int value);
  void SetY(int value);
  int GetX() const
  {
    return x;
  }
  int GetY() const
  {
    return y;
  }
private:
  // 멤버 변수
  int x, y;
};

#endif

 Point.cpp
#include "Point.h"
#include <iostream>
using namespace std;

void Point::SetX(int value)
{
  if(value < 0)
  {
    x = 0;
  }
  else if(value > 100)
  {
    x = 100;
  }
  else
  {
    x = value;
  }
}

void Point::SetY(int value)
{
  if(value < 0)
  {
    y = 0;
  }
  else if(value > 100)
  {
    y = 100;
  }
  else
  {
    y = value;
  }
}

void Point::Print()
{
  cout << "(" << x << ", " << y << ")\n";
}

void Point::Offset(int x_delta, int y_delta)
{
  SetX(x + x_delta);
  SetY(y + y_delta);
}

void Point::Offset(const Point& pt)
{
  Offset(pt.x, pt.y);
}

Point::Point(const Point& pt)
{
  x = pt.x;
  y = pt.y;
}

Point::Point(int initialX, int initialY)
{
  SetX(initialX);
  SetY(initialY);
}

Point::Point()
{
  x = 0;
  y = 0;
}

Point::~Point()
{
}


 Rect.h
#ifndef RECT_H
#define RECT_H

#include "Point.h"

class Rect
{
public:
  // 생성자
  Rect();
  Rect(const Point& topLeft, const Point& bottomRight);
  Rect(int left, int top, int right, int bottom);

  // 각 점의 값 지정/얻기
  void SetTopLeft(const Point& topLeft);
  void SetBottomRight(const Point& bottomRight);
  void SetRect(int left, int top, int right, int bottom);
  Point GetTopLeft() const;
  Point GetBottomRight() const;
  void GetRect(int& left, int& top, int& right, int& bottom);

  // 넓이, 높이 계산
  int GetWidth() const;
  int GetHeight() const;

  // 내 용 출력
  void Print() const;

protected:
  Point _topLeft;
  Point _bottomRight;
};

#endif

 Rect.cpp
#include "Rect.h"
#include <iostream>
using namespace std;

Rect::Rect()
{

}

void Rect::SetTopLeft(const Point& topLeft)
{
  _topLeft = topLeft;
}

void Rect::SetBottomRight(const Point& bottomRight)
{
  _bottomRight = bottomRight;
}

void Rect::SetRect(int left, int top, int right, int bottom)
{
  _topLeft.SetX(left); 
  _topLeft.SetY(top); 
  _bottomRight.SetX(right); 
  _bottomRight.SetY(bottom); 
}

Point Rect::GetTopLeft() const
{
  return _topLeft;
}

Point Rect::GetBottomRight() const
{
  return _bottomRight;
}

void Rect::GetRect(int& left, int& top, int& right, int& bottom)
{
  left = _topLeft.GetX(); 
  top = _topLeft.GetY(); 
  right = _bottomRight.GetX(); 
  bottom = _bottomRight.GetY(); 
}

int Rect::GetWidth() const
{
  return (_bottomRight.GetX() - _topLeft.GetX() + 1);
}

int Rect::GetHeight() const
{
  return (_bottomRight.GetY() - _topLeft.GetY() + 1);
}

void Rect::Print() const
{
  cout << "{L=" << _topLeft.GetX() << ", T=" << _topLeft.GetY();
  cout << ", R=" << _bottomRight.GetX() << ", B=" <<
    _bottomRight.GetY() << "}\n";
}

Rect::Rect(const Point& topLeft, const Point& bottomRight)
:_topLeft(topLeft), _bottomRight(bottomRight)
{
}

Rect::Rect(int left, int top, int right, int bottom)
:_topLeft(left, top), _bottomRight(right, bottom)
{
}

 main.cpp
#include "Rect.h"
#include <iostream>
using namespace std;

int main()
{
  Rect rc1;
  Rect rc2(Point(1020), Point(3040));
  Rect rc3(50607080);

  rc1.Print();
  rc2.Print();
  rc3.Print();

  return 0;
}


   RS232

RS232는 표준 인터페이스의 하나로서 데이터를 직렬로 전송하며 대부분의 PC에 기본으로 장착되어 있다. 배선 수가 작으며, 통신 프로그래밍 구현이 쉽다. 하지만 병렬 전송에 비해 전송 속도가 느리고, 일대일 통신만 가능하다는 단점이 있다.


TXD - Transmit Data
비동기식 직렬통신 장치가 외부 장치로 정보를 보낼 직렬통신 데이터가 나오는 신호선이다.

RXD - Receive Data
외부 장치에서 들어오는 직렬통신 데이터를 입력받는 신호선이다
RTS - Ready To Send
컴퓨터와 같은 DTE장치가 모뎀 또는 프린터와 같은 DCE장치에게 데이터를 받을 준비가 됐음을 나타내는 신호선이다.

CTS - Clear To Send
모뎀 또는 프린터와 같은 DCE장치가 컴퓨터와 같은 DTE장치에게 데이터를 받을 준비가 됐음을 나타내는 신호선이다.

DTR - Data Terminal Ready
컴퓨터 또는 터미널이 모뎀에게 자신이 송수신 가능한 상태임을 알리는 신호선이며 일반적으로 컴퓨터등이 전원 인가후 통신 포트를 초기화한 이신호를 출력시킨다.

DSR - Data Set Ready
모뎀이 컴퓨터 또는 터미널에게 자신이 송수신 가능한 상태임을 알려주는 신호선이며 일반적으로 모뎀에 전원 인가 모뎀이 자신의 상태를 파악한 이상이 없을 신호를 출력시킨다.

DCD - Data Carrier Detect
모뎀이 상대편 모뎀과 전화선 등을 통해서 접속이 완료되었을 상대편 모뎀이 캐리어신호를 보내오며 신호를 검출하였음을 컴퓨터 또는 터미널에 알려주는 신호선이다.

RI - Ring Indicator
상대편 모뎀이 통신을 하기위해서 먼저 전화를 걸어오면 전화 벨이 울리게 된다. 이때 신호를 모뎀이 인식하여 컴퓨터 또는 터미널에 알려주는 신호선이며 일반적으로 컴퓨터가 이신호를 받게되면 전화벨 신호에 응답하는 프로그램을 인터럽터등을 통해서 호출하게 된다.


- 시작 비트, 정지비트 : RS232C 인터페이스 규격에서는 송수신 데이터의 신호는 부논리로 규정되어 있으므로 데이터의 비트는 1 -5~-15V 0 5~15V 대응한다. 실제 데이터 전송시 데이터의 앞에 Start Bit(논리 0) 1비트와 뒤에 Stop Bit(논리 1) 2비트와 패리티 비트를 부가해서 송신한다. 여기서 Start Bit Stop Bit 사용해서 수신측 통신소자가 1 캐릭터(8Bit)마다 동기를 맞출 있기 때문에 송수신 측의 동기신호 없이도 송수신이 가능한 것이다. Stop Bit 2비트 뿐만 아니라 1.5비트나 1비트도 설정가능하기 때문에 송수신 측의 Stop Bit 일치 시켜야한다.

- 패리티 비트 : 통신에 있어서 어떤 데이터를 전송할 데이터가 정확히 보내졌는가를 검사하는데 사용한다. Odd 패리티와 Even 패리티 체크의 가지 형태가 있는데 Odd 패리티는 2진수의 1 합이 홀수가 되게 지정하고 Even 패리티의 경우는 1 합이 홀수가 되게 지정한다.

- Baud rate : RS232C 인터페이스의 통신속도는 접속하는 쌍방의 장치의 성능과 통신선로의 특성에 따라 크게 좌우된다. 통신회선 상에 신호율을 측정하기 위한 기본단위를 보오레이트라고 불리며, 1초간에 송수 가능한 비트 수로 규정된다. 만약 110으로 설정된다면 패리티가 부가된 ASCII 코드 1캐릭터를 보내기 위해서

1(Start Bit) + 7(캐릭터의 비트수) + 1(패리티 비트) + 2(Stop Bit) = 11비트

따라서 1초간에 최대 110 / 11 = 10(캐릭터) 송수신 가능하다.

보통의 퍼스널 컴퓨터에서는 1문자 단위를 8비트(1바이트) 다루기 때문에 하나의 문자정보를 보내기 위해서 Stop Bit 최소 1비트로 하여

1(Start Bit) + 8(문자 데이터 비트수) + 1(Stop Bit) = 10비트

1문자 전송에 10비트를 사용한다.


  디버그 유닛(Debug Unit)

디버그 유닛은 USART 포트관련 레지스터에서 많이 사용하는 것만 뽑아 놓은 것이다.



+ Recent posts