-
[C 자료구조] Ch.1 자료구조공부/자료구조(Data Structure) 2023. 5. 4. 06:47더보기
이번 챕터에서는 자료구조 중 C언어의 배열, 포인터, 구조체에 대해 다뤄보고자 한다.
앞서 튜토리얼에서는 C언어의 자료형과 자료형의 메모리 크기와 범위 등을 다룬다.
0. 튜토리얼 [자료형]
자료형 이름 크기(byte) 표현 범위 정수형 char 1 byte -128 ~ 127 short 2 byte -32786 ~ 32787 long 4 byte -2.147.483.648 ~ 2.147.483.647 int 4 byte -2.147.483.648 ~ 2.147.483.647 long long 8 byte ~9.223.372.036.854.775.808~
9.223.372.036.854.775.807실수형 float 4 byte +- 3.4 x 10^-37 ~ +-3.4x10^38 double 8 byte += 1.7 x 10^-307 ~ +- 3.4 x 10^308 long double 8 byte
(리눅스, OS X에서는 16 byte)double 이상 [C언어 자료형 & 자료형의 크기 & 자료형의 표현 범위]
1. 배열
배열 (Array)은 자료형이 같은 자료를 나열하여 메모리에 연속으로 저장하여 만든 자료 그룹이다.
인덱스 (Index)는 배열 요소를 간단히 구별하기 위해 번호를 붙인 것 이다. (0부터 시작)
배열은 다음과 같은 형식으로 선언된다. 예시로 사용된 배열은 1차원 배열이다.
[1차원 배열 선언]
1) 자료형 : 배열의 자료형을 선언한다. 배열요소의 자료형이 곧 배열의 자료형이 된다.
2) 배열이름 : 변수의 이름은 영문자, 숫자, 언더바(_)를 사용하며, 첫글자는 숫자가 될 수 없다. 대소문자 구별가능
3) 배열요소의 개수 : 대괄호([])를 사용해 배열 요소의 개수를 표시한다. 크기는 "자료형에 대한 메모리 할당 크기 x 요소의 개수" 이다.
다음 그림은 2차원 배열의 그림이다.
[2차원 배열 선언]
1차원 배열과 다름점은 3, 4번의 배열 크기를 2번 입력한다는 것이다.
3) 배열 크기 (행) : 행 개수는 행 번호를 의미한다.
4) 배열 크기 (열) : 열 개수는 열 번호를 의미한다.
이처럼 n 차원 배열의 경우, 배열의 크기를 추가해주면 된다.
[2차원 배열의 논리적/물리적 구조 예시]
2. 포인터
앞서 배열을 설명 할 때, 메모리에 그룹 형태로 저장한다고 설명했다.
사용자가 작성한 모든 변수는 메모리의 특정 위치에 저장되게 되는데, 그 메모리의 주소를 포인터 라고 한다.
포인터는 메모리의 주소값을 저장하는 특별한 변수로, 포인터를 사용하여 다른 변수를 액세스할 수 있다.
[포인터 예시]
[포인터 선언 형식]
포인터는 위와 같이 선언 할 수 있다.
1) 자료형 : 포인터 자체의 자료형이 아닌, 포인터에 저장할 주소에 있는 일반 변수의 자료형
2) *포인터이름 : 일반 변수와 작명방법은 동일하나, 앞에 * 을 붙여 포인터임을 선언한다.
C언어에서 포인터와 관련된 연산자는 주소 연산자 &와 참조연산자 *이 있다.
1. 주소 연산자 (&)
&은 변수의 주소를 얻기 위해 사용한다.
2. 참조 연산자 (*)
*은 저장된 주소 영역(참조 영역) 또는 저장된 주소 영역의 값(참조값)을 액세스한다.
이 둘을 사용한 예시를 그림으로 첨부한다.
[예시 1. 변수 선언 및 포인터 사용]
[예시 2. 예시 1의 흐름도]
1) 주소 연산자를 사용하여 변수 i의 주소를 포인터 ptr에 할당.
2) 참조 연산자를 사용해 포인터 ptr이 가리키는 영역에 값 10을 지정 = 변수 i는 10이 된다.
3) 참조 연산자를 사용해 ptr이 가리키는 영역의 값을 변수 j에 지정 = ptr이 가리키는 변수 i의 값 10을 변수 j에 저장
추가로 포인터의 포인터 즉, 이중 포인터라는 것이 존재한다.
포인터를 가르키는 포인터를 의미하는데, 일반 변수의 주소가 아닌 포인터의 주소를 가지고 있는 포인터를 의미한다.
[이중 포인터 선언 형식]
일반 포인터 선언과 동일하나, *을 두번 사용한다는 차이점이 있다.
[이중 포인터 예시]
3. 구조체
구조체도 배열과 비슷하게 여러 데이터를 하나의 그룹으로 묶어 하나의 자료형으로 정의하고 사용하는 자료형이다.
단, 배열은 같은 자료형 끼리 한 그룹으로 묶지만, 구조체는 서로 다른 자료형도 그룹으로 묶을 수 있다.
주로, 여러 자료형을 그룹으로 묶어 사용할 때 사용된다.
[구조체형의 선언 및 사용 형식]
struct KIM{ char name[10]; int year; int pay; };
[C언어의 구조체 선언 예시]
구조체를 사용하는 단계는 다음과 같다.
1 단계 : 구조체형 선언 - 내부 구조를 정의
2 단계 : 구조체 변수 선언 - 구조체형에 따른 변수를 선언한다.
3 단계 : 구조체 변수의 사용 - 내부 항목에 데이터를 저장하고 사용한다.
구조체형과 구조체 변수는 3가지 형태로 선언이 가능한데, 다음과 같다.
방법 예시 코드 1. 구조체형을 선언한 뒤, 구조체 변수 선언 struct KIM{
char name[10];
int year;
int pay;
};2. 구조체형과 구조체 변수를 연결하여 선언 struct KIM{
char name[10];
int year;
int pay;
} Kname;3. 구조체형 이름을 생략 후, 구조체 변수 이름만 선언 struct {
char name[10];
int year;
int pay;
} Kname;
4. 정리
[배열]
index를 이용한 접근으로 요소에 접근이 빠르며, 다차원 데이터를 다룰 때 주로 사용되며, 공간 낭비가 적다.다만, 배열을 선헌한 뒤, 할당된 메모리는 정적 메모리이므로 크기 변경이 불가능하다.
메모리 크기가 정적인 경우, 요소의 삽입가 삭제가 동적으로 발생하는 환경에서 오버플로우나 메모리 낭비 등 문제가 발생한다.
[포인터]
복잡한 자료 구조 (배열, 구조체 등)에 쉽게 접근할 수 있으며, 복잡한 코드를 간결하게 표현과 처리가 가능하다.
메모리 주소를 참조해서 다양한 자료형 변수들의 접근이 가능하다.
동적 할당된 메모리 영역인 힙 영역 접근이 가능하다. 배열로 생성 불가한 데이터를 생성 가능하다.
다만, 선언 후 초기화를 하지 않을 경우, 문제가 생길 수 있으며, 주소를 직접 만져야하므로 예외 처리가 확실 하지 않은 상황에서 사용하기 까다롭다.
배열과의 차이점
1. 포인터는 변수, 배열은 상수
2. 포인터는 동적으로 크기를 결정, 배열은 정적으로 결정
3. 동작 속도
4. 배열만으론 함수를 전달 불가, 포인터를 사용해 배열을 전달 가능
[구조체]
구조체를 사용하면 기존 선언된 함수에 변수 추가가 용이함. (배열은 같은 자료형만 추가가 가능하나, 구조체는 다른 자료형도 추가 가능)
'공부 > 자료구조(Data Structure)' 카테고리의 다른 글
[C 자료구조] Ch.0 자료구조 (1) 2023.04.25