본문 바로가기

분류 전체보기337

[ C ] 메모리 이해하기8 _calloc(), memset(), realloc() ■ calloc( ) void* calloc(size_t num, size_t size); 메모리 할당할 때 자료형의 크기(size)와 수(num)를 따로 지정하고, 모든 바이트를 0으로 초기화해주는 함수입니다. 어떤 단어의 약자인지는 의견이 분분합니다. counted alloc... clear alloc... C alloc... 이 함수는 잘 사용되지 않습니다. 그 이유는 malloc()과 memset()를 조합해서 사용하면 비슷하게 구현할 수 있기 때문입니다. memset()을 쓰면 0 외의 값으로도 초기화 가능한데 좀 더 자세한 점은 아래에서 다루겠습니다 ■ memset() void* memset(void* dest, int ch, size_t count); memory + set, 메모리를 어떤 .. 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.

[ C ] 메모리 이해하기4 _스택(stack) 메모리란? 스택(stack) 메모리란? - 함수를 호출할 때 스택에 정확이 어떤게 어떤 순서로 들어가는지 알고 싶으면 함수 호출 규약에 따라 달라짐 어떤 컴파일러는 어떤 규격을 쓰는 매개변수 쓸때 어디부터 푸쉬한다든지 등 규약이 정해져 있으니깐 호출 받는 애와 주는 애에 관한 규약 2020. 7. 15.

[ C ] 메모리 이해하기3 _register 키워드란? register 변수의 제약 register 키워드란? register 변수의 제약 ■ register란? 프로그래머가 레지스터를 직접 사용하려면 어셈블리어로 코딩하면 됩니다. 물론 C언어도 가능하지만 레지스터 사용을 '요청'만 하기 때문에 실제로 그 명령이 레지스터로 갈 지, 스택 메모리로 갈 지는 컴파일러 마음입니다. 진짜 레지스터로 갔는지 확인하려면 어셈블러를 보면됩니다. 데이터를 레지스터에 저장한다고 할 때 register 키워드를 사용하면 됩니다. 이런 키워드를 저장 유형 지정자(storage-class specifier)라고 하는데 데이터를 어떻제 저장해야 하냐를 알려주는 키워드입니다. register 선언 방법은 아래와 같습니다. register ; int num; register size_t i; // .. 2020. 7. 14.

[ C ] 메모리 이해하기2_레지스터(Register)란? 필요한 이유 레지스터(Register)란? 레지스터가 필요한 이유 CPU 안에 있는 레지스터는 엄밀히 말하면 메모리가 아닙니다. 단지 휘발성으로 데이터를 저장하는 공간입니다. 그 휘발성 덕분에 프로그램을 메모리에 올렸다가 CPU에서 실행하면 굉장히 빨리 처리할 수 있습니다. 그런데 왜 굳이 레지스터를 CPU 안에서 동작하게 만들었을까요? 어떤 원리로 CPU 안에 있는 레지스터가 처리 속도가 빠르다고 할 수 있을까요? 먼저 이전 글을 잠시 복습해보면 CPU는 사람의 뇌, 메모리는 메모장이라고 했습니다. 여기서 하나만 생각해볼께요. 우리는 생각하는게 빠르나요? 적는게 빠르나요? 지금 누군가와 대화를 나누고 있다면, 듣는 동시에 머리 속으로 곱씹어 보는거랑 오고간 문장을 손으로 다 쓰는 것 중 당연히 뇌로 생각하는게 빠릅.. 2020. 7. 13.

[ C ] 메모리 이해하기1_메모리의 종류(스택, 힙, 레지스터?) 메모리의 종류(스택, 힙, 레지스터?) ■ 컴퓨터 구성품 컴퓨터는 위와 같이 여러 부품들이 조립되어 있습니다. 그래서 어떤 작업을 하려면 부품들 간의 협업이 필요합니다. '버스' 통로를 이용해서 연결될 수 있지요. 메모리에 대한 구체적인 설명에 앞서 일단 프로그램에서 주로 사용하는 부품 2개를 먼저 간단히 보겠습니다. CPU와 앞으로 계속 다루게 될 메모리입니다 CPU 메모리 - 모든 연산을 처리하는 사람 뇌 같은 역할 - 어셈블리는 메모리랑 상관없이 씨피유가 이해하는 언어 - 실행 중인 코드 및 연산의 중간 결과 등을 저장하는 공간 - 변수나 배열 등에 대입되는 데이터가 저장됨 - 생각한 것을 '적어둔다'라는 점에서 메모장 같음 ■ 메모리 구분 메모리는 크게 두 가지로 나눌 수 있습니다. 스택(stac.. 2020. 7. 12.

[알고리즘] 큐(Queue) 개념/용도/삽입/삭제/검색(C언어) 큐(Queue) 개념/용도, C언어로 삽입/삭제/검색 구현하기, 예제 스택은 출입구가 하나였다면 큐는 2개인 자료구조입니다. 스택과 마찬가지로 자료의 삽입과 삭제에 대한 규칙이 있는 자료구조 중 하나입니다. 선입선출(first in first out)로 먼저 들어간(enqueue) 데이터가 먼저 삭제(dequeue)됩니다. 영어로 Queue도 한 줄로 서있는 상태를 의미하니 아래 그림을 기억하면 좋을 것 같습니다. 데이터가 10, 20, 30 순으로 삽입되었으면 삭제도 10, 20, 30 순입니다. 즉, 삽입 순서와 삭제순서가 같죠. 언제나 가장 처음에 있는 자료만 제거 가능하고, 중간 자료에 임의 접근 안 됩니다. ■ 큐의 삽입 en + queue = enqueue 1. ~속에 넣다 1 대기줄 큐에 넣.. 2020. 7. 11.

[알고리즘] 스택(Stack)의 삽입/제거/검색(C언어) 스택(Stack)의 삽입/제거/검색(C언어) C언어로 자료구조 스택의 삽입, 제거, 검색의 예를 코드로 보겠습니다. 스택(Stack)의 개념을 파악하고 싶다면 아래 글을 먼저 읽어주세요. 스택이란? 글 보러가기 ■ 스택의 삽입 최대 8개의 요소가 들어갈 수 있는 스택입니다. 값을 삽입할 때 배열에서 사용하는 insert를 스택에서 push로 사용합니다. C 언어로 구현한 코드를 보겠습니다. enum { MAX_NUMS = 8}; int s_nums[MAX_NUMS]; // 8개 요소를 넣을 수 있는 배열 생성 size_t s_num_count = 0; // 데이터를 넣을 자리(인덱스) void push (int n){ assert(s_num_count < MAX_NUMS); s_nums[s_num_cou.. 2020. 7. 10.

[ 알고리즘 ] 스택(Stack)의 개념과 용도 스택(Stack)의 개념과 용도 ■ 스택의 용도 모바일 게임 중에 한창 유명했던 어플리케이션 STACK이 있습니다. 떨어지는 블럭을 잘 쌓아야 하는 게임인데 최근에는 4D로도 나온것 같더라고요. 이처럼 스택(Stack)은 영어 단어로 쌓여있는 더미라는 뜻입니다. 배열과 달리 스택은 삽입과 삭제에 대한 규칙이 있습니다. 삽입할 때 1, 2, 3, 4 순이었다면, 삭제는 4, 3, 2, 1 순으로 해야 합니다. 중간에 있는 요소를 제거하는 것은 원칙상 불가능합니다. 즉, 중간 자료의 임의 접근이 안됩니다. 이런 제약이 있는 스택, 주로 어느 용도로 사용될까요? ■ 스택의 용도 1. 자료의 순서를 뒤집는데 유용합니다. 스택의 요소를 하나씩 뽑아서 배열에 저장합니다. 그럼 배열의 요소가 뒤집어집니다. 이런 식으.. 2020. 7. 10.

[ 알고리즘 ] 연결 리스트(Linked List) 용도 / 오늘날 사용 빈도 연결 리스트(Linked List) 용도/사용빈도 1. 배열의 한계를 극복하기 위해 배열(or 배열 기반 리스트)의 한계 - 배열은 정형화돼서 색인으로 접근해야 합니다. - 초기에 메모리 공간을 잡아두고, 변경이 불가능합니다. - 삭제 시 데이터의 이동(복사)가 빈번히 발생합니다. 하지만 연결리스트는 메모리 크기가 얼마인지 중요하지 않습니다. 노드 하나 만들어 놓고 필요할 때마다 만들어 연결하기 때문에 길이가 자유롭습니다. 데이터를 삽입/삭제할 때도 위치만 안다면 삭제하고 복사할 필요없이 진행할 수 있습니다. 이런 개념은 연결 리스트는 배열보다 메모리를 좀 더 자유롭게 사용하면서 다음 것(데이터)를 가리킬 수 있는 방식으로 볼 수 있습니다. 2. 삽입, 삭제가 빈번한 경우에 사용 연결 리스트에서는 삽입,.. 2020. 7. 9.

[ 알고리즘 ] 추상 자료형(ADT) 란? 추상 자료형(ADT) 란? 추상 자료형이란 구체적인 완성 과정을 언급하지 않고, 순수하게 기능이 무엇인지 나열한 것입니다. 예를 들어 설명하기 위해 C언어 기반으로 구조체 하나를 정의하겠습니다. 구조체를 기반으로 리모콘을 의미하는 구조체를 정의하였습니다. Remote이라는 자료형의 정의인 셈입니다. 하지만 컴퓨터 공학적 측면에서는 자료형의 정의가 구조체 정의만으로 완성되는 것이 아닙니다. Remote을 기반으로 하는 연산의 종류를 결정하는 것도 추가해야합니다. 즉, 아래의 두 가지를 다 충족시켜야 합니다. 1. 구조체의 정의 2. 그 구조체와 관련된 연산의 종류 여기서 연산은 +,- 의 기본 연산이 아니라 Remote을 기반으로 제공할 수 있는 기능 관련 연산을 의미합니다. 아래와 같은 것들이 될 수 있.. 2020. 7. 9.

[ 알고리즘 ] 연결리스트(Linked List) 삽입/조회(그림으로 이해하기) 연결리스트(Linked List) 삽입/조회(그림으로 이해하기) ■ 연결 리스트 개념 이해 연결리스트는 여기저기 흩어져있는 데이터를 다룹니다. 일렬로 데이터를 처리하는 배열과 큐와는 완전히 다른 개념입니다. 위 그림처럼 데이터가 서로 떨어져 있을 수 있는 이유는 동적 메모리를 할당하기 때문입니다. 연결리스트에서 메모리에 있는 자료형을 노드라고 부릅니다. 데이터를 저장하는 장소와 다음 데이터를 가리키는 포인터 변수로 구성되어 있습니다. 처음노드를 가리키는 노드는 없어서 head라고 부릅니다. 마지막노드는 가리켜야할 다음 데이터가 없어서 null 포인터를 가지고 있습니다. ■ 연결 리스트 삽입 - 15와 30 사이에 20를 삽입하고 싶으면 포인터 2개만 변경해주면 됩니다. - 15 데이터의 포인터 변수는 2.. 2020. 7. 9.

[ 알고리즘 ] 하노이 타워(The Tower of Hanoi) 재귀 함수로 구현하기 (C언어) C언어로 하노이 타워(The Tower of Hanoi) 재귀 함수로 구현하기 하노이 타워 문제는 1883년 프랑스 수학자에 의해 처음 소개되었습니다. 하나의 막대에 쌓여 있는 원반을 다른 막대에 그대로 옮겨야 하는 문제인데, 막대 3개를 이용할 수 있고, 다음 제약조건을 만족시켜야 합니다. 막대 A에서 막대 C로 옮기기 위해서 막대 B를 잘 활용해야 합니다. 직접 연습장에서 어떻게 옮길 것인지 그림으로 그려보고 아래 과정을 확인해보세요. 원반1, 2번을 막대 B에 옮겨다 놓으면 원반 3번을 막대 C에 올길 수 있습니다. 그럼 원반1,2번을 막대 B로 옮겨야 합니다. 이것이 하노이 타워 문제 해결의 핵심입니다. 즉, 모든 원반(3개)를 옮기기전에 우선 두 개의 원반을 막대 B에 옮기는 문제부터 해결해야 .. 2020. 7. 9.

[ 알고리즘 ] 연결리스트(Linked List) 삭제 (그림으로 이해하기) 연결리스트(Linked List) 삭제 (그림으로 이해하기) - 이미 삭제할 위치를 알면 O(1) 걸립니다. - 20을 바로 제거하는 것이 아니라 앞 노드가 다음 노드를 가리키게 하면 됩니다. 여기서 주의할 점은 해당 노드를 바로 삭제해버리면 그 다음 노드에 접근이 불가하니 '삭제될 노드가 가리키는 다음 노드의 주소 값'을 별도로 저장해 두어야 합니다. 관련 글 연결 리스트 삽입/조회하는 방법 연결 리스트 용도 ------------------------------ 알고리즘 개념 모아보기 ------------------------------ 2020. 7. 9.

[ 알고리즘 ] 이진 탐색 알고리즘의 재귀적 구현(C언어) last) // 탈출 조건 return -1; // -1 반환은 탐색의 실패 의미 mid = (first+last)/2; if(array[mid] == target) return mid; // 탐색된 타켓의 인덱스 값 반환 else if (array[mid] > target) return BinarySearchRecur(array, first, mid-1, target); else return BinarySearchRecur(array, mid-1, last, target); } int main(void) { int arr[]={1, 3, 4, 7, 8}; int index; index = BinarySearchRecur(arr, 0, sizeof(arr)/sizeof(int)-1, 3); if(inde.. 2020. 7. 8.

[ 알고리즘 ] 재귀의 활용_피보나치 수열 구현(C언어) 재귀의 활용_피보나치 수열 구현(C언어) 피보나치 수열은 재귀적인 형태를 띠는 대표적인 수열입니다. 앞의 두 수를 더해서 현재의 수를 만들어가는 수열이라 처음 두 개의 수(0,1)이 주어진 상태에서 만들어집니다. 피보나치 수열의 n번째 위치의 값을 반환하는 함수를 코드로 구현보겠습니다. #include int Fibo(int num) { if(num == 1) // 수열의 첫번째 자리를 요구하면 0 반환 return 0; else if(num == 2) // 수열의 두번째 자리를 요구하면 1 반환 return 1; else // 수열의 세번째 자리 이상을 요구하면 return Fibo(num - 1) + Fibo(num - 2); } int main(void) { int i; printf("피보나치 수열.. 2020. 7. 8.

[ 안드로이드 스튜디오 ] public final class BuildConfig 오류 발생 시 public final class BuildConfig 오류 발생 시 1. Build - Clean Project 합니다. 2. Build - Rebuild Project 합니다. 3. 애뮬레이터 새로 실행합니다 2020. 7. 8.

[ 알고리즘 ] 재귀함수의 디자인 사례_팩토리얼 구현(C언어) 재귀함수의 디자인 사례_팩토리얼 구현(C언어) 정수 n의 팩토리얼은 n!로 표시합니다. n! = n x (n-1) x (n-2) x (n-3) x ... x 2 x 1 따라서 3!은 3 x 2 x 1 입니다. #include int Factorial(int num) { if(num == 0) // 탈출조건 return 1; else return num * Factorial(num - 1); // 재귀 개념 활용 } int main(void) { printf("3!은 %d입니다.\n",Factorial(3)); return 0; } ------------------------------ 알고리즘 개념 모아보기 ------------------------------ 2020. 7. 8.

[ 알고리즘 ] 재귀 함수의 기본 원리 이해하기 [ 알고리즘 ] 함수의 재귀적 호출의 이해 재귀함수란 다음과 같이 함수 내에서 자기 자신을 다시 호출하는 함수를 의미합니다. 완료되지 않은 함수를 다시 호출하는 것이 가능한가요? 네 가능합니다. 아래 그림으로 더욱 쉽게 재귀함수의 흐름을 파악해봅시다. 다음 그림은 Recursive 함수가 호출되면, Recursive 함수의 복사본이 만들어집니다. 그리고 그 복사복인 실행되고, 그 안에서 Recursive 함수가 호출가 호출되면 또 복사본이 만들어집니다. 실제로 함수를 구성하는 명령문은 CPU로 이동(복사)되어서 실행됩니다. 따라서 이 재귀함수 역시 얼마든지 CPU로 이동이(복사가) 가능합니다. 그럼 위의 예제의 호출 결과는 어떨까요? Recursive 함수에서 문자열 출력하고, Recursive 함수 호.. 2020. 7. 8.

[ C 언어 ] 함수 포인터란? C 언어 함수 포인터란? C언어를 Low레벨 언어라고 볼 수 있는 이유 중 하나는 '포인터'입니다. '포인터'를 이용하면 메모리에 접근할 수 있기 때문입니다. '함수 포인터'도 함수가 저장되어 있는 메모리 공간에 접근할수 있습니다. 어떻게 가능할까요? 바로 함수의 주소 값을 통해서입니다. 즉, 함수의 주소 값 저장을 위해 별도로 선언한 포인터 변수를 '함수 포인터'라고 합니다. ■ 함수 포인터 변수의 선언 1. 반환형이 int 2. 함수포인터의 이름 3. 매개변수 선언이 int 1개 ■ 함수 포인터 변수의 쓰임새 - 구조체에서 멤버함수를 커스터마이징할 때 - 함수 자체를 매개변수로 받을 때 ■ 함수 포인터 변수의 예제 #include void fun(int num) { printf("%d\n", num).. 2020. 7. 7.

맥 Xcode에서 C/C++/Object-C언어 실습 환경 갖추기 맥 Xcode에서 C/C++/Object-C언어 실습 환경 갖추기 1. Xcode를 열어줍니다. 2. File - New - Project를 클릭합니다. 3. macOS - Command Line Tool 를 선택하고 Next를 클릭합니다. 4. 파일명을 적고, 언어(Language)에 사용하고자 하는 언어를 선택하고 Next를 클릭합니다. 5. 저장공간 선택합니다. 6. 왼쪽 창에서 main.c를 파일을 선택하고 코드를 작성하여 실행하면 아래 콘솔창에서 출력 결과를 확인할 수 있습니다. ----------------------------------- C언어 문법 총정리 목록 보러가기 ----------------------------------- 2020. 7. 6.

[ 알고리즘 ] 빅-오 표기법이란? [ 알고리즘 ] 빅-오 표기법이란? 빅오 표기법은 대문자 O를 사용하기 때문에 빅(Big) 오(O)라고 부릅니다. 앞 글에서 이진 탐색 알고리즘의 시간 복잡도 함수를 구하면서 최악의 경우의 비교연산 횟수는 k+1에서 +1이 중요하지 않다고 했습니다. 왜 그렇게 말할 수 있는지 빅-오 표기법을 통해 설명하겠습니다. (이해를 위해 이전 글을 읽어오시면 좋습니다.) 먼저 빅-오에 대한 설명을 위해 하나의 예로 시간 복잡도 함수를 봅시다. 시간 복잡도 함수를 T(n)를 구하는 이유는 데이터의 수 n이 증가에 따라 연산횟수의 변화 정도를 판단하기 위해서입니다. (중요) 오차 없이 시간 복잡도를 함수를 구할 수 없고, 구할 필요도 없다는 겁니다. 즉, 근사치(approximtation) 식으로 구성해도 됩니다. 그.. 2020. 7. 6.

[ 알고리즘 ] 이진 탐색이란? 시간의 복잡도 계산하기 이진 탐색이란? 시간의 복잡도 계산하기 배열을 대상으로 이진 탐색 알고리즘을 적용하기 위해서는 배열에 저장된 데이터가 정렬되어 있어야 합니다. 즉, 이진 탐색 알고리즘은 정렬된 데이터가 아니면 적용이 불가능합니다. 그럼 이해를 위해 그림을 먼저 보겠습니다. 다음과 같이 정렬된 배열이 있습니다. 배열의 요소 중 3은 어느 인덱스에 있는지 알고 싶다고 가정하겠습니다. 1. 배열의 가운데를 찾기 위해 인덱스의 시작과 끝을 더해 2로 나눕니다. 2. 인덱스 3에 있는 요소와 목표값이 같은지 비교합니다. 3. 아니네요. 인덱스 3에 있는 요소(7)는 목표값(3)보다 큽니다. 4. 범위를 0~2로 하여 다시 인덱스의 시작과 끝을 더해 2로 나눕니다. 5. 인덱스 1에 있는 요소와 목표값이 같은지 비교합니다. 6. .. 2020. 7. 5.