1. 정적 변수 (Static Variable)
정적 변수는 프로그램이 실행되는 동안 메모리에 고정된 위치를 차지하며, 함수나 블록이 종료되더라도 값이 유지되는 변수를 말합니다.
이는 변수 선언 시 static 키워드를 사용하여 선언합니다.
예제 코드:
#include <stdio.h>
void counter() {
static int count = 0; // 정적 변수 선언 및 초기화
count++;
printf("현재 count 값: %d\n", count);
}
int main() {
counter(); // 첫 번째 호출
counter(); // 두 번째 호출
counter(); // 세 번째 호출
return 0;
}
- 정적 변수 선언 및 초기화:
- static int count = 0;
- count라는 정적 변수를 선언하고 0으로 초기화합니다. 이 변수는 counter 함수가 호출될 때마다 새로 생성되지 않고, 프로그램 종료 시까지 메모리에 유지됩니다.
- static int count = 0;
- 변수 값 증가 및 출력:
- count++;
- count의 값을 1 증가시킵니다.
- printf("현재 count 값: %d\n", count);
- 현재 count 값을 출력합니다.
- count++;
- 함수 호출:
- counter();
- counter 함수를 여러 번 호출하여 count 값의 변화를 확인합니다.
- counter();
출력 결과:
현재 count 값: 1
현재 count 값: 2
현재 count 값: 3
- counter 함수를 호출할 때마다 count 변수는 이전 호출에서의 값을 유지하고 있으며, 이는 정적 변수의 특징입니다. 일반적인 지역 변수와 달리, 정적 변수는 함수가 종료되더라도 값이 사라지지 않습니다.
보충 설명
- static int count = 0;은 단 한 번만 초기화됩니다.
- 함수가 끝나도 count의 값은 사라지지 않고 기억됩니다.
- 그래서 counter()를 다시 호출하면 이전 값에서 +1이 된 상태로 출력됩니다.
💡 참고: static 변수는 전역처럼 프로그램이 종료될 때까지 메모리에 존재하지만, 사용 범위(scope)는 지역입니다.
2. 구조체 (Structure)
구조체는 서로 다른 데이터 타입을 하나의 단위로 묶어주는 사용자 정의 데이터 타입입니다.
이를 통해 관련된 데이터를 하나의 변수처럼 관리할 수 있습니다. (예: 한 학생의 이름, 나이, 학점을 한 번에 표현)
예제 코드:
#include <stdio.h>
#include <string.h>
// 구조체 정의
struct Student {
char name[50];
int age;
float gpa;
};
int main() {
struct Student student1; // 구조체 변수 선언
// 구조체 멤버에 값 할당
strcpy(student1.name, "홍길동");
student1.age = 20;
student1.gpa = 3.75;
// 구조체 멤버 값 출력
printf("이름: %s\n", student1.name);
printf("나이: %d\n", student1.age);
printf("학점: %.2f\n", student1.gpa);
return 0;
}
- 구조체 정의:
- struct Student { ... };
- Student라는 이름의 구조체를 정의합니다. 이 구조체는 name, age, gpa라는 세 개의 멤버를 가집니다.
- struct Student { ... };
- 구조체 변수 선언:
- struct Student student1;
- Student 구조체 타입의 변수 student1을 선언합니다.
- struct Student student1;
- 구조체 멤버에 값 할당:
- strcpy(student1.name, "홍길동");
- student1의 name 멤버에 문자열 "홍길동"을 복사합니다.
- student1.age = 20;
- student1의 age 멤버에 값 20을 할당합니다.
- student1.gpa = 3.75;
- student1의 gpa 멤버에 값 3.75를 할당합니다.
- strcpy(student1.name, "홍길동");
- 구조체 멤버 값 출력:
- printf("이름: %s\n", student1.name);
- student1의 name 멤버 값을 출력합니다.
- printf("나이: %d\n", student1.age);
- student1의 age 멤버 값을 출력합니다.
- printf("학점: %.2f\n", student1.gpa);
- student1의 gpa 멤버 값을 소수점 둘째 자리까지 출력합니다.
- printf("이름: %s\n", student1.name);
출력 결과:
이름: 홍길동
나이: 20
학점: 3.75
- 구조체를 사용하면 서로 다른 데이터 타입의 변수를 하나의 단위로 묶어 관리할 수 있어 코드의 가독성과 유지보수성이 향상됩니다.
보충 설명
char name[50]; | 문자열을 저장하기 위한 문자 배열 (문자열은 배열로 표현함) |
strcpy() | 문자열 복사는 =가 아닌 strcpy() 사용 (C에서는 문자열은 포인터/배열이라 주소만 복사되므로) |
student1.name | 구조체 변수 안의 멤버 접근 (점 연산자 . 사용) |
💡 구조체를 활용하면 관련 정보를 하나의 단위로 관리할 수 있어 코드가 간결해지고 유지보수가 쉬워집니다.
3. 2차원 배열 (Two-Dimensional Array)
2차원 배열은 행과 열의 형태로 데이터를 저장하는 배열로, 표 형태의 데이터를 다룰 때 유용합니다.
int matrix[3][3];은 3행 3열의 정수 배열입니다.
예제 코드:
#include <stdio.h>
int main() {
int matrix[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// 2차원 배열 출력
for (int i = 0; i < 3; i++) { // 행을 반복
for (int j = 0; j < 3; j++) { // 열을 반복
printf("%d ", matrix[i][j]); // 현재 요소 출력
}
printf("\n"); // 행 출력 후 줄바꿈
}
return 0;
}
- 2차원 배열 선언 및 초기화:
- int matrix[3][3] = { ... };
- 3x3 크기의 정수형 2차원 배열 matrix를 선언하고 초기화합니다.
- int matrix[3][3] = { ... };
- 2차원 배열 출력:
- for (int i = 0; i < 3; i++) { ... }
- 행을 반복하는 루프입니다.
- for (int j = 0; j < 3; j++) { ... }
- 열을 반복하는 루프입니다.
- printf("%d ", matrix[i][j]);
- 현재 행(i)과 열(j)에 해당하는 배열 요소를 출력합니다.
- printf("\n");
- 한 행의 출력이 끝난 후 줄바꿈을 합니다.
- for (int i = 0; i < 3; i++) { ... }
출력 결과:
1 2 3
4 5 6
7 8 9
보충 설명
matrix[i][j] | i행 j열의 값을 의미 (행 먼저, 열 나중) |
중첩 for문 | i는 행, j는 열 → 반복문 2개로 2차원 배열 순회 가능 |
배열 초기화 | 중괄호 {}를 통해 각 행별로 그룹핑 |
💡 2차원 배열은 표, 행렬, 게임 맵, 좌표 처리 등에 유용하게 사용됩니다.