• 구조체의 이해
  • Zappy (IP: *.199.146.64)
    조회 수: 5792, 2006-10-18 19:38:50(2006-10-18)
  • # 구조체

    구조체가 무엇일까요?

    여러분이 만약 학교에서 학생 정보 관리 프로그램을 만든다고 합시다.

    그리고 학생 한사람당 다음과 같은 데이터가 있다고 하고, 학생수는

    100명 이라고 합시다.

    학년, 반, 번호, 이름, 나이, 전화번호

    그렇다면 여러분을 어떻게 데이터를 처리하시겠습니까?

    각 데이터별로 100개의 원소를 갖는 배열을 만들어 처리하시겠습니까?

    그렇게 하면 복잡해지죠?

    이럴때 구조체를 사용합니다. 구조체는 한개 이상의 변수를

    묶어둔 것이라고 생각하시면 됨니다. 그렇게 묶어서 한개의 변수처럼

    취급하는 것이죠.

    예를 들자면 위와 같은 데이터를 넣을 변수들을 하나로 묶어서 학생이라는

    구조체를 만들어 사용하면 처리가 쉬워지겠죠?

    (1) 구조체 만들기와 구조체 변수

    구조체를 일반적으로 다음과 같이 만듬니다.

    struct 구조체이름 { 데이터형태 변수; 데이터형태 변수; . . }; 

    여기서 {}안에 들어있는 변수들이 구조체를 구성하는 변수로

    멤버변수라고 합니다.

    예를 들어 아까 학생 데이터를 처리하기 위한 구조체를 만들면

    struct Student { int Grade; int Class; int Number; char Name[16]; int Age; char Phone[16]; }; 

    이렇게 만들어주면 되겠죠?

    이렇게 구조체를 만들었으면 사용해야 하는데,

    여기서 만든걸 그냥 사용하는 것이 아닙니다.

    여기서 만든건 단지 그 구조체가 어떤 멤버변수로 구성되어 있는지

    형식을 만들어 준 것 뿐이거든요.

    그러므로 사용하기 위해선 그 형식에 맞추어 기억 장소들을 마련하여

    변수를 만들어 사용해야 합니다.

    이때 만드는 변수를 구조체 변수라고 하죠.

    구조체 변수를 만드는 것은 간단합니다.

    다음과 같이 하면 되죠.

    struct 구조체이름 구조체변수[, 구조체변수, ...];

    예를 들어 위에 있는 Student라는 구조체에 대한 구조체 변수 s를 선언하려면

    struct Student s;

    이런 식으로 해 주면 됨니다.

    구조체 변수는 구조체를 만들때 같이 만들어 줄수도 있는데

    방법은 다음과 같이 하면 됨니다.

    struct [구조체이름] { 데이터형태 변수; 데이터형태 변수; . . } 구조체변수[, 구조체변수, ...]; 

    예를 들어 아까 나왔던 Student라는 구조체를 만들면서

    s라는 구조체 변수도 같이 선언한다면

    struct Student { int Grade; int Class; int Number; char Name[16]; int Age; char Phone[16]; } s; 

    이렇게 해 주면 됨니다.

    그리고 이렇게 구조체와 구조체 변수를 같이 선언할때는

    구조체이름을 쓰지 않아도 됨니다.

    즉 위의 것은

    struct { int Grade; int Class; int Number; char Name[16]; int Age; char Phone[16]; } s; 

    이렇게 써도 된다는 것이죠.

    하지만 이렇게 하면

    struct 구조체이름 구조체변수[, 구조체변수, ...];

    이런 식으로는 구조체 변수를 만들수 없게 되겠죠?

    이유는 쓸 구조체이름이 없으니까요.

     

    (2) 구조체 변수의 사용

    이제 구조체 변수를 선언하는 것까지 배웠으니

    구조체 변수를 사용하는 알아야 겠죠?

    구조체 변수 안에는 한개 이상의 멤버 변수가 들어 있죠?

    구조체 변수를 사용한다는 말은 그 멤버 변수를 사용한다는 말이 됨니다.

    사용은 다음과 같이 하죠.

    구조체변수.멤버변수 = 값; 변수 = 구조체변수.멤버변수; 

    예를 들어 아까 그 Student라는 구조체의 변수를

    struct Student s;

    이렇게 선언했다고 합시다.

    그리고 이 구조체 변수의 멤버 변수중 Class에 5을 넣으려면

    s.Class=5;

    이렇게 하면 되고, Name이라는 멤버 변수에 "AAA"를 넣으려면

    strcpy(s.Name,"AAA");

    이렇게 하는 것 입니다.

     

    (3) 구조체 변수의 초기값

    구조체 변수에도 과연 초기값을 줄수 있을까요?

    당연히 할수 있겠죠?

    방법은 배열에 초기값 주는 것과 비슷합니다.

    다음과 같이 하면 되죠.

    struct 구조체이름 구조체변수 = { 첫번째 멤버변수의 초기값, 두번째 멤버변수의 초기값, ... }; 

    예를 들어 아까 나왔던

    struct Student { int Grade; int Class; int Number; char Name[16]; int Age; char Phone[16]; }; 

    이런 구조체가 있을때 s라는 구조체 변수를 초기값을 주어 선언하면

    struct Student s = { 1, 5, 10, "AAA", 14, "000-0000" };

    이렇게 합니다. 이때 s.Grade에는 1이, s.Class에는 5가, s.Number에는 10이,

    s.Name에는 "AAA"가, s.Age에는 14가, s.Phone에는 "000-0000"이

    들어가게 되는 것이죠.

     

    (4) 구조체 배열

    구조체 역시 배열을 만들수 있습니다.

    방법은 다른 배열들과 똑같은 형식으로 만들면 되죠.

    그러니까

    struct 구조체이름 구조체배열명[크기];

    이렇게 해서 만들수 있습니다.

    2차원 구조체 배열은

    struct 구조체이름 구조체배열명[크기][크기];

    이렇게 하고요. 3차원은 이제 설명 안해도 아시겠죠?

    구조체 배열 선언의 예를 들어 보죠.

    위에 나온 Student라는 구조체의 배열로 10개의 원소를 가지고 있고

    이름이 sarray인 것은

    struct Student sarray[10];

    이렇게 선언하면 됨니다.

    구조체 배열의 사용 역시 다른 배열들과 똑같은 형식으로

    해 주면 됨니다.

    즉 다음과 같이 하면 되죠.

    구조체배열명[첨자].멤버변수 = 값; 변수 = 구조체배열명[첨자].멤버변수; 

    2/3차원 구조체 배열의 사용법은 뭐 설명이 필요 없죠?

    그럼 예를 들어 위에 나온 sarray라는 구조체 배열의 세번째 원소의

    Class라는 멤버에 5를 넣으려면

    sarray[2].Class=5;

    이렇게 하죠.

     

    (5) 구조체 포인터

    구조체 포인터도 역시 다른 포인터 들과 똑같은 형식으로

    선언해 주면 됨니다.

    struct 구조체이름* 구조체포인터명;

    예를 들어 위에 나온 Student라는 구조체의 포인터로

    이름이 spointer인 것은

    struct Student* spointer;

    이렇게 선언합니다.

    구조체 포인터의 사용은 일반 포인터와 비슷합니다.

    예를 들어 다음과 같이 구조체 변수와 구조체 포인터를

    선언했다고 합시다.

    struct Student s; struct Student spointer; 

    이때 spointer라는 구조체 포인터에 s라는 구조체 변수의 주소를 넣을땐

    주소연산자를 사용하여

    spointer=&s;

    이렇게 해 주면 되죠.

    그럼 spointer에 저장되어 있는 구조체 변수의 주소에 기억된 내용들을

    사용할때는 어떻게 할까요?

    이미 배운 참조 연산자를 사용해

    *spointer.Grade=1; *spointer.Class=5; 

    이런 식으로 하면 될까요?

    이렇게 하면 절대 않됨니다. 이유는 처음 설명하는 것이지만

    참조 연산자(*)보다 멤버 엑세스 연산자(.)가 우선 순위가

    높기 때문이죠. 그러므로 에러가 발생합니다.

    이걸 해결하기 위해선 ()를 사용해 참조 연산을 먼저 실행하게

    하면 해결이 됨니다.

    그러니까 위의 것들은

    (*spointer).Grade=1; (*spointer).Class=5; 

    이렇게 해 주면 되는 것이죠. 그런데 이렇게 쓰는건 좀 복잡하죠.

    이걸 좀 편하게 쓰기 위한 연산자가 있는데

    바로 ->이죠. 사용은

    구조체포인터->멤버변수 = 값; 변수 = 구조체포인터->멤버변수; 

    이렇게 합니다.

    예를 들어 위에 나왔던 것들은

    spointer->Grade=1; spointer->Class=5; 

    이렇게 해 주면 더 간단해 지게 되죠.

댓글 0

번호 제목 닉네임 조회  등록일 
12 Zappy 6022 2006-10-18
Zappy 5792 2006-10-18
10 Zappy 5562 2006-10-18
9 Zappy 5543 2006-10-18
8 Zappy 5044 2006-10-18
7 Zappy 5460 2006-02-28
6 Zappy 5140 2006-10-01
5 Zappy 6949 2006-09-22
4 Zappy 5924 2006-09-05
3 Zappy 5440 2006-09-05
XE Login