본문 바로가기

프로그래머/C, C++

[HackerRank] Virtual Functions | 클래스 상속 | 가상함수 | 클래스 정적 멤버변수 Virtual Functions 이 문제의 핵심은 3가지이다. 클래스 상속의 사용 Professor class와 Student class는 Person class를 상속 받는다. 가상함수의 사용 Person class는 getdata와 putdata 2개의 가상함수를 사용한다. 클래스 정적 멤버변수의 사용 각 클래스의 정적 멤버변수가 존재해, 클래스 갯수를 count한다. 클래스 정적 멤버변수는 해당 클래스 내에서 공유된다. 모범답안 #include #include #include #include #include using namespace std; class Person{ public: string name; int age; virtual void putdata(){} virtual void getda.. 더보기
[포프 tv 복습] Type-Generic 함수 만들기, 정적 어서트, 메모리 정렬, 멀티스레딩 Type-Generic 함수 만들기, 정적 어서트, 메모리 정렬, 멀티스레딩 와 제네릭 선택 매개변수 형에 알맞는 수학 함수를 찾아서 호출해주는 매크로 함수 컴파일러가 알아서 구현해 준 것 프로그래머가 이런 매크로를 직접 만들 방법이 없었음 C11에서는 가능 제네릭 선택(generic selection)이라 부룸 _Generic 키워드를 사용 이제 도 이 키워드를 사용해서 직접 구현 가능 _Generic 키워드 _Generic(, ) 컴파일 도중에 여러가지 표현식 중 하나를 선택하는 방법 실행 중에 선택하는 것이 아님 매크로 함수의 대체 목록으로 사용하는 게 일반적 흡사 switch 문과 비슷해 보임 _Generic으로 ceil() 함수를 구현한 예 #include #include #define ceil.. 더보기
[포프 tv 복습] C99, C11 C99 C99 이전의 부동 소수점 연산 오류 처리 부동 소수점 연산 중 오류가 날 경우 그 이유를 오류 조건이라 함 C 라이브러리 함수가 오류 조건을 보고하는 경우가 있음 이 오류 조건의 일부는 errno를 통해 확인 가능 인자가 수학적으로 정의된 범위를 벗어날 경우 : EDOM 오버플로가 발생한 경우 : ERANGE 언더플로가 발생한 경우 : ERANGE가 설정될 수도 있음(구현에 따라 다름) C99의 부동 소수점 연산 오류 처리 좀 더 세분화된 부동 소수점 전용 오류 보고 기능 추가 이것을 '부동 소수점 예외'라고 부름 예외라고 하지만 다르 언어에서 말하는 예외는 아님 그냥 다른 형태의 오류 코드 errno에서 찾을 수 없던 오류 조건도 보고 됨 구현에 따라 다음 중 하나를 지원 여전히 errno을 .. 더보기
[포프 tv 복습] 나만의 라이브러리 만들기, C99 나만의 라이브러리 만들기 C에서도 라이브러리를 만들 수 있다 오브젝트 파일을 모아 라이브러리로 만듦 다시 컴파일할 필요 없이 코드 재활용이 가능 소스 코드 공개 없이(단, 헤더 파일은 예외) 라이브러리 배포 가능 C에서는 두 종류의 라이브러리를 만들 수 있다고 했음 정적 라이브러리 동적 라이브러리 (복습) 정적 라이브러리와 링크 정적 라이브러리와 링크하는 것을 정적 링킹이라고 함 라이브러리 안에 있는 기계어를 최종 실행파일에 가져다 복사함 동적 링킹에 비해 실행 파일의 크기가 커짐 메모리를 더 잡아먹을 수 있음 실행 속도가 빠름 보통 정적 라이브러리를 사용하는 절차 소스 코드들을 컴파일하여 정적 라이브러리를 만듦 보통 파일 하나 물론 여러 개의 라이브러리를 만들면 파일도 여럿 확장자는 *.lib(윈도우 .. 더보기
[포프 tv 복습] 전처리기 전처리기 전처리기로 할 수 있는 일들 다른 파일을 인클루드 전처리기 지시문 #include을 사용 매크로를 다른 텍스트로 대체 #define, #undef와 전처리기 연산자 #, ##를 사용 소스파일의 일부를 조건부로 컴파일 전처리기 지시문 #if, #ifdef, #ifndef, #else, #elif, #endif를 사용 일부로 오류를 발생시킴 전처리기 지시문 #error를 사용 매크로 대체 : #define #define 식별자 대체_목록(선택) #define A (10) 전처리기가 소스 코드 뒤지다가 A가 보이면 모두 (10)으로 바꿔줌 #define A 이것도 가능 하지만 바꿔줄 내용이 없음 그 대신 다른 전처리기 지시어로 A가 정의 돼 있는지 판단 가능 #define TRUE(1) #define.. 더보기
[면접 대비] C를 사용한 해시 맵 구현 size_t hash_65599(const char* string, size_t len) { size_t i; size_t hash; hash = 0; for(i = 0; i > 16); } 충돌까지 고려한 해시 맵 예 int add(const char* key, int value, size_t (*hash_func)(const char*, size_t)) { size_t i; size_t start_index; size_t hash_id; hash_id = hash_func(key, strlen(key)); start_index = hash_id % BUCKET_SIZE; i = .. 더보기
[면접 대비] C를 사용한 linked list 구현 연결 리스트 전체를 출력하는 코드 예 typedef struct node{ int value; node_t* next; } node_t; void print_node(const node*t head) { node_t* p = head; while(p != NULL){ printf("%d", p->value); p = p->next; } } 헤드 노드 node_t* head = NULL; 해제코드 void destroy(node_t* head) { node_t* p = head; while(p != NULL){ node_t* next = p->next; free(p); p = next; } } node_t* haed = NULL // 생략 destroy(head); head = NULL; 삽입코드 맨 앞에.. 더보기
[포프 tv 복습] C 자료구조 기초 자료구조 기초 자료구조란? - 컴퓨터에서 여러 자료들을 조직적, 체계적으로 저장하는 방법 - 보통 동일한 자료형을 여럿 저장하는 ㅜㄱ조를 의미 - 자료구조에 따라 요소들 사이의 관계를 정의하는 규칙이 있음 - 다음 요인에 따라 상황마다 보다 효율적인 자료구조가 존재 - 데이터에 접근하는 빈도 - 데이터에 접근하는 방법(ex. 삽입, 검색, 읽기, 지우기 등) 자료구조의 효율성 - 효율성은 주로 시간 복잡도를 말함 - 공간 복잡도를 포함하는 경우도 있음 - 따라서 주로 Big-O 표기법을 사용 - 보통 효율성을 논할 때는 하드웨어 최적화를 고려 안 한 이론이 전부 - 적은 용량의 데이터는 그렇지 않을 수 있음 배열 메모리 한 덩어리로 표현 가능한 가장 간단한 자료구조 여러 자료들을 그 메모리 덩어리 안에 .. 더보기
[포프 tv 복습] 레지스터, 스택 & 힙, 동적 메모리. 다중 포인터 레지스터, 스택 & 힙, 동적 메모리. 다중 포인터 메모리의 종류 프로그램에서 주로 사용하는 부품은 CPU 메모리 메모리는 또 다시 나뉘는데... 스택 메모리 힙 메모리 기본은 힙 메모리 힙 메모리가 범용적인 기본 형태 스택은 특별한 용도를 가진 메모리 프로그램마다 특별한 용도에 사용하라고 별도로 떼어놔 준 것이 스택 메모리 엄밀히 말하면 그 프로그램의 thread마다 CPU 안에도 저장공간이 있음 레지스터 : CPU에서만 사용할 수 있는 고속 저장 공간 엄밀한 의미의 메모리는 아님 레지스터 메모리를 읽고 쓰는 게 느린 이유 CPU가 메모리에 접근할 때마다 버스를 타야 함 대부분 컴퓨터에 장착하는 메모리는 DRAM임 DRAM은 가격이 저렴한 대신, 한 가지 큰 단점이 있음 기록된 내용을 유지하기 위해서 .. 더보기
[포프 tv 복습] 가변 인자 함수, 올바른 오류 처리 방법 가변 인자 함수, 올바른 오류 처리 방법 가변 인자 함수 (, ...); 정해지지 않은 수의 매개변수(가변 인자)를 허용하는 함수 반드시 최소 한 개의 정해진 자료형의 매개변수가 필요 가변인자는 '...'로 표현 가변 인자 함수의 예 #include int add_ints(const size_t count, ...) { va_list ap; int sum; sisze_t i; sum = 0; va_start(ap, count); { for(i = 0; i < count; i++){ sum += va_arg(ap, int); } } va_end(ap); return sum; } int main(void) { int result; result = add_ints(1, 16); printf("result: %.. 더보기