c++ 기본

c++언어를 이용하여 c언어를 처음 접할 때, 작성하는 "Hello, World" 프로그램에 입력 받는 코드까지 간단히 작성해 보았다
code
#include <iostream>

int main()
{
  int a;
  int b;

  std::cout << "Hello, World\n";
  std::cin >> a >> b;
  std::cout << a << "\t" << b << std::endl;

  return 0;
}


// c++에서는 iostream을 기본적으로 include 시킨다.
// 출력은 cout << 이용하고, 입력은 cin >> 이용한다.

namespace

프로그램밍 프로젝트 규모가 커짐에 따라, 변수명이라든지 함수명 등 이름 충돌의 가능성이 높아지고 있다. 이를 위해 c++표준은 이름 사용 범위를 더 잘 제어할 수 있도록 namespace이라는 기능을 제공한다.
code
#include <iostream>

namespace A    // namespace A
{
  void printTest()
  {
    std::cout << "namespace A test\n";
  }
}

namespace B    // namespace B
{
  void printTest()
  {
    std::cout << "namespace B test\n";
  }
}

using namespace B;  // B:: 사용하지 않고 함수 등을 사용가능하게 해준다

int main()
{
  A::printTest();  // A namespace에 있는 printTest()함수를 실행
  printTest();  // B namespace에 있는 printTest()함수를 실행

  return 0;
}


// namespace의 사용의 예를 보여주는 코드

bool

c++에서 지원하는 논리 자료형
code
#include
 <iostream>
using namespace std;

int main()
{
  bool b1;
  bool b2;

  b1 = true;
  b2 = false;

  cout << "b1 = " << b1 << endl;
  cout << "b2 = " << b2 << endl;

  return 0;
}


// bool 자료형은 true(1), false(0)을 저장 할 수 있다.

Reference

c++는 Reference라는 새로운 복합형 언어를 추가했다. Reference는 미리 정의된 어떤 변수의 실제 이름 대신 쓸 수 있는 대용 이름이다. Reference의 주된 용도는 함수의 인자에 사용하는 것이다. Reference를 전달인자로 사용하면, 그 함수는 복사본 대신 원본 데이터를 가지고 작업한다.
code
#include <iostream>
using namespace std;

int main()
{
  int target = 20;

  int& ref = target;    // Reference 생 성

  cout << "ref = " << ref << endl;
  cout << "target = " << target << endl;
  cout << "&ref = " << &ref << endl;
  cout << "&target = " << &target << endl;

  ref = 100;

  cout << "ref = " << ref << endl;
  cout << "target = " << target << endl;

  return 0;
}


code
#include
 <iostream>
using namespace std;

void swap(int&int&);

int main()
{
  int x = 10;
  int y = 20;
//  int& refx = x;
//  int& refy = y;
  
  cout << "x = " << x << " y = " << y << endl;
//  swap(refx, refy);
  swap(x, y);
  cout << "x = " << x << " y = " << y << endl;

  return 0;
}

void swap(int& a, int& b)  // Reference 를 이용한 함수 인자 전달
{
  int tmp;

  tmp = a;
  a = b;
  b = tmp;

  return;
}


// Reference를 이용하면 포인터를 사용하지 않고도 main 함수에 있는 두 지역 변수를 서로 swap 시킬 수 있음을 알 수 있다.
// 현재 주석 처리 된 부분으로 swap 함수를 호출해도 정상 호출 된다.

다중 포인터

int i = 100;
int *p = &i;
int **pp = &p;
int ***ppp = &pp;

변수

주소

i

100

1000

p

1000

996

pp

996

992

ppp

992

988

위 선언을 대충 그림으로 나타내면 다음과 같다. (주소는 임의로 정한 값이다)


code
#include <stdio.h>

int main()
{
  int i = 100;
  int *p = &i;
  int **pp = &p;
  int ***ppp = &pp;

  printf("i = %d\n", i);
  *p = 90;
  printf("i = %d\n", i);
  **pp = 80;
  printf("i = %d\n", i);
  ***ppp = 70;
  printf("i = %d\n", i);
  
  return 0;
}

// *p, **pp, ***PPP 모두 i임을 알 수 있다

배열

배열은 사용자가 의미상의 연관이 있는 동일한 자료형에 속한 여러 개의 자료들을 묶어 하나의 이름으로 정의한 자료형이다. 예를 들어 25명으로 구성된 한 학급의 시험 성적을 관리한다고 할 때, 50개의 독립된 변수로 나타내었을 시 코드는 굉장히 길어 질 것이다. 이런 경우 배열을 사용하면 프로그래밍을 간단히 하면서도 변수들 사이의 연관성을 컴퓨터 내부적으로도 잘 나타낼 수 있다.
    자료형 배열명[크기];        // 배열의 선언 형식
code
#include <stdio.h>

int main()
{
  int score[10];
  int i;
  int sum = 0;
  float average;

  for(i = 0 ; i < 10 ; i++)
  {
    printf("Please enter score[%d] : ", i);
    scanf("%d"&score[i]);
  }
  for(i = 0 ; i < 10 ; i++)
  {
    sum += score[i];
  }
  average = (float)sum / 10;
  printf("average score : %f\n", average);
  
  return 0;
}


// 점수 10개를 입력 받아 평균을 구하는 프로그램

배열과 포인터는 컴퓨터 내부적으로 거의 같은 방법으로 메모리에 접근한다. 그러나 이 둘 사이의 차이를 잘 구분해야 한다. 포인터는 메모리의 주소를 가지는 변수로 그 주소를 이용해서 메모리에 접근하는 것에 비해, 배열명은 그 배열에 할당된 메모리의 시작주소를 나타내는 상수이다.
code
#include <stdio.h>

int main()
{
  int BSP[25= {123, };
  int *p = BSP;

  printf("BSP size : %d \n"sizeof(BSP));
  printf("BSP : %p \n", BSP);
  printf("BSP[0] : %p \n"&BSP[0]);
  printf("BSP[1] : %p \n"&BSP[1]);
  printf("BSP+1 : %p \n", BSP + 1);
  printf("&BSP+1 : %p \n"&BSP + 1);
  printf("BSP : %p \n"&BSP);
  printf("\n");
  printf("*p = %d\n", *p);
  printf("*(p + 1) = %d\n", *(p + 1));
  printf("*(p + 2) = %d\n", *(p + 2));
  printf("\n");
  printf("p[0] = %d\n", p[0]);
  printf("p[1] = %d\n", p[1]);
  printf("p[2] = %d\n", p[2]);
  printf("\n");
  BSP[1= 10;
  printf("*(BSP + 1) : %d \n", *(BSP + 1));

  return 0;
}


// 위 코드로 배열과 포인터의 관계를 잘 알 수 있다.
// "&배열명"에 +1 연산을 하면 전체 배열 크기만큼 증가한다.
// 배열은 선언 시에만 { } 안에 값을 넣어서 초기화 할 수 있다.

+ Recent posts