C - 식별자: 프로그래밍에서의 이름 부여 문门户
안녕하세요, 미래의 코딩 마법사 여러분! 오늘 우리는 C 프로그래밍의 흥미로운 여정을 시작할 것입니다. 특히 식별자에 대해 집중적으로 다룰 것입니다. 걱정하지 마세요. 코드를 한 줄도 적어본 적이 없더라도, 우리는 기초부터 함께 차근차근 배울 것입니다. 그러면 가상의 지팡이( 키보드)를 손에握고, 함께潜入해 보겠습니다!
C 식별자는 무엇인가요?
상상해 보세요. 당신이 사람이 가득한 방에 있고, 누군가를 부르고 싶을 때, 당신은 그 사람의 이름을 사용할 것입니다. 그렇죠? 프로그래밍의 세계에서도 식별자는 비슷한 목적을 가집니다. 그들은 우리 코드의 여러 요소들, 예를 들어 변수, 함수, 구조체에 부여하는 이름입니다. 이 이름들은 우리( 그리고 컴퓨터)가 프로그램 내에서 이 요소들을 식별하고 사용하는 데 도움을 줍니다.
왜 식별자가 중요한가요?
- 가독성: 좋은 식별자는 코드를 더 쉽게 이해할 수 있게 합니다.
- 유지보수성: 명확한 이름은 나중에 코드를 업데이트할 때 도움이 됩니다.
- 디버깅: 무언가 잘못되었을 때, 잘 지어진 식별자는 큰 도움이 될 수 있습니다!
간단한 예제를 보겠습니다:
int age = 25;
여기서 age
는 식별자입니다. 사람의 나이를 저장하는 변수에 부여한 이름입니다.
C 식별자의 이름 규칙
이제 학교에서 이름을 사용할 때 정해진 규칙이 있을 것 같은데( 공식 문서에는 별명을 사용할 수 없습니다!), C는 식별자를 이름 지을 때 규칙을 가지고 있습니다. 이를 하나씩 풀어보겠습니다:
- 허용된 문자:
- 소문자( a-z)
- 대문자( A-Z)
- 숫자( 0-9)
- 밑줄( _)
-
첫 문자: 반드시 문자나 밑줄로 시작해야 합니다. 숫자로 시작할 수 없습니다.
-
대소문자 구분:
age
,Age
,AGE
는 모두 다른 식별자입니다. -
키워드 사용 금지: C 키워드를 식별자로 사용할 수 없습니다.
-
길이: 공식적인 제한은 없지만, 대부분의 C 컴파일러에서는 첫 31자가 중요합니다.
일반 이름 관용어
strikt한 규칙은 아니지만, 코드를 더 읽기 쉽게 만들어주는 관용어가 있습니다:
- 변수 이름에 소문자 사용:
int student_count;
- 상수 이름에 대문자 사용:
#define MAX_SIZE 100
- 함수 이름에 camelCase 사용:
void calculateTotal();
C 식별자의 예제
valid하고 invalid한 식별자를 몇 가지 보겠습니다:
유효한 식별자 | 무效한 식별자 | 설명 |
---|---|---|
age |
2ndPlace |
숫자로 시작할 수 없습니다 |
_count |
my-variable |
하이픈은 허용되지 않습니다 |
firstName |
float |
float 은 키워드입니다 |
MAX_SIZE |
$total |
dollor 기호는 허용되지 않습니다 |
player1 |
user name |
공백은 허용되지 않습니다 |
이제 이를 실제로 적용해 보겠습니다:
#include <stdio.h>
#define MAX_SIZE 100 // 유효: 상수에 대문자 사용
int main() {
int age = 25; // 유효: 변수에 소문자 사용
char _initial = 'J'; // 유효: 밑줄로 시작할 수 있습니다
float height_in_cm = 175.5; // 유효: 밑줄이 허용됩니다
// 무效한 예제(에러를 피하기 위해 주석 처리):
// int 2ndPlace = 2; // 무效: 숫자로 시작
// float my-height = 175.5; // 무效: 하이픈 포함
// char float = 'F'; // 무效: 'float'은 키워드
printf("Age: %d\nInitial: %c\nHeight: %.1f cm\n", age, _initial, height_in_cm);
return 0;
}
이 코드를 실행하면 다음과 같은 결과를 보게 됩니다:
Age: 25
Initial: J
Height: 175.5 cm
이 프로그램의 각 식별자는 특정 목적을 가지고 있어 코드를 쉽게 이해하고 유지할 수 있게 합니다.
C 식별자의 범위
이제 좀 더 고급 내용을 이야기해 보겠습니다. 식별자의 "가시성"을 뜻하는 범위에 대해 이야기하겠습니다.
범위 유형
-
블록 범위: 블록(
{}
로 감싸인) 내에서 선언된 변수는 해당 블록 내에서만 가시입니다. - 파일 범위: 모든 함수 외부에서 선언된 변수는 파일 전체에서 가시합니다.
- 함수 범위: 함수 내의 레이블은 해당 함수 전체에서 가시합니다.
- 함수 프로토타입 범위: 함수 프로토타입의 매개변수는 프로토타입의 끝까지 가시합니다.
이를 실제로 보겠습니다:
#include <stdio.h>
int globalVar = 10; // 파일 범위
void exampleFunction() {
int localVar = 20; // 블록 범위
printf("Inside function: globalVar = %d, localVar = %d\n", globalVar, localVar);
}
int main() {
printf("In main: globalVar = %d\n", globalVar);
// printf("localVar = %d\n", localVar); // 이는 에러를 일으킬 것입니다
{
int blockVar = 30; // 블록 범위
printf("Inside block: blockVar = %d\n", blockVar);
}
// printf("blockVar = %d\n", blockVar); // 이는 에러를 일으킬 것입니다
exampleFunction();
return 0;
}
이 프로그램은 다양한 범위를 보여줍니다:
-
globalVar
는 어디서든 접근할 수 있습니다. -
localVar
는exampleFunction
내에서만 접근할 수 있습니다. -
blockVar
는main
함수의 블록 내에서만 접근할 수 있습니다.
다양한 유형의 C 식별자 예제
마지막으로 다양한 유형의 식별자를 보여주는 종합 예제를 보겠습니다:
#include <stdio.h>
#include <string.h>
#define MAX_STUDENTS 50 // 상수 식별자
// 함수 프로토타입
void printStudentInfo(char name[], int age);
// 구조체 정의
struct Student {
char name[50];
int age;
float gpa;
};
int main() {
int studentCount = 3; // 변수 식별자
struct Student class1[MAX_STUDENTS]; // 배열 식별자
// 학생 데이터 초기화
strcpy(class1[0].name, "Alice");
class1[0].age = 20;
class1[0].gpa = 3.8;
strcpy(class1[1].name, "Bob");
class1[1].age = 22;
class1[1].gpa = 3.5;
strcpy(class1[2].name, "Charlie");
class1[2].age = 21;
class1[2].gpa = 3.9;
// 학생 정보 출력
for (int i = 0; i < studentCount; i++) {
printStudentInfo(class1[i].name, class1[i].age);
}
return 0;
}
// 함수 정의
void printStudentInfo(char name[], int age) {
printf("Student: %s, Age: %d\n", name, age);
}
이 예제에서 우리는 다양한 유형의 식별자를 사용했습니다:
- 상수 식별자:
MAX_STUDENTS
- 함수 식별자:
main
,printStudentInfo
- 구조체 식별자:
Student
- 변수 식별자:
studentCount
,name
,age
,gpa
- 배열 식별자:
class1
각 식별자는 프로그램의 기능적이고 가독성 있는 부분을 만들기 위해 중요한 역할을 합니다.
그렇게 해서 우리는 C 식별자의 세계를 여행했습니다. 좋은 식별자를 선택하는 것은 마법의 선택과 같습니다. 코드 작성에서 큰 차이를 만들 수 있습니다. 연습을 계속하고, 호기심을 유지하면, 당신은 곧 C 프로그래밍의 마법사가 될 것입니다. 행복하게 코딩하세요!
Credits: Image by storyset