컴퓨터 프로그래밍 공부 55

원형 리스트

static int ListNum = -1; class List { public: List* CurPtr = this; List* BeforePtr = nullptr; List* AfterPtr = nullptr; int Index = 0; int Value = 0; bool IsDummy = false; ~List(); }; // 빈 List 생성 void InitialList(); // 원하는 만큼의 수와 해당 값으로의 초기화된 List 생성 void InitialList(int MaxIndex, int Value); // 부분 삭제 void DeleteIList(int iter, List* InDeleteList); // 전체 삭제 void DeleteAllList(); // 삽입 void Push..

주소 바인딩

주소 바인딩이란? 프로세스는 실행을 위해 메모리에 적재되면 프로세스를 위한 독자적인 주소공간이 생긴다.이 주소를 논리적 주소라고 한다. 논리적 주소는 각 프로세스마다 독립적으로 할당된다. 그렇다면 프로세스는 왜 논리적 주소를 사용할까? CPU가 프로세스의 작업을 수행하기 위해서 프로세스의 논리적 주소를 참조하게 된다.논리적 주소만으로는 실제 메모리의 주소를 알 수 없기 때문에논리 주소를 물리적 메모리로 연결시키는 작업이 필요하다.이 작업을 주소 바인딩이라고 한다. 주소 바인딩의 종류로는컴파일 타임 바인딩로드 타임 바인딩실행 시간 바인딩이렇게 세 가지의 바인딩 방식이 있다.세 바인딩의 기준은 물리적 주소가 언제 결정되느냐에 따라 결정된다.  컴파일 타임 바..

코어와 멀티코어, 스레드와 멀티스레드

코어와 멀티코어 클럭 속도를 높이는 방법 외에 CPU의 성능을 높이는 방법으로 대표적인 해결책으로는 CPU의 코어와 스레드 수를 늘리는 방법이 있다. 전통적인 CPU에는 코어가 하나였지만, 오늘날에는 코어를 여러 개 포함하고 있는 CPU를 멀티코어 CPU 또는 멀티코어 프로세서라고 부른다. 이는 CPU 내에 명령어를 처리하는 일꾼이 여러 명 있는 것과 같다. 당연히 멀티코어의 처리 속도는 단일코어보다 빠르며, 가령 클럭 속도가 2.4GHz인 단일 코어 CPU와 클럭 속도가 1.9GHz인 멀티코어 CPU를 비교하면 일반적으로 후자의 성능이 더 좋다. CPU 종류는 CPU 안에 코어가 몇 개 포함되어 있는지에 따라 싱글코어, 듀얼코어, 트리플코어 드응로 나뉜다. 즉 멀티코어 프로세서란 여러 개의 코어를 포함..

프로그래밍 개발 과정

프로그래밍 언어 고수준 VS 저수준 (어셈, 기계어) 컴파일러 - 고수준 언어를 저수준 언어로 번역하는 프로그램이며 이 작업을 컴파일이라 한다. 인터프리터 - 고급언어로 작성된 코드를 한 단계 식 해석하여 실행 시키는 방법이다. 컴파일 언어 - 원시코드를 목적코드 (기계어) 로 변환하는 것 - 네이티브 코드란? 직접 기계어 번역 및 실행됨 중간 언어 - 원시 코드와 목적 코드의 중간 단꼐 언어 (원시 > 중간 > 목적) - Java 가상 머신, .Net PrameWork 등 - 런타임에 동적으로 기계어 번역이 실행된다. - 매니지드 코드 : 바이트 코드 번역 링커 - 컴파일러가 만들어낸 1개 이상의 목적코드들을 병합하여 단일 실행파일로 만들어 내는 프로그램이다. 라이브러리 - 다른 프로그램들과 링크되기 ..

컴퓨터 구조

컴퓨터 구조 1. CPU 2. 레지스터 3. 캐시 4. BUS 5. GPU 1. CPU 중앙처리 장치 (CPU : Central Processing Unit) 컴퓨터 시스템의 기능에는 입력, 출력, 기억, 연산, 제어의 5대 기능이 있다. 이 중에서 연산, 제어 및 기억 기능은 컴퓨터의 중심이 되는 기능이라고 볼 수 있는데 이러한 기능을 수행하는 장치로 컴퓨터의 두뇌로서의 역할을 수행한다고 볼 수 있기 때문에 중앙처리장치 즉, CPU라고 한다. 코어( 개수가 많을수록 여러 가지 작업을 동시에 수행할 수 있다.) 싱글 > 듀얼 > 쿼드 > 핵사 > 옥타 (8개) CPU는 기계어로 쓰인 컴퓨터 프로그램의 명령어를 해석하여 실행한다. CPU는 프로그램에 따라 외부에서 정보를 입력받아, 이를 기억하고, 연산하며..

연결 리스트(Linked List)

연결 리스트란? 필요할 때마다 바구니를 하나씩 마련해서 그곳에 데이터를 저장하고 이들을 배열처럼 서로 연결한다. 라는 개념으로 접근하면 이해하기 쉽다. 바구니 역할이 구조체가 되고, 구조체 변수를 하나씩 동적 할당해서 이들을 연결한다. 그리고 구조체 Node의 변수를 가리켜 '노드'라 한다. 이는 데이터를 담는 바구니보다는 연결이 가능한 개체라는 사실에 중점을 두어 지은 이름이다. 이렇듯 구조체의 정의 하나만 가지고도 연결 리스트의 기본 원리라고 말할 수 있다. 이를 그림으로 표현하면 다음과 같다. 연결 리스트에서의 데이터 삽입 다음 임의 코드로 연결 리스트의 삽입 개념을 잡아보자. Node * head = NULL;// 리스트의 머리를 가리키는 포인터 변수 Node * tail = NULL;// 리스트..

리스트 List(배열 기반)

으래 그냥 리스트라고 하면 연결 리스트를 종종 떠올린다. 하지만, 리스트에는 순차 리스트와 연결 리스트가 있다. 순차 리스트는 배열을 기반으로 구현된 리스트이며 연결 리스트는 메모리의 동적 할당을 기반으로 구현된 리스트이다. 하지만 이는 리스트의 구현방법의 차이에서 비롯된 것이기 때문에 이 둘의 ADT가 동일하다고 해서 문제가 될 것은 없다. 물론 각각의 특성의 차이 때문에 ADT에 차이를 두기도 한다. 이는 ADT는 각종 자료구조들의 표준이 아니기 때문이다. 정의하는 사람이나 회사에 따라서, 다시 말해 피룡에 따라서 ADT에도 차이가 난다. 물론 필요에 따라 확장도 가능하다. 하지만 그렇다고 해서 해당 자료구조의 기본 특성을 무시하는 형태로 ADT가 정의되는 것은 아니다. 리스트 ADT 정의를 위해서 ..

트리 순회

트리 순회 일단 트리가 구성되어 있다면, 이 트리를 다양한 방법으로 순회하여 원하는 노드에 접근할 수 잇다. 다양한 순회 방법에 대해 간략히 알아보자. 전위 순회 (preorder traversal) 이 방법은 현재 노드를 먼저 방문하고, 그다음은 현재 노드의 왼쪽 하위 노드를, 마지막으로는 현재 노드의 오른쪽 하위 노드를 재귀적인 방식으로 방문한다. 여기서 '전위(pre)'는 상위 노드를 하위 노드보다 먼저 방문한다는 뜻이다. 전위 순회는 항상 부모 노드를 방문한 다음 왼쪽 자식 노드, 오른쪽 자식 노드를 차례로 방문한다. 이러한 방식의 순호를 루트 노드에서만 수행하는 것이 아니라 루트 노드 아래의 모든 서브 트리에 대해 적용한다. 중위 순회 (in-order traersal) 중위 순회 방법은 왼쪽 ..

열혈 자료구조 - 재귀의 활용 하노이 타워 코드 및 실행

하노이 타워 코드 #include void HanoiTowerMove(int num, char from, char by, char to) { if (num == 1)// 이동할 원반의 수가 1개라면 { printf("원반1을 %c에서 %c로 이동 \n", from, to); } else { HanoiTowerMove(num - 1, from, to, by); printf("원반%d을(를) %c에서 %c로 이동 \n", num, from, to); HanoiTowerMove(num - 1, by, from, to); } } int main(void) { // 막대 A의 원반 3개를 막대 B를 경유하여 막대 C로 옮기기 HanoiTowerMove(3, 'A', 'B', 'C'); return 0; }

열혈 자료구조 - 재귀적 호출의 이해

재귀는 자료구조와 알고리즘에 있어서 매우 중요한 요소이고,C언어는 이렇듯 중요한 재귀를 지원하는 언어이다. 재귀함수의 기본적인 이해 재귀함수란 무엇인가?재귀함수란 다음과 같이 함수 내에서 자기 자신을 다시 호출하는 함수를 의미합니다. void Recursive(void){ printf("Recursive call! \n"); Recursive(); // 나 자신을 재호출한다}  위 형태의 함수가 재귀호출이다.그렇다면 재귀 호출은 어떻게 이해해야 할까?  다음 그림과 같은 구조는 매우 단순해 보이지만,그림 내용대로 재귀함수를 이해하는 것이 여간 쉬운 일은 아니다. 그렇다고 위 그림이 재귀호출에 대해서 잘못 설명하고 있다거나 하지는 않는다. 해당 함수는 완료되지 않은 함수를 다시 호출하는 것이 ..