티스토리 뷰

이 글에서는 구조체에 대한 용어와 개념을 소개하겠습니다. 구조체를 어떻게 정의하고 사용하는가와 메모리 할당 등에 대해 살펴봅니다. 강의노트를 이용해 설명해 보겠습니다.

구조체란 타입이 다른 데이터를 하나로 묶는 방법입니다. 배열은 타입이 같은 데이터만 묶을 수 있죠? 근데 우리가 프로그래밍을 하다 보면 서로 다른 타입의 데이터를 묶어서 관리해야 할 일이 많이 생깁니다. 구조체는 그런 데이터를 이름을 붙여서 필드로 관리하게 됩니다. 예를 들어 학생을 나타내는 구조체라면 이름, 나이, 점수를 가질 수 있는데 이름은 문자열이고 나이는 int, 점수는 float로 표시되어야 한다면 구조체로 이들 세 개의 값을 묶어서 관리하면 편리하겠지요?

구조체는 먼저 선언을 해주어야 합니다. 구조체 안에 어떤 필드가 있는지 정해 주는 것이지요. 예를 들어 앞에서 살펴본 학생 구조체를 위에 있는 코드처럼 선언할 수 있습니다. struct 키워드 다음에 태그(구조체이름)이 나오고 집합 괄호 안에 필드의 선언이 여러 개 나올 수 있습니다.

이러한 구조체의 선언은 여러 종류의 데이터를 저장할 수 있는 모양 또는 틀을 선언하는 것입니다. 자바의 클래스와 비슷한 개념이죠? 사실 클래스가 구조체에서 발전한 개념이라고 할 수 있습니다. 이렇게 선언된 구조체 stucr studentTag는 새로운 타입으로 사용될 수 있습니다.

그럼 학생 구조체를 선언했는데, 이것으로 실제 데이터를 저장하기 위해 변수를 선언할 수 있습니다. 즉 학생구조체를 intchar 같이 타입의 자리에 쓸 수 있는 것이지요. 그러면 그 구조체의 데이터를 저장할 수 있는 크기의 메모리가 할당되고 그 영역에 s1이라는 이름을 붙이게 되니다. 그렇게 할당된 영역을 객체라고 합니다. (어떤 데이터를 저장할 수 있는 메모리 공간이 생기는 것을 객체가 생겼다라고 할 수 있습니다) 여기서는 학생 객체 s1이 하나 생겼다고 할 수 있습니다. 그러면 우리는 s1.age로 그 학생의 나이 필드를 저장하거나 읽어올 수 있습니다. s1.name은 그 학생의 이름 필드를 가져오는 것이구요, 그 필드에 값을 저장해서 변경하는 set 기능도 가능합니다.

다음은 타입에 새로운 이름을 붙이는 typedef에 대해 알아보겠습니다. typedef는 구조체에 이름을 붙일 때 많이 씁니다. 위에서 살펴본 것처럼 "struct 구조체태그"로 이용하는 것이 번거롭기 때문에 그냥 하나의 이름으로 사용할 수 있게 해주는 것이 typedef입니다. 

이제 진짜 타입의 이름을 하나 정의한 것이 됩니다. Typedef라는 키워드는 새로운 타입에 이름을 붙여서 그 이름으로 변수 선언에 쓸 수 있게 해주는 기능입니다. 위의 파란 코드 부분 struct studentTag { ... }이 하나의 구조체를 선언하는데 그 구조체에 typedefstudent라는 이름을 준 것입니다. 그럼 번거롭게 struct studentTag라고 쓸 것 없이 student s; 라고 써서 s라는 학생 구조체 변수를 하나 선언할 수 있게 됩니다. struct studentTag라는 이름 대신 student 라고 쓸 수 있게 되었다고 볼 수 있습니다. 

한가지 더 살펴보면 구조체를 선언하면서 바로 초기화할 수 있는 기능도 제공됩니다.

student s = {"kim", 20, 3.8};

위에서 본 것처럼 구조체에 들어갈 필드의 값을 차례로 집합괄호 안에 나열해 주면 객체가 선언되면서 바로 각 필드의 값을 설정해 줄 수 있습니다. 위 그림의 분홍색 둥근 네모 s는 학생 객체가 하나 메모리에 저장된 것을 나타냅니다.

다음 예제는 구조체 student를 이용해 두 개의 객체를 선언하면서 초기화하는 코드를 보여줍니다.

구조체 타입 student를 정의하고 그 타입으로 두 명의 학생 ab를 선언하면서 초기화한 것을 보여줍니다. 이렇게 되면 메모리에는 이름, 나이, 점수를 저장할 구조체 두개가 생성됩니다.

이렇게 우리는 구조체를 이용해 이름, 나이,점수 세 개의 값을 묶어서 가지는 변수를 선언할 수 있고 선언할 때마다 학생 객체가 하나 메모리에 할당됩니다. 그리고 구조체 안의 필드를  s.name이나 s.age로 접근할 수도 있고 구조체 변수 s를 통째로 주고 받을 수도 있습니다.

여기까지 해서 구조체가 무엇인지 간단히 살펴보았습니다. 물론 이걸로 충분하지는 않지만 구조체를 사용하는 연습을 통해 익히시기 바랍니다. 또 자바프로그래밍에서 객체지향과 객체에 대해 이해하게 되면 좀더 쉽게 구조체를 이해할 수 있을 것입니다

'C 프로그래밍기초' 카테고리의 다른 글

진짜 이차원배열처럼 malloc하는 방법  (0) 2020.03.14
C 포인터 (1) - 개요  (0) 2020.02.11
C printf 요약매뉴얼  (0) 2020.01.08
C from Python - step 1  (0) 2019.12.25
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함