[자료구조] 3. C언어 배열과 구조체
글을 쓰기에 앞서, C언어를 기반으로 서술함을 알립니다.
이전 정리글 ↓
[자료구조] 2. 자료구조 기본 개념
[자료구조] 1. 자료구조 쉽게 이해하기 글을 쓰기에 앞서, C언어를 기반으로 서술함을 알립니다. 자료구조(Data Structure) 자료구조의 사전적 의미는 이렇다. 컴퓨터 과학에서 효율적인 접근 및 수정
w8err.tistory.com
배열(Array)
배열의 사전적 정의는 다음과 같다.
같은 타입의 변수들로 이루어진 유한 집합으로 정의
같은 자료형(int, char 등...)이 한 데 모여있다고 이해하면 쉽다.
많은 수의 데이터를 관리해야 한다면, 배열을 사용하면 된다.
50개의 int형 변수를 선언해보자.
#include <stdio.h>
int main()
{
int n1, n2, n3, n4, n5 // ... 이런 식으로 n50까지 작성한다.
// 또는
int n1;
int n2;
int n3;
// ... 이런 식으로 n50까지 작성한다.
}
이렇게 선언하면 무려 50개의 변수를 직접 코딩해야한다.
비효율적이니까 배열을 사용한다.
#include <stdio.h>
int main()
{
int list[50];
// 선언 끝!
}
위의 과정을 아주 편리하게 줄여주는 자료형이 배열(Array)이다.
배열 ADT
배열의 핵심적인 내용들을 추상화 시켜보자.
Array ADT
객체 : <인덱스, 값> 쌍의 집합
연산 :
* create(size) ::= size개의 요소를 저장할 수 있는 배열 생성
* get(A, i) ::= 배열 A의 i번째 요소 반환
* set(A, i, v) ::= 배열 A의 i번째 위치의 값 v 저장
위의 추상화된 내용들을 실제로 구현해보면...
int list[10];
// create 연산. 10개의 요소를 저장할 수 있는 list 배열 생성
list[3] = 7;
// set 연산. list 배열의 3번째 위치에 값 7 저장
number = list[3];
// get 연산. A => list 배열의 3번째 위치의 값을 number에게 반환
추상화된 연산들을 직관적으로 이해할 수 있다.
2차원 배열
2차원 배열은, 요소들이 2차원 형태로 나열되는 걸 의미한다.
표(Table)나 액셀을 생각하면 쉽다.
가로줄을 행(row), 세로줄을 열(column)이라고 정의한다.
선언 방법은 다음과 같다.
int list[2][5];
// 행(row)이 2이고 열(column)이 5인 2차원 배열을 생성
결과와 인덱스 :
list[0][0] | list[0][1] | list[0][2] | list[0][3] | list[0][4] |
list[1][0] | list[1][1] | list[1][2] | list[2][3] | list[2][4] |
구조체(Struct)
구조체의 사전적 정의는 이렇다.
하나 이상의 변수를 묶어서 새로운 자료형을 정의.
또는 다양한 타입을 한 데 묶어서 새로운 자료형을 정의.
배열은 자료형이 같아야 된다는 제한이 있지만,
구조체는 서로 다른 자료형이어도 선언할 수 있다.
서로 다른 자료형들을 묶어서, 새로운 자료형을 선언하니까.
이런 형태로 선언한다.
struct 구조체이름 {
자료형 변수명;
자료형 변수명;
자료형 변수명;
...
};
구조체의 형식을 위처럼 정의했다면, 이제 변수로 사용할 수 있다.
구조체 변수는 다음처럼 선언한다.
struct 구조체이름 구조체변수;
간단한 예로, 필자를 구조체화 시켜보자.
struct w8er { // 다른 변수와 구분하기 위해 전부 대문자로 표기한다.
char name[10]; //필자의 실명
int age; // 나이를 나타내는 정수값
bool gender; // true = 남성, false = 여성
};
필자 w8er이란 구조체는 다음과 같은 속성을 갖는다.
- 실명(name)
- 나이(age)
- 성별(gender)
※ 구조체 또는 클래스 안의 변수들을 멤버 변수라고 하는데, 따로 문자를 붙여 식별을 해주는 게 좋다. 협업할 때 도움이 된다.
이 강의에선 단순표현을 위해 생략하겠다.
ex) char m_name[10];
struct 키워드 다음에 오는 w8er는 구조체 태그(tag)다. 구조체의 이름이다.
하지만 아직 이렇게 한다고 해서 구현이 된 건 아니다.
실제로 선언하고 사용해보자.
struct w8er w;
// w8er를 실제 변수로 선언. w8er 구조체 변수의 이름은 w다.
strcpy(w.name, "Joo");
w.age = 99;
w.gender = true;
구조체 안의 멤버를 사용하려면 쩜을 입력하면 된다.
'.' 을 멤버연산자(Membership Operator)라고 한다.
Typedef
C언어에선 typedef를 사용해 구조체를 새로운 타입으로 선언하는 게 가능하다.
typedef w8er {
char name[10];
int age;
bool gender;
} wiseman;
// 밑의 wiseman이 새로운 데이터 타입의 이름이 된다.
이렇게 작성하고 나면, 새로운 데이터 타입인 wiseman만을 이용해 변수를 선언할 수 있게 된다.
wiseman w;
// struct w8er w; 와 같음
// 또는 이렇게 선언할 수 있다. 멤버가 선언된 순서를 지켜주자.
wiseman w = { "Joo", 99, false };
구조체를 사용해 간단한 프로그램을 작성해보자.
#include <stdio.h>
typedef struct stdentTag {
char name[10]; // 문자배열로 된 이름
int age; // 나이를 나타내는 정수값
double gpa; // 평균평점을 나타내는 실수값
} student;
int main()
{
student a = { "Kim", 20, 2.3 }; // 학생 Kim은 20살이고, 평균평점이 2.3이다.
student b = { "Joo", 99, 4.5 }; // 학생 Joo는 99살이고, 평균평점이 4.5다.
return 0;
}
다음 정리글 ↓
[자료구조] 4. 배열의 응용 : 다항식
이전 강의 보러 가기 ↓ https://w8err.tistory.com/m/34 다항식우리가 흔히 아는 다항식을, 배열을 사용해 구현해 보자. 다항식은 다음과 같이 생겼다. 사진에 서술되어 있듯 각각 a = 계수, x^2 = 변수, 2 =
w8err.tistory.com
'✍🏻배움일지 > 자료구조' 카테고리의 다른 글
[자료구조] 순환(recursion) / 반복(iteration) (12) | 2023.10.25 |
---|---|
[자료구조] 5. 포인터(Pointer) (33) | 2023.10.23 |
[자료구조] 4. 배열의 응용 : 다항식 (0) | 2023.10.22 |
[자료구조] 2. 자료구조 기본 개념 (2) | 2023.10.21 |
[자료구조] 1. 자료구조 쉽게 이해하기 (2) | 2023.10.18 |
댓글
이 글 공유하기
다른 글
-
[자료구조] 5. 포인터(Pointer)
[자료구조] 5. 포인터(Pointer)
2023.10.23 -
[자료구조] 4. 배열의 응용 : 다항식
[자료구조] 4. 배열의 응용 : 다항식
2023.10.22 -
[자료구조] 2. 자료구조 기본 개념
[자료구조] 2. 자료구조 기본 개념
2023.10.21 -
[자료구조] 1. 자료구조 쉽게 이해하기
[자료구조] 1. 자료구조 쉽게 이해하기
2023.10.18