배열 (Array)

배열은 가장 기본적인 자료구조로, 같은 종류의 데이터 여러 개를 하나로 묶어 관리하는 방법입니다. 반 학생들의 수학 점수, 월별 강수량처럼 동일한 성격의 데이터를 다룰 때 매우 유용합니다.

배열의 핵심 특징은 데이터들이 메모리 공간에 연속적으로 나란히 저장된다는 점입니다. 각 데이터 칸에는 0부터 시작하는 번호, 즉 인덱스가 붙어 있어 scores[0], scores[1]처럼 원하는 위치의 데이터에 쉽게 접근할 수 있습니다. 또한 데이터를 표(2차원)나 공간(3차원) 형태로 확장하여 관리하는 다차원 배열도 있습니다.

포인터 (Pointer)

포인터는 C언어의 강력한 기능이지만, 많은 입문자들이 어려워하는 개념이기도 합니다. 포인터는 변수가 저장된 '값'이 아닌, 그 값이 저장된 '메모리 주소'를 다루는 특별한 변수입니다.

포인터가 필요한 이유는 메모리를 직접 제어할 수 있기 때문입니다. 이를 통해 동적으로 데이터를 관리하거나, 함수의 매개변수로 큰 데이터를 효율적으로 전달하는 등 고성능 프로그래밍이 가능해집니다. 앞으로 배울 '연결 리스트'와 같은 동적 자료구조의 핵심이 됩니다.

포인터에서는 두 가지 핵심 연산자를 기억해야 합니다. & 연산자는 일반 변수 앞에 붙여 메모리 주소를 알아내고, * 연산자는 포인터 변수 앞에 붙여 그 주소에 저장된 실제 데이터 값을 가져옵니다.

구조체 (Structure)

배열이 같은 종류의 데이터만 묶을 수 있었다면, 구조체는 서로 다른 종류의 데이터를 하나로 묶어 새로운 타입을 만드는 기능입니다.

예를 들어 한 사람의 정보를 표현하려면 이름(문자열), 나이(정수), 키(실수) 등 다양한 타입의 데이터가 필요합니다. 구조체를 사용하면 struct Person이라는 새로운 데이터 타입을 정의하여 이 정보들을 하나의 단위로 깔끔하게 관리할 수 있습니다. 구조체 변수의 내부 데이터(멤버)에 접근할 때는 .(점) 연산자를, 구조체를 가리키는 포인터에서는 ->(화살표) 연산자를 사용합니다.

재귀 호출 (Recursion)

재귀 호출은 함수가 자기 자신을 다시 호출하는 프로그래밍 기법입니다. 복잡해 보이는 큰 문제를 동일한 구조를 가진 더 작은 문제들로 나누어 해결할 때 강력한 힘을 발휘합니다.

재귀 함수의 작동 원리는 'n!' 팩토리얼을 구하는 문제를 예로 들 수 있습니다. n! = n * (n-1)!이라는 점화식을 그대로 코드로 옮긴 것과 같습니다. 함수는 계속해서 더 작은 팩토리얼을 구하기 위해 자기 자신을 호출하다가, 더 이상 쪼갤 수 없는 종료 조건(Base Case), 예를 들어 1!에 도달하면 계산된 값을 차례대로 반환하며 최종 결과를 완성합니다.

문제의 논리적 구조를 직관적으로 표현하여 코드가 간결해지는 장점이 있지만, 종료 조건을 잘못 설계하면 프로그램이 멈추지 않는 위험도 있습니다.

728x90

'자료구조' 카테고리의 다른 글

연결 자료구조와 연결 리스트(2)  (0) 2025.10.22
연결 자료구조와 연결 리스트(1)  (0) 2025.10.21
순차 자료구조와 선형리스트  (0) 2025.10.20
알고리즘 기초  (0) 2025.09.26
자료구조란?  (0) 2025.09.24