본문 바로가기

Programming Languages/C++

구조체

int와 float 등과 같은 자료형은 C++에 미리 정의되어 있는 기본 자료형이다. 이와는 별개로 프로그래머가 필요에 따라 새로운 자료형을 정의할 수 있다. 이와 같은 자료형을 사용자 정의 자료형이라고 하는데, 기본 자료형이나 앞서 선언된 사용자 정의 자료형을 이용하여 정의한다.

C에서 사용자 정의 자료형은 struct를 사용하여 만들 수 있는데, C++에서도 같은 방법을 사용할 수 있다.

struct StructName{
 Type1 item1;
 Type2 item2;
 ...
}

 

위 선언문은 StructName이라는 이름을 갖는 새로운 자료형을 정의한 것으로, Type1 형의 항목 item1, Type2 형의 항목 item2 등으로 구성된다. Type1, Type2는 기본 자료형의 하나일 수도 있고, 먼저 정의된 사용자 정의 자료형일 수도 있다. 또한 Type1, Type2 등은 서로 달라도 관계없다. 각각의 항목들은 지정된 자료형의 값을 저장하게 되며, 따라서 몇 개의 데이터를 저장하는 항목들을 묶어 새롭게 정의한 자료형으로 생각할 수 있다. 이와 같이 사용자가 정의한 자료형을 C++에서는 구조체(structure)라고 하며, 일반적으로는 레코드(record)라고 한다.

2차원 좌표를 표현하는 구조체의 선언

위 그림은 2차원 직교좌표계의 한 좌표를 표현하는 구조체로서, x좌표와 y좌표의 값을 저장하는 항목들로 구성되어 있다.

구조체를 구성하는 항목들은 기본 자료형뿐만 아니라 사용자가 정의한 자료형의 항목도 포함할 수 있다. 

원을 표현하는 구조체의 선언

위 그림은 원을 나타내는 구조체인데, 중심 좌표 center를 앞서 정의한 C2dType이라는 구조체로 표현하고 있는 것을 볼 수 있다.

이처럼 정의된 구조체를 저장하는 변수는 다음과 같이 선언한다.

StructName varName;

구조체의 각각의 항목을 지칭할 때에는 멤버 선택 연산자인 ' . '을 구조체 변수 이름과 항목 이름 사이에 넣어 표기한다. 즉, varName의 item1 항목은 varName.item1이라고 표기한다. 이러한 표기법을 점 표기법(dot notation)이라고 한다.

프로그램 Circles1.cpp는 C 언어의 문법에 맞게 구조체를 사용하는 예이다.

원을 표현하기 위하여 구조체를 사용하고 있으며, 원의 면적을 구하고(circleArea), 두 원이 서로 중첩되는지 검사하고(chkOverlap), 원의 정보를 출력(dispCircle)하기 위한 함수를 정의하였다.

<Circles1.ccp>

#include <iostream>
#include <cmath> // sqrt함수 사용(제곱근의 함수)
using namespace std;

const double PI = 3.141593;

struct C2dType{ // 2차원 좌표 구조체
 double x,y;
 };
 
struct CircleType{ // 원 구조체
 C2dType center;   // 중심좌표
 double radius;    // 반경
 };
 
double circleArea(CircleType c){ // 원의 면적을 구하는 함수
 return c.radius * c.radius * PI;
 }
 
bool chkOverlap(CircleType c1, CircleType c2){ // 두 원의 중첩 여부 확인 함수
 double dx = c1.center.x - c2.center.x;
 double dy = c1.center.y - c2.center.y;
 double dCntr = sqrt(dx*dx + dy*dy);
 return dCntr < c1.radius + c2.radius;
 }
 
 void dispCircle(CircleType c){ 
  cout << " 중심 : (" << c.center.x << ", " << c.center.y << ")";
  cout << " 반경 : " << c.radius << endl;
  }
  
  int main(){
   CircleType c1 = {{0,0},10}; // 중심(0,0), 반경10으로 초기화
   CircleType c2 = {{30,10},5}; // 중심(30,10), 반경5로 초기화
   
   cout << "원1" << endl;
   dispCircle(c1);
   cout << " 원의 면적 : " << circleArea(c1) << endl;
   cout << "원2" << endl;
   dispCircle(c2);
   cout << " 원2의 면적 : " << circleArea(c2) << endl << endl;
   
   // 두 원의 중첩 여부 출력
   if(chkOverlap(c1,c2))
    cout << "두 원은 중첩됩니다." << endl;
    else
     cout << " 두 원은 중첩되지 않습니다." << endl;
     return 0;
   }
   
   == 결과 ==
   
   원1
    중심 : (0,0) 반경 : 10
    원1의 면적 : 314.159
   원2
    중심 : (30,10) 반경 : 5
    원2의 면적 : 78.5398
    
   두 원은 중첩되지 않습니다.

 

Circles1.ccp에서는 앞에서 설명한 2차원 공간의 좌표를 나타내는 구조체 C2dType과 원을 나타내는 구조체 CircleType을 사용하고 있다. 위 코드에서 볼 수 있는 것처럼 구조체는 하나의 대상물을 표현하기 위해 필요한 데이터 항목들을 묶어 하나의 단위로 표현할 수 있도록 한다. 그런데 이러한 구조체 데이터를 처리하는 함수들은 구조체와는 별개로 선언되어 있는 것을 볼 수 있다. 이 프로그램의 예에서는 원의 면적을 구하는 circleArea(), 두 원이 서로 중첩되는지를 검사하는 chkOverlap(), 원의 정보를 콘솔에 출력하는 dispCircle() 등이 CircleType의 데이터를 처리하도록 되어 있지만, 이 함수들은 CircleType과는 별개이다. 구조체의 멤버들은 이 함수들뿐만 아니라 어느 함수에서든 점 표기법으로 자유롭게 액세스 할 수 있게 되어 있다.

'Programming Languages > C++' 카테고리의 다른 글

배열  (0) 2020.04.30
클래스  (0) 2020.04.29
흐름제어 구문  (0) 2020.04.20
자료형의 변환  (0) 2020.04.17
연산자  (0) 2020.04.16