본 문서는 c의 구조체와 c++ 구조체의 차이점을 중점으로 설명한다.
구조체의 의의는 서로 연관이 있는 데이터를 하나의 구조체에 넣어 관리할 수 있다는 것이다.
경우를 하나 가정해보자.
2차원 좌표계의 정점을 저장하는 Point 구조체가 있고, 정점을 이동시키는 기능을 가진 vertexMove 함수가 있다.
typedef struct Point
{
int x;
int y;
} Point;
Point vertexMove(Point vertex1, int moveX, int moveY)
{
Point movedVertex = {vertex1.x + moveX, vertex1.y + moveY};
return (movedVertex);
}
vertexMove 함수는 Point 구조체에 종속적이라고 할 수 있다. 그러나 c 언어는 구조체 내부의 함수 선언을 허용하지 않는다는 한계가 있다.
하지만 c++ 힘수에서는 구조체 내부 함수 선언을 아래와 같이 허용한다.
struct Point
{
//멤버변수
int x;
int y;
//멤버함수
void vertexMove(int moveX, int moveY)
{
x + moveX;
y + moveY;
return ;
}
};
c++에서 구조체 내부에 함수선언을 할 때, 다음과 같은 특징이 있다.
- 구조체의 변수를 멤버변수, 구조체의 함수를 멤버함수라고 한다.
- 멤버함수는 매개변수에 멤버변수를 전달하지 않아도 멤버함수에 접근할 수 있다.
- 멤버함수의 원형선언과 함수의 정의를 아래와 같은 형식으로 분리할 수 있다.
struct Car
{
//. . .
//함수의 원형선언
void ShowCarStat();
void Accel();
//. . .
};
//함수의 정의
//structName::functionName의 형식으로 어느 구조체의 멤버함수인지를 지정해야 한다.
void Car::ShowCarState()
{
//. . .
}
void Car::Accel()
{
//. . .
}
- 멤버함수는 기본적으로 인라인으로 처리된다. 그러나 함수의 선언과 정의를 분리하면 인라인 처리되지 않는다. 키워드 inline을 이용해서 선언과 정의를 분리하고도 함수가 인라인 처리되도록 할 수 있다.
inline void Car::ShowCarState() { . . . . . }
- 멤버 함수는 객체 외부의 별도의 공간에 선언된다 ( 객체가 아직 생성되지 않은 시점에서도 그러하다 ). 객체는 외부에 있는 멤버 함수의 주소를 참조한다.
- 별도의 접근제어 지시자가 없을 경우, 구조체의 멤버함수와 멤버변수는 기본적으로 public으로 선언된다.
참고자료