1. 안드로이드 프로그래밍 기초
1. 구조체
작성일 : 2011-04-07
작성자 : 이새한슬 [hylo926@gmail.com]
I. 구조체
가. 정의
구조체란 사용자 정의 자료형이다. 마치 사용자 정의 함수처럼 자료형을 사용자가
직접 작성한다. 둘 이상의 자료형이 묶어져야 할 필요성이 있을 때, 구조체를 사용하여
하나의 자료형으로 묶어 정의할 수 있다.
나. 선언
구조체의 선언 방법에는 가지가 있다. 햇갈릴수 있으므로 잘 알아두도록 한다.
struct struct_tag {
…variable list…
} variable_name;
첫 째로, 구조체를 선언하기 위해 struct라는 예약어를 사용한다. ( 정수형 변수를
선언하기 위해 int를 사용하듯이.. )
그 다음은 struct_tag 즉, 구조체의 이름을 넣는다.
그 후 대괄호를 열고 구조체에 포함될 자료들을 써 넣은 후 대괄호를 닫는다.
그 후 변수이름을 쓰고 세미콜롞으로 마무리한다.
구조체의 선언 시 이 모든 요소를 반드시 써야되는 것은 아니다. 위의 예시중 빨갂
배경으로 써짂 글씨는 반드시 써야하고 나머지는 부분적으로 생략 가능하다. 단,
struct_tag와 variable_name을 모두 쓰지 않을 경우 에러가 나짂 않지만 ( warning 발생 )
앞으로의 코드에서 이 구조체를 사용할 수 있는 방법이 없기 때문에 ( 접근 할 수 있는
방법이 없다 ) 그런식으로 써서는 안된다.
- 1 -
2. (1) struct_tag를 쓰지 않을 경우 : variable_name을 반드시 써서 나중에 접근 할 수
있도록 한다.
(2) variable_name을 쓰지 않을 경우 : 나중에 struct struct_tag variable_name; 으로
변수 이름을 써서 사용하도록 한다.
(3) struct_tag와 variable_name을 모두 쓸 경우: variable_name을 쓰지 않으면 나중에
struct struct_tag variable_name; 으로 사용한다고 하였는데, 이 때의 축약형이라고
생각하면 된다. 즉 구조체 정의와 동시에 변수를 선언하는 방법이다.
C언어에서는 구조체를 정의한 후 변수를 선언 할 때 반드시 struct예약어를 붙여 struct
struct_tag variable_name; 이런식으로 선언을 해야한다. 이런 귀찮은 상황을 피하기 위해
보통 다음과 같이 구조체를 정의한다
typedef sturct _struct_tag {
…variable_list…
} _struct;
…다른 코드들…
_struct variable_name;
위 예시는 _struct라는 이름의 구조체 정의와 변수 선언을 보여준다. ( struct예약어와
혼동될 여지가 있기 때문에 이름 앞에 _를 붙여 _struct라고 한 것임 )
typedef이란 예약어는 별칭을 사용하게 해준다. 예를들어
typedef char BYTE;
BYTE variable_name;
라고 선언하면 앞으로 BYTE라는 단어로 변수들을 선언할 수 있게 되며 선언된 변수의
크기는 char형과 동일하다. 마찬가지로 구조체 이름을 _struct_tag로 정의는 하였지만
앞에 typedef을 써주었기 때문에 _struct라는 이름으로 변수를 선언할 수 있게 된다.
앞에서 struct_tag와 variable_name을 모두 썻을 경우 struct struct_tag{ …variable_list…};
struct struct_tag variable_name;의 축약형이라고 얘기한 적이 있는데, typedef의 경우도
마찬가지이다. 즉, 위 코드는 struct _struct_tag { …variable_list… }; typedef struct
_struct_tag _struct; 의 축약형이다. 또 눈치가 빠르면 알겠지만 _struct_tag와 _struct처럼
보통 정의시에는 tag를 붙여쓰고 typedef에 의해서 부르게 될 이름에는 tag를 빼고
이름만쓴다. 예를들면 다음과 같다.
- 2 -
3. typedef struct tagTest{ } Test;
하지만 이는 관용적인 표현일 뿐이기 때문에 때문에 꼭 따를 필요는 없다.
다. 초기화
구조체 변수의 초기화에는 크게 두가지 방법이 있다.
typedef struct tagData {
int age;
char name;
} Data; ……………………………………………………………………… (1)
Data leeSoongHee; ………………………………………………….. (2)
(1) 대괄호를 이용하여 직접 초기화 하기
구조체의 정의를 마치면 메모리가 할당되지 않는다. 하지만 변수를 선언하게
되면 그 변수의 크기만큼 메모리가 할당된다. 즉 (1)시점에서는 메모리가 할당
되짂 않지만 (2)시점에서는 메모리가 할당된다. ( 변수의 데이터를 저장할 공갂이
생기게 된다 ) 이때 메모리가 할당되는 방식은 위 예시를 예를들어 설명하자면
멤버에 int형 변수 하나와 char형 변수가 있다. 선언된 순서되로 int형 4byte
char형 1byte 합해서 5byte가 할당된다. 이렇게 순서대로 할당되기 때문에
대괄호를 이용하여 다음과 같이 직접 초기화 할 수 있다.
Data leeSoongHee = { 21, ‘i’ };
하지만 이 방식은 선언과 동시에 수행해야 된다.
(2) 멤버를 직접 불러 초기화 하기
멤버를 직접 호출하는 경우는 크게 두가지가 있다 . ( dot member selection
operator ) 와 -> ( arrow member selection operator )가 있다. .은 구조체형 변수
뒤에 붙어 leeSoongHee.age 이런식으로 사용된다. ->는 구조체형 포인터 변수
뒤에 붙어 Data *ptr; ptr->age 이런식으로 사용된다. 멤버를 직접 불러 초기화
하는방법은 위에서 언급한 연산자 두개를 통해 가능하다.
라. 과제1
정수형 멤버 int age와 더블형 멤버 double height, 문자열 멤버 char[80] name 을
가지는 구조체를 형성하여 다음 세사람을 저장한다
이름: steve 이름: peter 이름: andrea
- 3 -
4. 나이: 25 나이: 23 나이: 40
키: 185.3 키: 175.0 키: 163.9
steve는 {}를 이용하여 초기화 하고 peter는 dot member selection operator를 통해
초기화한다. andrea는 arrow member selection operator로 초기화 한다. 그 후 화면에
세명 모두를 출력 한다. 실행 결과화면과 소스코드 파일( *.c )을 메일에 첨부하여
4/9(토) 저녁 9:00까지 hylo926@gmail.com으로 보낸다.
II. LinkedList
- 다음시갂에..
- 4 -