내장형 하드웨어/C++

객체지향, C++ 첫시간(cout, endl, 오버로딩)

동화다아아 2011. 11. 8. 10:29
- 객체지향 언어 (C++, 자바...)
 → C 언어는 구조적 프로그램
 → 객체, 절차 등의 분류는 무엇을 타겟으로 작성하는 것으로 나눈다.
 → 즉, 객체지향 언어란 객채에 집중하는 언어이다.
 → 객체지향은 Object Oriented C,  → OOC라 부르며 이것은 객체지향으로 짜는 C라는 말이다.
 → C로도 객체지향의 개념을 가지면 객체 지향을 표현할 수 있으나 이는 많은 시간과 불편함이 따른다.


 → 어셈블리, C 등은 제어를 위해 태어난 언어이다.
 → 사실상 모든 프로그램은 Hardware를 컨트롤 하기 위한 것이나 그 활용의 차이가 있다.
 → 예로 Assembly와 C를 비교해 보면
        A변수가 1000번지에 위치하고 있을 때
        0x64+1을 표현한다면 C의 경우 A = 64+1; 로 표현하면 끝이지만 Assembly의 경우 대략
        mov   eax, 0x64
        inc eax
        mov [1000], eax 의 형식으로 사용해야 한다. 
        이것은 저급언어와 고급언어의 차이, 즉, 사용자(인간) 중심으로 언어가 작성되는 가의 차이이다.

 → RAD(Rapid Application Development) 툴(예, visual basic, delphi...)의 경우 개발 속도와 그래픽에 최적화 되어 있다.
 → 언어는 고급언어로 갈 수록 개발 속도나 개발환경이 편리해 지나 번지를 직접 건드릴 방법이 없어 제어에는 적합하지 않게 된다.
 → 상위 계층은 하위 계층의 개념을 포함한다.

 → 구조적 프로그래밍의 개념을 적용하면 C는 전체가 public이며, 전역에 static을 붙이면 protected가 된다.
 → 언어는 사용 목적에 맞추어 선택해 사용해야 한다. (구조적 프로그램을 작성하거나 H/W 등의 직접적인 접근을 위해서 C를 사용하는 등)

- C++ 언어 수업 (※ 추천 도서 - C 프로그래머를 위한 C++(한빛 미디어-번역본))
 → C+은 모든 C의 문법을 포함한다.
 → cl은 원래대로 linux는 gcc 대신 g++로 컴파일(g++ -o main main.cpp)
 → g++는 C++의 확장자가 .cpp 외에도 .cc, .c++, .C 등의 여러가지의 확장자가 있으며 모두 컴파 가능하다.
 → 하지만 cl은 .cpp 이외의 확장자를 인식하지 않는다.
 → 이는 cl은 확장자 , gcc는 명령어 기반이기 때문
 → 예제
#include<stdio.h>

enum
 Test2
{
  ZERO,
  ONE
};
struct Test
{
  int A;  
};

int main()
{
  struct Test OBJ1;
  struct Test OBJ2;
  //enum Test2 OBJ3 = 0;
  int OBJ4 = ZERO;

  printf("%d\n", OBJ4);
  printf("Hi!!\n");
  
  return 0;
}

 → 위의 컴파일을 살펴보면 우선 enum Test2 OBJ3 = 0; 부분이 주석 처리되어 있다. 저 부분의 주석을 풀고 .c와 .cpp로 각각 컴파일해 보면 .c는 정상적으로 .cpp는 컴파일 에러가 나는 것을 확인할 수 있다.
 → enum의 타입은 enum으로 여기에 int형을 대입하면 C++에서는 에러가 발생한다. 반대로 C에서는 에러가 발생하지 않는데 즉, C++이 타입(형)에 대해 엄격하다는 것을 알 수 있다. 
 → 단, 반대로 int형에 enum형을 대입하는 것은 C와 C++ 둘다 가능하다.
 → 또한 union도 enum과 역시 같은 성질을 가진다.
 → C++은 C와는 다르게 struct의 생략이 가능하다. 따라서 구조체에서 typedef가 필요 없다.(사용하지 않아도 struct의 생략이 가능하므로)

#include<iostream.h>

int
 main()
{
  int A = 100;
  float B = 5.1f;
  char C = 97;
  
  cout << "Hi!!\n";
  cout << A << "\n";
  cout << B << "\n";
  cout << C << "\n";

  return 0;
}
 
 → C++은 stdio.h 대신 iostream.h를 사용한다.
 → printf의 대신으로 cout을 사용한다.
 → 'c'는 콘솔을 의미하며 'out'은 출력 '<<'은 화면으로 보낸다는 뜻으로 즉, 모니터에 출력한다는 의미
 → 또한 cout은 원래 타입이 무엇인지 스스로 판단해서 출력한다.
 → 구구단 작성
#include<iostream.h>

int
 main()
{
  int A = 100;
  float B = 5.1f;
  char C = 97;
  int iCntX;
  int iCntY;
  
  cout << "Hi!!\n";
  cout << A << "\n";
  cout << B << "\n";
  cout << C << "\n";
  cout << "test " << A << " " << B << "\n";
  // 구구단 출력 1~9단
  for(iCntX = 19 >= iCntX; ++iCntX)
  {
    for(iCntY = 19 >= iCntY; ++iCntY)
    {
      //cout << iCntX << "x" << iCntY << " = " << (iCntX*iCntY) << "\n";
      cout << iCntY << "x" << iCntX << = " << (iCntX*iCntY) << " ";
    }
    cout << "\n";
  }
  return 0;
}

 
 → 출력

 
- 오버 라이딩
 → 함수가 이름과 시그니쳐(인자)까지 같은 것
- 오버 로딩
 → 함수 이름이 같고 인자가 다른 것(인자로 구분 - 함수 이름이 같기 때문에 인자의 개수로 기능을 조절할 수 있다.)
#include<iostream.h>

void
 Test(int A)
{
  cout << A << endl;
  return ;
}
void Test(int A, int B)
{
  cout << A << " " << B << endl;
  return ;
}

int main()
{
  Test(100);
  Test(10075);

  return 0;
}

 → 출력


 → "\n" 대신 endl 을 사용할 수 있다.