본문 바로가기

C언어_VisualStudio

구조체 선언 / struct / 구조체 멤버 / typedef

오늘은 구조체를 선언하고 사용하는 방법들에 대해 간단히 정리하겠다. :-)

 

현재까지 사용해 온 기본 자료형으로는 char, int, double 등이 있다.

만약에 우리가 자료형을 만들 수 있다면 기본 자료형을 새롭게 만드는 일은 당연히 불가능하다. 하지만 기본 자료형을 가지고 새로운 자료형을 정의하는 것은 가능하다.

 

구조체는 하나 이상의 변수 (일반 변수, 포인터, 배열 등)를 그룹 지어서 새로운 자료형을 정의하는 것이다. 

 

이러한 구조체는 왜 사용하는 것일까? 그것은 몇 가지 예시들만 봐도 코드의 이해라던지 관리라던지 등의 이유로 사용하는 것이 편한다는 것을 알게 될 것이다.

 

< 구조체 선언 >

예를들어 좌표를 저장하려고 한다면(위도와 경도 등) 두 개의 변수(때에 따라서는 세 개)가 필요하다. 두 개의 변수인 x좌표, y좌표라고 한다면 두 개의 변수를 선언해야 하지만 이 둘은 서로 독립된 정보를 표현하는 것이 아니라 하나의 정보를 나타내는 변수들이다. 즉, 늘 붙어 다니는 변수인 것이다. 이렇게 늘 붙어 다니는 것들을 하나로 묶어서 사용하면 얼마나 편리한 것인지 한 번이라도 사용해보면 다들 공감할 것이다.

그러면 좌표 x, y를 저장하는 구조체 Point를 선언해보자.

//구조체 정의하기
struct Point{	// Point라는 이름의 구조체 선언
    int x;		// 구조체 멤버 x
    int y;		// 구조체 멤버 y
};

이렇듯 구조체는 사용자가 정의하는 자료형인 것이다. 새로운 자료형은 만들 수 없지만 기존에 정의되어 있는 자료형을 이용해 새로운 자료형을 정의하는 것이다. 

 

< 구조체 변수 선언 >

구조체를 만들었으면 구조체 변수를 선언하고 사용한다. 구조체 변수 하나에 멤버들이 들어있는 것이다.

구조체 변수를 선언하는 방법에는 두가지가 있다.

하나는 구조체를 선언하고 구조체 변수를 바로 선언하는 것이다.

// 구조체 변수 선언
struct Point{	// Point라는 이름으로 구조체 선언
    int x;		// 구조체 멤버 x
    int y;		// 구조체 멤버 y
} P1, P2, P3;	// 구조체 변수 P1, P2, P3 선언

 

혹은 main함수 안에서 선언하는 것이다.

// 구조체 변수 선언
struct Point{	// Point라는 이름으로 구조체 선언
    int x;		// 구조체 멤버 x
    int y;		// 구조체 멤버 y
};	

int main(void){
    struct Point P1, P2, P3; // 구조체 변수 P1, P2, P3 선언
    return 0;
}

 

< 구조체 멤버 변수 접근 >

'.'연산자를 사용하여 구조체 멤버 변수에 접근한다. 이때, '.'은 멤버 연산자 혹은 멤버 접근 연산자라고 부른다.

// Point라는 이름으로 구조체 선언
struct Point {int x; int y;};	

int main(void){
    struct Point P1; // 구조체 변수 P1선언
    P1.x = 3;		// P1의 구조체 멤버 x에 3대입
    P1.y = 4;		// P1의 구조체 멤버 y에 4대입
    return 0;
}

 

< typedef >

typedef를 이용하여 구조체 변수를 선언할 때 조금 더 간단하게 선언할 수 있다.

typedef는 C와 C++ 프로그래밍 언어의 예약어이다. 다른 자료형의 별명을 만들기 위해 사용된다. 예를 들어

typedef int JEONGSOO;

라고 한다면 JEONGSOO가 자료형 int의 별명이 되는 것이다. 다시 말하자면 JEONGSOO가 int 대신에 사용이 된다는 것이다. 물론, 이렇게 간단한 것에 사용하면 불필요한 일이겠지만 struct나 nuion 타입으로 이루어진 복잡한 자료 구조를 선언하는 문을 단순하게 만들기 위해 사용된다. 

 

구조체와 함께 사용하면 다음과 같이 사용할 수 있다.

// typedef와 구조체
struct Point{
    int x;		
    int y;		
};	
typedef struct Point Point;	// struct Point 대신에 Point를 사용한다는 의미

int main(void){
    Point P1, P2, P3; // 구조체 변수 P1, P2, P3 선언
    return 0;
}

 

동일한 표현이 몇 개 있다.

// typedef와 구조체(1)
struct Point{
    int x;		
    int y;		
};	
typedef struct Point Point;	// struct Point 대신에 Point를 사용한다는 의미

// typedef와 구조체(2)
typedef struct Point{
    int x;		
    int y;		
}Point;		// struct Point 대신에 Point를 사용한다는 의미

// typedef와 구조체(3)
typedef struct{
    int x;		
    int y;		
}Point;		// struct Point 대신에 Point를 사용한다는 의미

// typedef와 구조체(4)
struct Point{
    int x;		
    int y;		
}typedef Point;		// struct Point 대신에 Point를 사용한다는 의미

 

이 중에 자신에게 맞는 혹은 요구되는 방식을 선택해서 사용하면 된다. 나는 개인적으로 마지막 방법이 좋다. :-)