본문 바로가기

프로그래밍/C

(10)
[C] 힘숨찐 자료형, 열거형 들어가며 오늘은 열거형에 대해 공부할 생각이다. 왜 이렇게 배우는 순서가 들쭉날쭉한지 궁금한가? 안 알려줄 것이다. 내 맘이다. 히히. 힘을 숨긴 찐따 ValueA, ValueB, ValueC라는 정수형 상수를 선언한다면 두세 개까지는 뭐 그럭저럭 괜찮지만 개수가 많아지면 입에서 야발 소리가 절로 나오지 않을 수가 없다. const int ValueA = 1; const int ValueB = 2; const int ValueC = 3; · · · · · 이러한 상황에서 열거형(enumeration)을 사용하여 정수형 상수를 좀 더 편하게 정의할 수 있다. 다음처럼 말이다. 열거형은 정의만 한다고 해서 사용할 수가 없다. 따라서 열거형도 변수로 선언해서 사용한다. enum (열거형 이름) (변수 이름);..
[C] 자료형을 설계하다, 구조체 들어가며 C++에서는 클래스가 있다면 C에서는 구조체가 있다. 뭔가 순서가 좀 바뀐 것 같지만 아무튼 기분 탓이다. 구조체도 어디서 많이 들어만 봤지 뭐하는 놈인지 감도 잘 안 잡히고 어디다 써먹는지도 모르는 게 우리의 현실이다. 어쨌든 이번에도 구조체를 박살 내 보도록 하자. 사용자 정의 타입, 구조체 구조체(Structure Type). 사용자가 C언어의 기본 타입을 가지고 새롭게 정의할 수 있는 자료형이라고 말할 수 있다. 구조체의 정의가 그렇다고 한다면, 그럼 어디다가 써먹을 수 있는가? 구조체는 기본 타입(자료형)만으로는 나타낼 수 없는 복잡한 데이터를 표현할 수 있다. 예를 들어, 배열이 같은 타입의 변수 집합이라고 한다면 구조체는 다양한 타입의 변수 집합을 '하나'의 타입으로 나타낸 것이다...
[C] 이 메모리는 무료로 할당해 줍니다. (실전편) 들어가며 오늘은 필자가 주로 애용하는 유튜브 채널을 추천해 줄 생각이다. 공부를 하거나 코딩을 하거나 이렇게 블로그를 운영할 때 적막함을 한 층 덜어준 아주 고마운 채널이다. 소리를 적당히 줄이고 배경음이나 백색소음처럼 깔아 두면 잔잔한 음악이 꽤나 괜찮은 채널이다. 여러분도 한 번 애용해 보는 것을 추천한다. 실전 박치기 전 글에서는 메모리 할당과 해제에 대해서 알아보았다. 그렇다고 딱히 뭔가 실제로 사용해보지는 않았다. 따라서 오늘은 여러 코드를 가지고 해석해 보며 실전적으로 알아볼 예정이다. 아무튼 다음 코드를 보고 해석해 보라. #include #include // malloc, free 함수가 선언되어 있는 헤더 int main() { int num1 = 20; int* numptr1; nump..
[C] 컴퓨터의 산와머니, 동적 할당 (Ver. c) (개념편) 들어가며 들어가기에 앞서 본 필자는 대부업에 관해서는 잘 모르고 대출과 금융권에 대해서 심도 있는 소견을 가진 사람이 아니니 이점 참고하며 글을 읽어나가길 부탁하겠다. 전 포스트에서는 메모리에 대해서 알아보았다. 그중에서도 함수의 호출과 관련이 있는, 아무튼 프로그램이 실행되는 것과 아주 밀접하게 관련이 있는 '스택 영역(Stack Segment)'에 대해서 알아보았다. 오늘은 메모리의 여러 영역 중에서도 사용자가 직접적으로 관여하여 관리할 수 있는, 그리고 해야만 하는 영역인 '힙 영역(Heap Segment)'에 대해서 알아볼 예정이다. 메모리계의 산와머니, 동적 할당 '힙 영역(Heap Segment)'의 메모리 크기는 프로그램이 실행되는 도중인 런 타임(Run Time)에 사용자가 직접 결정하게 ..
[C] '메모리' 잘 모르는 사람, 앞으로 나오시오. (기본편) 들어가며 '동적 할당'이라고 들어본 적 있는가? 프로그래밍을 처음 배우는 입장에서의 이 단어는 매우 생소하기 그지없다. 그렇다고 필자라고 해서 익숙한가? 전혀 그렇지 않다. 급하게 뒤로 가기 버튼이 마려워지는가? 같이 배워가는 입장에서 너무 그러지 말길 바란다. 그만큼 이 개념을 처음 접하는 사람의 입장과 시각에 입각해 바라볼 수 있기에 더 쉽게 설명할 수 있지 않겠는가? 그렇기에 신뢰해주길 바란다. 아 믿어달라고. 메모리는 어떻게 생겨먹었는가 메모리(Memory). 듣기만 많이 들어봤지, 구조나 구성이나 우린 그런 거 아무것도 모른다. 알아도 일단 아무튼 모른다고 가정하자. 프로그램이 실행되기에 앞서, 프로그램은 메모리에서 로드(Load, 불러오기)되어야 한다. 또한, 프로그램에서 사용되는 변수들도 어..
[C] 매크로와 매크로 함수 - 2 들어가며 전 시간에는 끔찍한 매크로 코드들의 향연으로 먹은 식사가 살짝 불편하지 않았던가? 오늘은 그런 걱정을 하지 않아도 된다. 왜냐하면 식사를 하지 않고 이번 글을 보길 권장하기 때문이다. 이미 식사를 하고 온 사람들은 가까운 병원에서 위장을 세척한 후 공복 상태에서 이 글을 정독하기 바란다. 매크로를 연속으로 정의하는 방법과 사용 이 글을 보고 있는 독자 여러분은 지금까지 숫자 한 개나 코드 한 줄을 매크로로 정의하여 사용해오지 않았는가? 사실 이 글은 나만 보고 있기 때문에 그렇게 사용해 온 것으로 간주할 것이다. 전적으로 내 마음이니 그저 따라오길 바란다. 각설하고, 그렇다면 여러줄을 매크로로 만든다면 상당히 편할 것으로 예상이 된다. #define INFO_FATALBLOW (코드 1)\ (코..
[C]매크로와 매크로 함수 - 1 들어가며 매크로란 무엇일까. 게임을 자주 해본 사람이나 접해본 사람들은 매크로를 다음과 같이 이해하는 경우가 많다. "매크로는 자동사냥 같은 거 말하는 거 아냐?" 그것에 관한 것은 잘 모르겠고, 나는 프로그래밍에 관해서 얘기할 예정이다. 매크로(Macro) #define (매크로 이름) (설정할 값) 먼저 쉽게 말하자면 #define 지시자를 사용하여 값을 다른 이름으로 정의한다. 이름을 정하는 방법은 변수와 동일하며, 관습적으로 매크로의 이름은 대문자를 사용한다. 뭔소린지 모르겠다고? 나도 그렇다. 함께 알아보는 시간을 오붓하게 갖도록 하자. 사직서의 활용 자 다음의 코드를 보자. int Damage(int atk) { if(100
[C] 상수와 리터럴 상수(a constant) 상수는 말 그대로 '변하지 않는 값'을 의미한다. 변수는 선언 후 그 값을 계속 바꿀 수 있지만, 상수는 처음 선언할 때만 값을 초기화 할 수 있고, 이후엔 초기화할 수 없다. 리터럴(literal)과 표기 방법 리터럴을 직역하면 '문자 그대로'라는 뜻인데, '그 값 자체'를 의미한다. printf("%d\n", 10); // 10 - 정수 리터럴 printf("%f\n", 0.1f); // 0.100000 - 실수 리터럴 printf("%c\n", 'a'); // a - 문자 리터럴 printf("%s\n", "Hello, world!"); // Hello, world! - 문자열 리터럴 위 코드와 같이 값을 변수에 저장하지 않고 바로 출력하는 것. 소스 코드 상에서 출력값을..
[C]포인터의 이해와 활용-2 다양한 자료형의 포인터 선언 const int num = 10; // int형 상수 const int *numptr; // int형 상수를 가리키는 포인터 // int const *numptr과 같은 의미다. numptr = # *numptr = 20;// 컴파일 에러 발생. num이 상수이므로 역참조하여 값을 변경할 수 없음. 위 코드들에서는 'int형' 포인터들을 선언하였다. 하지만 포인터에는 그보다 훨신 다양한 자료형들이 있는데, 심지어 'void'형 자료형도 있다. #include int main() { long long *numptr1; // long long형 포인터 변수 선언 float *numptr2; // float 형 포인터 변수 선언 char *cptr; // char 형 포인..
[C]포인터의 이해와 활용-1 들어가며 자, 블로그를 시작하고 거의 처음 쓰는 글이다. 많이 미숙하고 오류가 있는 부분들도 있을 수도 있고 그날 점심으로 스파게티를 거하게 먹었음을 추리할 수도 있다. 하지만 참고 양해 바란다. 어차피 나 혼자 보는 일기장이기 때문이다. 각설하고, 방학을 의미있게 보내기 위해 C언어의 꽃, 포인터를 학습하려고 한다! &(참조 연산자, 주소 연산자) 변수의 메모리 주소를 구할 때는 변수의 이름 앞에 '&'를 사용한다. int main() { int num = 0; printf("%p \n", &num); //이때 저 &num은 num이 저장된 메모리 공간 상의 주소값을 가리킨다. //다시 한번 말하지만 '가리키는 것'이다. return 0; } *(포인터 연산자) 포인터 변수를 선언할 때는 포인터의 이름..