티스토리 뷰

C,C++

C/C++ : 구조체(struct)의 개념

Andrew Shin 2016. 4. 11. 16:34

본 자료는 숭실대학교 정보통신전자공학부 소속 소모임 BlindC에서 2학년을 대상으로 하는 C++ 스터디 진행을 위하여 작성합니다.

개인의 소중한 창작물이기 때문에 자료의 열람은 자유이고, 소스코드를 긁어갈 수 있도록 우클릭제한이나 기타 제한은 걸어놓지 않았으나, 외부 공개나, 2차 수정등은 자제해주시길 부탁드리며 편의상 반말로 진행하도록 하겠습니다.


구조체(struct)의 개념


C/C++ 에서는 구조화된 데이터를 처리할때 struct라는 개념을 사용하는데 이를 구조체 라고 한다. 구조화 되어 있다는 말은 의미가 연결되어 한 덩어리로 처리하는 방식을 말한다. 기초 프로그래밍에서 고급 프로그래밍으로 넘어가는 과정에서 이 struct에 대한 개념을 확실하게 잡지 않으면 차후에 배우게 되는 class에서 많이 해메게 될 것이기 때문에 사전에 한번 정리하는 시간을 갖도록 하자.


한 예를 들어서, 사람에 대한 정보를 처리하고자 하면, 사람에 대한 공통적인 정보들을 추출한 다음 이것을 묶어서 사용한다. 가령 사람이라면 누구나 이름이 있고, 나이가 있으며, 성별이 있을것이다. 이를 구조화 하면 다음과 같다.


1
2
3
4
5
6
struct 사람
{
    이름
    나이
    성별
};
cs


이를 다시 C언어로 바꾸어서 입력하면 다음과 같다.


1
2
3
4
5
6
struct PERSON
{
    char* m_name;
    int m_age;
    bool m_gender;
};
cs


본격적인 설명에 앞서 네이밍 기법에 대해 간단하게 짚고 넘어 가겠다.

1. 구조체의 이름, 즉 구조체명은 클래스명과 구분하기 위하여 전부 대문자로 기입한다. (클래스의 경우 첫자만 대문자)

2. 구조체나 클래스 안에있는 변수들은 멤버변수라고 칭하며 이 변수들은 로컬 변수들과 구분하기 위하여 앞에 "m_" 이라고 붙여준다.

이것들을 지키지 않는다고 컴파일 에러가 나거나, 로직이 수행되지 않는것은 아니나, 원활한 협업과 가독성을 위해서 되도록이면 지켜주는 것이 좋다. 습관처럼 사용해야 한다.


먼저 PERSON 이라는 이름의 struct를 만들었다. 여기서 중요한것은 중괄호를 닫고 세미콜론을 해야 한다는점. 시험문제에서 손코딩이 나오면 이와같은 사소한 실수로 감점되기 쉽다.

이제 구조체를 만들었으니, 내용물을 채워야 한다. 내용물은 이름,나이,성별인데 이름은 문자열을 저장할 수 있는 데이터 타입인 char*을 사용, 나이는 정수를 저장할 수 있는 int형을 사용, 성별은 "남자" 아니면 "여자"이기 때문에 true 혹은 false로 저장되는 bool 타입을 사용했다.


이렇게 PERSON 구조체에 대해서 정의했으니, 이제 사용법을 보겠다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main()
{
    PERSON p1;
    strcpy(p1.name, "홍길동");
    p1.age = 18;
    p1.gender = true;
 
    printf("이름 : %s, 나이 : %d",p1.name, p1.age);
    
    if(p1.gender == true)
        printf("성별 : 남성\n");
    else
        printf("성별 : 여성\n");
 
    return 0;
}
cs


먼저 3 line에서 정의해놓은 PERSON 타입의 구조체 p1을 선언했다.

4~6line은 구조체 내부의 멤버변수를 초기화 하는 모습이다. 구조체 내부의 멤버변수로 접근하려면 '.'(직접 참조 연산자)를 이용한다. 구조체이름 뒤에 마침표를 찍고 멤버변수 이름을 입력하면 된다.


마지막으로 8라인에서 p1.name과 p1.age를 출력하고 if문을 이용해서 남성인지 여성인지 검출하는 소스를 작성해 보았다.


이렇게 간단하게 구조체의 정의와 선언, 사용에대해서 알아보았다. 여러명의 사람에 대해서 작성해야 하는 경우 name1,name2 age1,age2, gender1,gender2... 이렇게 선언하여 사용하는것보다 미리 정의해놓은 구조체를 활용하여 p1, p2등과 같이 사용하는것이 훨씬 효과적이다 라는 사실에 대해서는 벌써 느꼈을 것이다. 더 좋은점은 이러한 구조체를 배열로 선언해서 사용할 수 도있다.


1
2
3
4
5
6
7
8
9
int main()
{
    PERSON p[5];
    
    for(int i = 0; i < 5; i++)
        p[i].age = i+1;
 
    return 0;
}
cs

위와 같은 코드의 활용도 가능해 진다는 점. 위 코드는 5명의 사람을 선언해놓고 첫번째 사람부터 5번째 사람까지 나이가 1살부터 한살씩 많아지도록 반복문을 사용하여 작성했다. 메모리에 대해서 간략하게 얘기해보자면 int형 배열은 한 방의 크기가 4바이트 이지만, 구조체배열의 경우 내부에 선언한 데이터형의 합계가 한 방의 크기이다. char* 4바이트 int 4바이트 bool 1바이트, 한 방의 크기는 도합 9바이트가 되겠다. 배열은 동일한 자료형의 연속적인 형태이기때문에 PERSON배열의 한 방의 크기는 모두 9바이트가 되겠다.


설명이 부족하거나 잘 이해가 안되는 부분에 있어서 질문 해주시면 답변 드리겠습니다,

도움이 되었다면 광고를 클릭해주시면 작성자에게도 큰 도움이 됩니다 ^.^

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함