책정리/혼자 연구하는 C,C++ 1 20

20장 알고리즘

20.1 검색 검석(Search)이란 자료의 집합(table)에서 원하는 어떤 자료(Key)가 있는지, 있다면 어디에 있는지를 찾아내는 알고리즘이다. 검색은 소프트웨어 공학에서 가장 오랫동안 연구되어 온 주제이며 또한 가장 실용적인 주제이기도 하다. 원하는 자료를 빠르게 찾는 것뿐만 아니라 새로 추가되거나 삭제되는 자료들도 다음 검색을 위해 어떻게 조작할 것인지까지 포괄하는 종합 자료 관리 알고리즘이 바로 검색이다. 20.1.1 순차 검색 순차 검색(Sequential Search)은 모든 알고리즘 중에서 가장 기본적이면서 상식적인 검색 방법이다. 테이블을 처음부터 순서대로 읽으면서 원하는 키와 비교하기를 검색에 성공하거나 아니면 테이블 끝에 이를 때까지 반복하는 것이다. 임의의 자료에도 적용할 수 있으..

19장 자료구조

19.1 동적 배열 19.1.1 배열 요소의 삽입, 삭제 배열의 장점은 크게 두 가지가 있는데 첫 번째로 구좌 단순하기 때문에 정보 자체를 기억하는 메모리 외에 추가로 소모하는 메모리가 전혀 없어 공간 효율이 좋다. 둘째로 배열 크기가 아무리 커지더라도 검색 속도가 일정하다. 배열의 첨자 연산은 포인터를 통해 시작 번지에 첨자*요소크기를 더하는 간단한 동작이므로 임의의 한 요소를 참조하는 시간이 상수이다. 그러나 배열에도 한가지 단점이 있는데 배열 요소가 연속된 메모리 공간에 배치되어 있어야 하므로 중간의 요소를 삭제하거나 새로운 요소를 삽입할 수 없다는 점이다. 예제 ArrayInsDel #include #include char ar[16] = "abcdef"; void Insert( int idx, ..

18장 C 고급 문법

18.1 타입 컴퓨터의 메모리는 0과 1만을 기억할 수 있는 비트로 구성되어 있다. 이 내용은 당장 실무에 도움을 줄 수 있는 실용적인 이론은 아니지만 타입의 내부 구조를 이해함으로써 컴파일러의 동작을 좀 더 깊이 있게 이해하고 메모리에 저장된 값을 직접 평가하고 다룰 수 있는 직관력을 키울 수 있다. 18.1.1 정수의 내부 일반적으로 비트 n개가 모일 때 2n가지의 수를 표현할 수 있으며 시작 수가 0이므로 최대 표현 가능한 수는 2n-1이 된다. 부호가 있으면 표현수는 절반이 되지만 음수를 표현할 수 있다. 16비트 길이의 unsigned short형은 216-1(65535)까지 표현 가능 32비트 길이인 unsgiend int 232-1(4294967295)의 큰 값을 표현 가능하다 변수가 기억할..

17장 파일 입출력

17.1 파일 17.1.1 정보의 저장 파일은 디스크에 정보가 저장되는 단위이며 고유의 이름을 가진다. 프로그램이 실행 중에 파일을 액세스 하는 경우가 많은데 디스크에 있는 파일을 읽거나 쓰고 관리하는 방법을 알아본다. 실행 파일의 크기에는 제약이 있기 때문에 모든 정보를 다 가질 수 없으며, 큰 정보는 외부의 파일에 두고 실행 중에 읽어서 사용하는 방법을 쓴다. (ex. 실행에 필요한 이미지, 사운드 파일) 프로그램이 작업 결과를 영구적으로 저장하기 위해서도 파일을 사용한다. 파일은 보조 기억장치에 기록되어 있다. 파일을 액세스 하는 방법에는 여러 가지 종류가 있다. 고수준 입출력 스트림 사용 C 라이브러리가 제공하는 파일 입출력 방법이며 성능은 조금 떨어지지만 사용하기는 쉽다. 표준에 의해 삼수의 형..

16장 함수 고급

16.1 호출 규약 16.1.1 스택 호출 규약(Calling Convention)이란 함수를 호출하는 방식에 대한 일종의 약속 인수는 어떻게 전달하며 리턴값은 어떻게 반환하고 인수 전달을 위해 사용한 메모리는 누가 정리할 것인지 등을 규정 호출 규약을 이해하기 위해서는 스택에 대해 알아야 하며 스택은 기계어 수준에서 동작하기 때문에 어셈블리 언어에 대한 개념도 필요 스택(Stack)은 시스템이 사용하는 메모리 공간 CPU가 임시적인 정보를 저장할 필요가 있을 때 이영역을 사용 만약 힙과 스택이 만나게 되면 메모리가 부족한 상태가 됨 스택에 값을 저장하는 동작을 push(민다)라고 하며 저장된 값을 빼내는 동작을 pop(당긴다)라고 함 스택에 저장된 값들을 LIFO(Last In First Out)의 원..

15장 포인터 고급

15.1 const 15.1.1 상수의 정의 const 키워드 : 상수를 정의 const type name = 초기값 ; 변수를 선언할 때 반드시 초기화 해야됨 예제 const #include const int hour = 24; const int min = 60; const int sec = 60; void main(void) { printf("하루는 %d초\n", hour*min*sec ) ; } const에 의해 만들어지는 상수는 컴파일시에 값이 결정되기 때문에 배열의 크기 지정에도 사용 가능 const의 장점 #define이 정의 하는 매크로 상수는 타입을 지정할 수 없지만 const는 타입을 명확하게 지정 가능함 매크로 상수는 정의 된 후에는 언제든지 사용 가능하지만 const는 통용 범위 규칙..

13장 구조체

13.1 구조체 13.1.1 정의 타입이 다른 변수들의 집합 (이종 변수 집합) 정수나 실수 또는 문자열 등의 단순한 형태로 나타낼 수 없는 복잡한 데이터를 표현할 때 구조체를 사용 관련 정보를 하나의 구조체로 묶어서 선언하면 양이 많은 정보도 쉽게 다룰 수 있으며 함수를 통해 복잡한 정보를 전달하거나 리턴 받을 수도 있다. 구조체 선언은 구조체의 모양을 컴파일러에게 알리는 것 뿐 static, register 같은 기억 부류를 지정한다든가 초기값을 줄 수 없다. 여러 가지 정보들이 모여서 하나의 완성된 정보를 구성하기 때문에 실생활에서 예를 들 수 있음 도서 정보 : 저자, 출판사, 출판년도, 총 페이지수, 가격, 도서 번호 상품 정보 : 상품명, 제조사, 용량, 입고일, 매입가, 판매가, 할인율 게임..

12장 문자열 함수

12.1 문자열 함수 12.1.1 문자열 복사 C언어에서 문자열은 널 종료 문자가 끝에 있는 문자 배열로 표현하며 기본 타입에 포함되지 않는다. str1 = "korea" ; // 문자열 상수를 대입할 수 없음 str1 = str2 ; // 배열끼리도 대입할 수 없음 str3 = str1 + str2 ; // +연산자로 문자열을 연결할 수 없음 if ( str1 == str2 ) // == 연산자로 문자열끼리 비교할 수 없음 문자열이 기본 타입이 아니다 보니 정수나 실수처럼 연산자를 사용할 수는 없지만 문자열 함수를 사용하면 내용을 바꾸거나 비교, 연결하는 것은 물론이고 검색, 변환 등 연산자보다 훨씬 더 다양한 작업을 효율적으로 처리 할 수 있다. 문자 배열에 문자열을 복사하는 함수 char *strc..

11장 배열과 포인터

11.1 첨자 연산 11.1.1 배열의 내부적 처리 C언어 배열의 특징 C는 내부적으로 1차원 배열만 지원한다. 2차원 이상의 다차원 배열은 1차원 배열의 확장에 불과하다. C에는 2차원 배열이라는 것이 없다. 배열을 구성하는 배열 요소의 타입에는 전혀 제한이 없다. T형 변수를 선언할 수 있으면 T형 배열도 언제나 선언할 수 있다. 배열도 유도형 타입의 일종이며 따라서 배열 그 자체가 배열의 요소가 될 수 있다. 부분 배열 (SubArray) : 다른 배열에 포함된 배열 전체 배열 (모배열) : 부분 배열을 배열 요소로 가지는 배열 배열이 내부적으로 어떻게 처리되는가에 따라서 큰 차이점이 발생하는데 바로 1. 첨자 연산 방법과 2. 부분 배열의 자격 문제가 달라진다. 다차원 배열에서는 부분 배열만 단독..

10장 포인터

10.1 포인터 연산 10.1.1 T형 포인터 포인터 메모리의 한 지점, 간단히 말해 번지값을 가지는 변수 어떠한 형태의 변수든지 반드시 메모리에 보관되며 모든 메모리는 번지를 갖고 있다. 따라서 이 변수의 번지를 가리키는 포인터 변수를 항상 선언할 수 있다. 임의의 타입 T가 있을 때 T형의 포인터 변수를 선언할 수 있다. int *, char*, double * 변수 선언 O 구조체, 공용체, 배열 포인터 O 포인터 선언 방식 int *i, j; // i는 포인터, j는 정수형 int* i, j; // i는 포인터, j는 정수형 int *i, *j; // i와 j 모두 포인터 10.1.2 포인터의 타입 대상체(object) 포인터가 가리키는 번지에 들어있는 값, 즉 포인터가 가리키는 실체 int *p..