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] = {1, 2, 3, };
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 연산을 하면 전체 배열 크기만큼 증가한다.
// 배열은 선언 시에만 { } 안에 값을 넣어서 초기화 할 수 있다.