본문 바로가기

C언어31

[알고리즘] C언어로 익히는 자료구조 및 알고리즘 총정리 C언어로 익히는 자료구조 및 알고리즘 총정리 공학 관련 전공자라면 피할 수 없는 알고리즘, 졸업하고 나서도 치뤄야 하는 코딩 테스트가 있습니다. 아무리 거대해 보이는 산이라도 기초 체력이 있다면 충분히 정상에 오를 수 있듯이, 알고리즘 문제를 해결할 때도 기본을 이해하는 것이 가장 중요할 것입니다. 저도 최근에 알고리즘 지식을 꼼꼼히 복습해야하는 상황히 생겨서.. 예전에 공부했던 이지스 퍼블리싱의 '자료구조와 함께 배우는 알고리즘 입문(C언어편)'와 오렌지 미디어의 '윤성우의 열혈 자료구조' 책을 가지고 정리하는 시간을 가졌습니다. 이 곳에 정리한 글을 하나씩 연재할 계획입니다. 포스팅하는대로 링크를 활성화하겠습니다. 1. 기본 알고리즘 - 자료구조와 알고리즘 개념 - 시간복잡도, 공간복잡도란? - 빅-.. 2020. 9. 29.

[ C ] 전처리기 이해하기5_매크로 연산자 #, ## 정의/예제 C언어 문법 매크로 연산자 #, ## 정의/예제 아래의 매크로 문장은 어떤 결과를 만들까요? 매크로 함수: #define STRING_NAME(A, B) "A의 이름은 B이다" 매크로 문장: STRING_NAME(하헤호후, 아무개) 예상 결과: 하헤호후의 이름은 아무개이다. 진짜 결과: X (문자열 안에서는 매크로의 매개변수의 치환이 발생하지 않기 때문) 이런 상황에서 매개변수 치환이 이루어지게 하는 연산자, #이 있습니다. ■ # 연산자: 치환 #는 치환의 결과를 문자열로 구성하는 연산자입니다. #define STRING_NAME(ABC) #ABC STRING_NAME(랄랄라)라는 문장은 선행처리기에 의해 문자열 "랄랄라"로 치환됩니다. 또한 나란히 선언하면 하나의 문자열로 간주됩니다. 그래서 아래 문.. 2020. 7. 28.

[ C ] 전처리기 이해하기1_전처리기(Preprocessor)란? 정의/용도, 지시문 종류 전처리기(Preprocessor)란? 정의/용도 소스 파일에서 실행 파일로 만들어지려면 다음과 같은 과정을 거쳐야 합니다. 선행처리 거친 소스 파일이란 무엇일까요? 사실 소스 파일의 형태가 그대로 유지되기 때문에 그냥 소스 파일입니다. 선행처리기가 하는 일은 선행처리 명령문대로 소스 코드의 일부를 수정합니다. 선행 처리 명령문은 #으로 시작하며, 세미콜론(;)을 붙이지 않습니다. #define PI 3.14 이런 명령문이 삽입되어 있다면 선행처리된 소스 파일에서는 PI를 3.14로 인식합니다. #include 이제껄 자주 작성했던 #include 도 # 문자로 시작하는 선행처리 명령문입니다. stdio.h 파일의 내용을 그 파일에 옮겨놓다는 의미입니다. ■ 전처리기 지시문 종류 #include #defi.. 2020. 7. 27.

[ C ] 파일 입출력 이해하기5_파일 위치 서식자란? fseek, ftell 함수 파일 위치 서식자란? fseek, ftell 함수 FILE 구조체의 멤버 중에는 파일의 위치 정보를 저장하고 있는 멤버가 있습니다. '파일 위치 지시자'라고 부르는 이 멤버는 파일이 처음 개방되면 파일의 맨 앞부분을 가리킵니다. 그래서 파일의 중간이나 마지막에서 데이터를 읽거나 쓰고 싶다면 이 '파일 위치 지시자'를 이동시켜야 합니다. fgets 함수 호출을 통해서 파일에서 20바이트의 문자열을 읽어 들었다면 '파일 위치 지시자'는 20바이트 뒤를 가리키게 됩니다. ■ 파일 위치 지시자의 이동 fseek #include int fseek(FILE * stream, long offset, int wherefrom); stream으로 전달된 파일 위치 지시사를 wherefrom부터 offset만큼 이동시킨다.. 2020. 7. 25.

[ C ] 파일 입출력 이해하기2_파일의 개방모드(Mode) C언어 문법 파일의 개방모드(Mode) fopen 함수의 두 번째 인자로 "wt"와 "rt"를 전달하여 스트림을 형성했습니다. 사실 스트림의 종류는 더 다양합니다. 기본적으로 두 가지 기준이 있는데 하나씩 보겠습니다. 기준 1: 읽기 위한 스트림? vs 쓰기 위한 스트림? 모드(Mode) 스트림의 성격 파일이 없으면? r 읽기 에러 w 쓰기 생성 a 덧붙여 쓰기 생성 r+ 읽기/쓰기 가능 에러 w+ 읽기/쓰기 가능 생성 a+ 읽기/덧붙여 쓰기 가능 생성 위 표를 참조하여 만들고자 하는 스트림의 특성에 맞춰 '파일의 개방 모드'를 선택하면 됩니다. 그 조합이 fopen 함수의 두 번재 인자가 됩니다. 모드의 +는 읽기, 쓰기가 모두 가능한 스트림의 형성을 의미합니다. 더 좋은 모드라고 생각할 수 있지만 수.. 2020. 7. 25.

[ C ] 파일 입출력 이해하기1_스트림 생성, 소멸, 파일 읽는 함수_fopen, fclose, fagets 스트림 생성, 소멸, 파일 읽는 함수_fopen, fclose, fagets 데이터의 이동 경로가 되는 다리를 스트림이라고 했습니다. 기본적인 스트림 개념은 아래 글에서 이미 다루었습니다. 스트림과 데이터의 이동 ■ 스트림 생성 함수 FILE * fopen(const char * filename, const char * mode); 위 함수의 첫 번째 인자로는 스트림을 형성할 파일의 이름, 두번째 인자로는 형성할 스트림 종류에 대한 정보를 문자열로 전달합니다. 그러면 이 함수는 해당 파일과의 스트림을 형성하고 스트림 정보를 FILE 구조체 변수에 담아서 그 변수의 주소 값을 반환합니다. 여기서 FILE 구조체의 포인터는 파일을 가리키기 위한 용도로만 사용되었습니다. 그래서 FILE 구조체 변수의 멤버에 .. 2020. 7. 25.

[ C ]커스텀 자료형 이해하기5_공용체(Union Type)이란? 정의/사용하는 이유 C언어 공용체(Union Type)이란? 정의/사용하는 이유 ■ 공용체 정의공용체(Union Type)을 뜻하는 Union은 조합, 통합을 의미합니다. 무엇에 관한 '통합'일까요? 구조체와 공용체의 차이를 보면 쉽게 이해할 수 있습니다. 아래 코드를 확인해보겠습니다. #include typedef struct structBox { int member1; int member2; double member3; } SBox; typedef union unionBox { int member1; int member2; double member3; } UBox; int main(void) { SBox sbox; UBox ubox; printf("%d \n", sizeof(SBox); // 결과 16 printf("%.. 2020. 7. 24.

[ C ]커스텀 자료형 이해하기3_구조체 배열, 포인터 C언어 문법 구조체 배열, 포인터 ■ 구조체 배열 정의 및 선언 구조체 변수를 여러개 사용해야 할 때는 구조체 배열을 선언하면 됩니다. 선언방법은 일반 배열과 동일합니다. struct point pointArr[3]; // 크기 3인 point형 구조체 배열 선언 그럼 다음과 구조로 배열이 할당됩니다. ■ 구조체 배열 초기화 구조체 배열을 선언과 동시에 초기화할 때는 배열의 길이만큼 중괄호를 통해서 초기화할 값을 명시합니다. struct point pointArr[3] // 크기 3인 point형 구조체 배열 선언 { {3, 4} // 첫 번째 요소의 초기화 {2, 1} // 두 번째 요소의 초기화 {5, 9) // 세 번째 요소의 초기화 }; ■ 구조체 변수와 포인터 포인터도 구조체의 멤버가 될 수 있.. 2020. 7. 24.

[ C ]메모리 이해하기12_메모리 정리 C언어 문법 메모리 정리 참고 자료: 포프 C 언매니지드 프로그래밍 강의 241 ※ 마무리 강의 241번 내용 그대로 딕테이션 했습니다. "섹션 9 레지스터, 스택&힙, 동적 메모리, 다중포인터 (강의 No. 224-240)" 에 해당하는 정리 강의이며, 저는 "메모리 이해하기" 시리즈에 그 내용을 실었습니다. 하지만 저는 강의의 모든 내용을 다루지 않았기 때문에 이번 글에는 제가 언급하지 않은 부분이 있습니다. ■ 메모리 종류 정리할께요. 여기까지가 C에서 반드시 배워야 하는 기술적 기타 등등 전부를 마무리 짓는거예요. 그 뒤에 이런거 응용해서 사용하는 법, 새로운 표준에서 몇 가지 것들을 배우긴 배울꺼에요. 여기서 배운거 가장 마지막에 메모리 관리 같은걸 남겨둔 이유는 포인터는 처음 들어가도 힘든데 .. 2020. 7. 23.

[ C ] 문자열 함수 이해하기5_표준 입출력과 버퍼_버퍼링 하는 이유/fllush 함수/입력 버퍼 비우기 C언어 표준 입출력과 버퍼_버퍼링 하는 이유/fllush 함수/입력 버퍼 비우기 ■ 입출력 버퍼(buffer)의 개념 우리가 이제껏 공부해 온 입출력 함수들은 ANSI C의 표준에서 정의된 함수입니다. 이런 표준 입출력 함수를 통해서 데이터를 입출력하는 경우, 해당 데이터들은 운영체제가 제공하는 '메모리 버퍼'를 중간에 통과하게 됩니다. 여기서 말하는 '메모리 버퍼'는 데이터를 임시로 모아두는(저장하는) 메모리 공간입니다. 위 그림을 보면 키보드를 통해 입력되는 데이터는 일단 입력버퍼에 저장된 다음에(= 버퍼링 된 다음에) 프로그램에서 읽혀지는 것을 알 수 있습니다. 즉 fgets 함수가 읽어 들이는 문자열은 입력 버퍼에 저장된 문자입니다. 그럼 언제 입력 버퍼에 데이터가 들어가는 걸까요? 바로 엔터 키.. 2020. 7. 22.

[ C ] 문자열 함수 이해하기4_문자열 단위 입출력 함수_puts, fputs, gets, fgets C언어 문자열 단위 입출력 함수 puts, fputs, gets, fgets ■ 문자열 출력 함수: puts, fputs 문자열을 출력할 때 일반적으로 두 함수를 사용합니다. #include int puts(const char * s); int fputs(const char * s, FILE * stream); // 실패 시 EOF 반환 다음 코드를 통해서 두 함수의 차이를 찾아봅시다. int main(void) { puts("How are you?"); fputs("Good,Thanks", stdout); printf("\n"); return 0; } puts 함수는 출력의 대상이 stdout으로 결정되어 있기 때문에 매개변수로 출력할 문자열만 넣으면 됩니다. fputs 함수는 두 번째 인자를 통해서 .. 2020. 7. 21.

[ C ] 문자열 함수 이해하기3_문자 단위 입출력 함수_putchar, fputc, getchar, fgetc / EOF 이란 C언어 문법 문자 단위 입출력 함수_putchar, fputc, getchar, fgetc, EOF ■ 문자 출력 함수: putchar, fputc 모니터로 하나의 문자를 출력할 때 일반적으로 다음 두 함수를 사용합니다. #include int putchar(int c); int fputc(int c, FILE * stream); /* 함수 호출 실패 시 EOF 반환 */ putchar 함수는 인자로 전달된 문자를 stdout으로 표현되는 표준 출력 스트림으로 전송하는 함수입니다. fputc 역시 같은 역할이며, 두번째 인자로 스트림을 지정할 수 있다는 차이가 있습니다. ■ 문자 입력 함수: getchar, fgetc 키보드로 하나의 문자를 입력할 때 일반적으로 다음 두 함수를 사용합니다. #includ.. 2020. 7. 21.

[ C ] 포인터 이해하기11_포인터 개념 정리 / 용도 / 복습 또 복습하기 C언어 포인터 개념 정리 / 용도 / 복습 또 복습하기 복습 또 복습합시다. ■ 포인터의 용도 1 큰 데이터를 매개변수로 전달할 수 있습니다. 배열 같은 경우 데이터를 하나하나씩 복사하려면 힘듭니다. const 배열에 요소가 10개정도 있으면 괜찮지만 요소가 한 10만개라면 일일히 복사하는 것은 정말 시간 낭비입니다. 그래서 배열을 매개변수로 전달하여 첫 번째 요소의 주소를 전달하므로 쉽게 데이터를 처리할 수 있게 됩니다. 2 반환 값이 둘 이상일 때 사용할 수 있습니다. C언어에서는 반환값 2개를 return 할 수 없습니다. 따라서 반환해야할 값이 여러 개 있다면 매개변수로 포인터를 넣으면 됩니다. 그럼 함수 안에서 원본을 직접 변경할 수 있습니다. 이런 변수를 인앤아웃(in&out) 변수라고 합니다.. 2020. 7. 21.

[ C ] 포인터 이해하기10_다중, 이중 포인터란? / 다중 포인터 사용하는 이유 다중, 이중 포인터란? / 다중 포인터 사용하는 이유 ■ 이중 포인터란? 포인터는 무엇인가요? 주소를 저장하는 변수입니다. 그럼 그 번수의 주소를 또 저장할 수 있을까요? 10이라는 데이터가 저장되어 있다고 합시다. 저장된 곳의 주소가 있겠지요. 그 주소가 또 다른 곳에 저장되어 있다면요? 다음과 같은 그림이 그려지겠네요. 주소를 저장한 변수의 주소는 어디에 저장할까요? 주소를 저장하니까 포인터네요. 그럼 그 포인터의 데이터형은 뭔가요? 그 역시 어떤 것의 주소이므로 포인터입니다. 이런 식으로 포인터 변수의 주소를 저장하는 변수를 이중 포인터라고 합니다. int num = 10; // int형 변수 num 선언하고 10대입 int* p = # // int형 포인터 p선언하고 num 주소값 대입 i.. 2020. 7. 21.

[ C ] 포인터 이해하기9_포인터 배열, 2차원 배열이란? 예제코드로 개념이해하기 포인터 배열이란? 2차원 배열이란? 예제로 개념이해하기 ■ 포인터 배열 포인터도 변수이기 때문에 포인터를 저장하는 배열도 있습니다. 그럼 포인터 배열은 어떻게 선언해야 할까요? 일반적인 배열은 아래와 같이 선언합니다. 예) int nums[3]; // 자료형 배열명[요소 수] int형 데이터를 넣을 수 있는 배열이지요. 그럼 포인터를 저장하는 배열은 데이터형을 포인터형으로 하면 됩니다. 예) int* num_pointers[3]; int*를 담는 배열입니다. 포인터 배열 [ 예제 코드 ] int nums1[3] = { 11, 22, 33 }; int nums2[1] = { 90 }; int nums3[4] = { 36, 25, 45, 78 }; int* num_pointers[3]; num_pointer.. 2020. 7. 20.

[ C ] 포인터 이해하기8_함수 포인터 쉽게 읽는 방법 함수 포인터 쉽게 읽는 방법 ■ 함수의 포인터 읽는 순서 함수 포인터 읽는 방법을 오른쪽-왼쪽으로 읽는다고 Right-Left Rule이라고도 합니다. 사실 영어권에서 통하는 rule이라 한국어로는 어순이 다르지만 한 번 알아두시면 편하니 천천히 익혀보시기 바랍니다. 아래의 함수 포인터를 읽어봅시다. double (*func) (double, double) ' 변수 func는 두 개의 double 형 매개변수를 받고 double 형을 반환하는 함수의 포인터입니다. ' 라고 읽으면 되는데, 읽는 순서를 아래 그림을 통해 알아봅시다. ■ 함수의 포인터 읽는 연습하기 ( 답은 드래그하면 확인할 수 있습니다.) double (*sort_arr) (double, double, double) 변수 func은 dou.. 2020. 7. 20.

[ C ] 포인터 이해하기7_함수 포인터란? 함수를 포인터에 저장할 수 있을까? 함수 포인터란? 함수 포인터 선언 방법 ■ 함수 포인터 개념 어셈블리어에서 어떤 함수를 호출하면 사실상 그 함수의 주소로 이동합니다. 함수의 주소는 컴파일 중 이미 정해지므로, 호출 시 실행됩니다. 물론 함수에서 반환할 때 돌아가야 하는 '호출자' 처럼 실행 중에도 바뀌는 코드도 있습니다. 그럼 이제까지 함수를 어떻게 호출했나요? 그렇죠. 함수의 이름을 사용했습니다. 배열의 이름이 배열의 시작주소 값을 의미하듯. 함수의 이름도 함수가 저장된 메모리 공간의 주소 값을 의미합니다. 이러한 함수의 주소 값을 저장하는 포인터 변수를 '함수 포인터'라고 합니다. ■ 함수 포인터 선언 그럼 함수 포인터 선언은 어떻게 해야할까요? operator라는 함수를 cal라는 함수의 매개변수로 사용한다고 할 때 다음과 같은 .. 2020. 7. 20.

[ C ] 포인터 이해하기6_void 포인터 개념 / 활용도 void 포인터 개념 / 활용도 자료형이 정해지지 않은 포인터를 void 포인터라고 합니다. 기본적으로 C언어는 자료형이 다른 포인터끼리 메모리 주소를 저장하면 컴파일 에러가 뜨지만 void 포인터는 자료형이 정해지지 않기 때문에 모든 자료형의 포인터를 저장할 수 있습니다. 함수, void 포인터 다 가능합니다. 그래서 void 포인터는 범용 포인터라고 합니다. int main() { int num1 = 10; int *numPtr1 = &num1; void *ptr; // void 포인터 선언 // 포인터 자료형이 달라도 컴파일 경고가 발생하지 않음 ptr = numPtr1; // void 포인터에 int 포인터 저장 // 포인터 자료형이 달라도 컴파일 경고가 발생하지 않음 numPtr1 = ptr; .. 2020. 7. 19.

[ C ] 포인터 이해하기2_참조와 역참조/ 역 참조 연산자 * 참조와 역참조/간접연산자/ 역 참조 연산자 * 포인터는 데이터가 저장된 주소값을 가리킵니다. 이것을 참조라고 합니다. 그럼 역 참조란 무엇일까요? 데이터가 저장된 주소로 가서 값에 접근하는 것을 말합니다. 값에 직접 접근하는게 아니라 주소를 이용해 간접적으로 접근합니다. 그래서 간접(indirect) 연산자라고도 합니다. 이제까지 함수에서 매개변수를 통해 인자를 전달하는 등 모든 데이터를 복사해서 썼다면 '역 참조'를 하면 원본에 접근가능합니다. 즉, 컴퓨터 구조에서(CPU든, 메모리든) 데이터를 오랫동안 메모리에 저장할 수 있습니다. 1 포인터가 저장하고 있는 메모리 위치로 간다 2 그곳에 저장된 값에 접근한다. (= 포인터가 가리키는 값에 접근하다) 역 참조 연산자 * ※ 곱하기.. 2020. 7. 18.

[ C ] 포인터 이해하기1_포인터 변수란?/선언 방법 / & 연산자 포인터 변수란?/선언 방법 / & 연산자 C언어는 하드웨어와 친합니다. 그래서 메모리에 접근할 수 있습니다. 이 점을 양날의 검처럼 잘 활용하면 강력한 일을 할 수 있고, 사고를 칠 수 있으니 잘 사용해야 합니다. 그럼 C언어는 어떻게 메모리에 접근할 수 있을까요? 바로 포인터를 이용하여 메모리에 직접 접근합니다. 이해를 위해 일단 변수 num1 에 데이터 10을 대입했다고 가정하겠습니다. 아래와 같은 그림이 그려지겠지요. int형 변수 num1은 Ox12FF76(주소)에 할당되어 있습니다. 그럼 코드상으로 어떻게 주소값을 알아낼 수 있을까요? 바로 주소 연산자 &( 비트 연산자 & 아님 ) 를 사용하면 됩니다. &는 피연산자의 주소 값을 반환하는 연산자입니다. 그래서 num1이란 변수가 있으면 &num.. 2020. 7. 17.

[ C ] 메모리 이해하기11_동적 메모리의 소유권 문제 동적 메모리의 소유권 문제 메모리에서 소유권 문제는 어떤 의미일까요? 바로 이미 할당된 메모리를 누가 해제를 해줘야 하는지에 관한 문제입니다. 해제는 꼭 소유주가 동적으로 할당한 메모리를 책임지고 해제로 마무리해야 합니다. 비소유자가 해제해도 문제입니다. 그럼 소유주란 누구일까요? 바로, 메모리를 생성한 함수입니다. 실제로 아래 함수을 호출 시 생기는 문제는 호출자가 이 함수를 호출할 때 함수 내부에서 새 메모리가 할당하여 반환한다는 사실을 어떻게 알아낼 수 있습니까? const char* combine_string(const char* a, const char* b) { void* str; char* p; /* a와 b의 길이 및 두 길이를 더한 값을 보관한 변수 생략 */ str = malloc(si.. 2020. 7. 17.

[ C ] 메모리 이해하기9 _realloc()의 메모리 누수 문제, 해결책은? C언어 메모리 이해하기9 _realloc()의 메모리 누수 문제 / 해결책 / malloc() + memcpy() +free() 먼저 realloc() 함수 개념을 이해하려면 이전 글을 읽어보세요. realloc() 함수란? void* realloc(void* ptr, size_t new_size); realloc() 에서는 메모리 누수가 날 수 있습니다. 메모리 누수가 생기는 예 void* nums; nums = malloc(SIZE); nums = realloc(nums, 2 * SIZE); //NULL 반환 위 경우 nums에 원래 저장되어 있던 주소가 사라집니다. NULL이 반환되었다는 것은 재할당에 실패했다는 뜻이고, 기존 메모리 역시 해제되지 않은 상태입니다. 이 상황에서 주소는 이미 잃어버렸.. 2020. 7. 16.

[ C ] 메모리 이해하기7 _malloc 짝꿍 함수 free 란? 메모리 관련 함수 malloc, free, C언어 예제 메모리 관련 함수에는 다음과 같은 것들이 있습니다. 이 글에서는 간단한 예제와 함께 malloc과 free함수에 대해 알아보겠습니다. 메모리 할당 및 해제 함수 : 동적에서만 사용할 수 있음 기타 메모리 관련 함수 : 동적이든 정적이든 다 쓰일 수 있음(포인터만 사용하면 되는거라) 할당 malloc() // memory + allocate 메모리 할당하다 calloc() 해제 free() // free 자유롭게하다 재할당 realloc() // re + allocate 다시 할당하다 memset() memcpy() memcmp() ■ malloc() void* malloc(size_t size); 동적으로 메모리를 할당하는 함수(힙 영역에 메모리를 .. 2020. 7. 16.

[ C ] 메모리 이해하기6 _동적메모리란? / 동적 할당 개념 그림으로 이해하기 동적메모리란? / 동적 할당 개념 그림으로 이해하기 프로그램이 동적 메모리를 가져다 사용할 때는 총 세 가지 단계를 거칩니다. 메모리 할당 메모리 사용 메모리 해제 매니지드 언어(대표적으로 C언어)는 위 3단계를 프로그래머가 직접 다 해야합니다. 1 . 메모리 할당 힙 관리자에게 메모리를 xxx 바이트만큼 달라고 요청합니다. 관리자는 그만큼의 연속된 메모리를 찾아서 반환합니다. 반환된 메모리는 어떤 자료형에 저장 가능할까요? 메모리 주소니 당연히 포인터입니다. 2. 메모리 사용 포인터 사용이랑 같습니다. 그래서 메모리를 원하는 대로 사용할 수 있습니다. 예) int 배열에 성적을 저장한 뒤 평균을 구해서 float 변수에 저장할 수 있습니다. 3. 메모리 반납/해제 힙 관리자에게 그 메모리 주소를 돌려주.. 2020. 7. 15.

[ C ] 메모리 이해하기5_힙(heap) 메모리란? 힙(heap) 메모리란? 힙메모리는 다음과 같은 스택 메모리의 단점을 보완합니다. ■ 스택 메모리의 단점 수명 함수가 반환되는 순간 그 안에 있던 데이터가 다 날아갑니다. 전역 변수는 언제나 살아있고, 지역 변수는 함수 안에서만 유효합니다. -> 프로그래머가 메모리의 수명을 자유롭게 결정하고 싶다. 크기 스택메모리는 특정 용도로 떼놓은 거라 크기가 작습니다. 차지할 크기를 컴파일 시에 결정하니까 크게 못 잡습니다. 그래서 엄청 큰 데이터를 처리해야 할 경우 스택 메모리에 못 넣죠. 예) 4K로 녹화해서 파일 크기가 2GB인 동영상 파일을 처리할 수 없음 -> 용량 제한 없이 메모리 사용하고 싶다 ■ 힙(Heap) 메모리의 장점 크기 컴파일러 및 CPU가 자동적으로 메모리 관리를 안 해주기 때문에 (unm.. 2020. 7. 15.