목록전체 글 (116)
while (1): study();

절차지향적 언어였던 C에서 객체지향적 언어인 C++로 넘어오면서 생긴 주요한 변화 중 하나는 class 키워드의 존재이다. class는 클래스를 생성하는 키워드이다. 그렇다면 클래스는 어떤 장점이 있기에 언어를 따로 만들면서까지 객체지향 프로그래밍을 실현하려고 한 것일까? 객체지향 프로그래밍의 장점은 더더욱 많겠지만, 여기선 클래스의 장점에 국한해서 이야기한다. 클래스의 장점에는 정보 은닉과 캡슐화가 있다. 우선 정보 은닉부터 보자. 정보 은닉이란 멤버 변수에 대한 직접적인 외부 접근을 차단하는 것이다. 이전에도 복합 데이터 구조를 "구조체"로 지원했던 C였지만, 구조체와 클래스는 결정적인 차이가 있다. 구조체는 멤버를 public으로 초기화하고, 클래스는 멤버를 private으로 초기화한다. 이 간단한..

인터넷 익스플로러라던가, 크롬과 같은 브라우저들은 인터넷과 떨어질래야 떨어질 수 없는 현대인들에게는 너무나 친숙합니다. 이렇게 친숙한 브라우저들을 우리는 조금 더 어렵게, 일종의 가상 머신이라고도 부를 수 있습니다. 가상 머신(Virtual Machine)은 하드웨어 상에 설계된 컴퓨터와는 다르게, 소프트웨어 상에서 설계된 컴퓨터를 말합니다. 그렇다면 브라우저가 하나의 컴퓨터라는건데... 어떻게 이 개념을 이해할 수 있을까요? 브라우저의 언어 컴퓨터와 대화하기 위해서, 정확히는 하드웨어 상에 설계된 컴퓨터와 대화하기 위해서는 기계어를 사용해야 합니다. 가상 머신이 하드웨어상의 컴퓨터와 다른 점은 가상 머신만의 기계어를 사용한다는 점입니다. 브라우저가 하나의 가상머신이라고 했으니 그럼 하드웨어상 컴퓨터와 ..

typedef struct __Point { int xpos; int ypos; } Point; 위의 구조체를 기반으로 두 점의 합을 계산하는 함수를 다음의 형태로 정의하고 Point& PntAdder(const Point& p1, const Point& p2); 임의의 두 점을 선언하여, 위 함수를 이용한 덧셈연산을 진행하는 main함수를 정의해보자. 단, 구조체 Point 관련 변수의 선언은 무조건 new연산자를 이용해서 진행해야 하며, 할당된 메모리 공간의 소멸도 철저해야 한다. #include using std::cin; using std::cout; using std::endl; typedef struct __Point { int xpos; int ypos; } Point; Point& PntA..

C++에서 구현하는 함수의 매개변수는 이용되는 형태에 따라 다양하게 불리운다. 가장 기본적인 경우는 call-by-value로, 전달받은 인수의 값을 복사하여 함수 내부의 지역변수로만 사용하고, 함수 외부에는 전혀 영향을 미치지 않는다. #include int MyAdd(int, int); int main(void) { int a = 3; int b = 5; std::cout

함수 오버로딩이란 이름과 기능이 같은 함수를 인자에 따라 다르게 작동하도록 구현하는 것을 말한다. 기존 C언어에서는 함수의 이름으로 함수를 호출하기 때문에 함수 오버로딩이 불가능했으나, C++에서는 함수의 이름에 더해 매개변수의 수, 타입까지 감안하여 서칭하기 때문에 오버로딩이 가능하다. 여담으로 파이썬에서는 오버로딩은 안되지만 디스패치 함수를 구현할 수는 있다. 다음은 swap 함수를 다양한 자료형에 호환되도록 구현한 함수 오버로딩의 예시이다. #define _CRT_SECURE_NO_WARNINGS #include void swap(int*, int*); void swap(char*, char*); void swap(double*, double*); int main(void) { int num1 = ..

사칙연산 수식을 입력하면 그 결과를 출력하는 프로그램을 작성합니다. 단, 수식을 입력하는 함수와 사칙연산 함수를 매크로 함수로 작성하세요. #define _CRT_SECURE_NO_WARNINGS #define ADD(x, y) ((x) + (y)) #define SUB(x, y) ((x) - (y)) #define MUL(x, y) ((x) * (y)) #define DIV(x, y) ((x) / (y)) #define GET(x, op, y) tmp = scanf("%d", &x);\ if (tmp == EOF) break;\ getchar();\ scanf("%c", &op);\ scanf("%d", &y); #include #include int main(void) { int x, y; int t..

소스 코드를 컴파일하기까지의 과정은 크게 3단계로 나뉩니다. 전처리: 소스코드를 컴파일하기 좋은 형태로 적절히 수정 컴파일: 전처리된 소스코드를 기계가 읽을 수 있는 객체 파일(object file)로 변환 링크: 객체 파일을 운영체제가 읽을 수 있도록 startup code를 붙여 실행 파일로 변환 이 중 가장 첫 단계인 전처리 단계에서 쓰이는 지시자들을 알아봅니다. 1. #include 가장 흔하게 접할 수 있는 전처리 지시자인 #include는 텍스트 형태의 파일을 현재 소스코드에 붙여넣는 기능을 수행합니다. #include #include "my_header.h" #include "my_module.c" 불러올 텍스트 파일은 또는 " "를 사용하여 불러옵니다. 를 사용하는 경우 컴파일러의 incl..

텍스트 파일에서 등록된 단어 이외의 단어를 찾아 새로운 파일에 출력합니다. 모든 단어의 길이는 최대 20자, 등록 단어 수는 최대 10개로 제한하며 검출 대상 단어 수는 제한이 없습니다. b.txt에서 a.txt에 등록되지 않은 단어를 찾아 c.txt에 출력합니다. #define _CRT_SECURE_NO_WARNINGS #include #include #include int get_words(char**, FILE*); void file_open_error(void); void free_all(int, int); int main(void) { FILE* wfp, * ifp, * ofp; int i, j; int is_detected; // printing flag char* words[10], *inp..

학생 5명의 국어, 영어, 수학 점수를 입력하여 총점, 평균, 학점을 구하고 총점 순으로 정렬하여 출력합니다. 학점은 평균이 90점 이상이면 A, 80점 이상이면 B, 70점 이상이면 C, 그 외는 F로 평가합니다. #define _CRT_SECURE_NO_WARNINGS #include #include #pragma pack(1) typedef struct { int id; char name[20]; int kor; int eng; int math; int total; double average; char grade; } Student; void get_info(Student**); void sort_by_total(Student**); void print_info(Student**); int main..

키보드로 양수를 입력한 후에 입력한 수까지의 모든 소수를 출력합니다. 2부터 한 줄에 5개씩 출력하며 소수가 아닌 수는 X를 출력합니다. 입력한 수에 따라 적절한 크기의 배열을 동적 할당하여 사용합니다. #define _CRT_SECURE_NO_WARNINGS #include #include #include int is_prime_number(int); void print_2darray(int**); int main(void) { int end; int flg; int i; char value[80]; // 동적할당용 임시 버퍼 printf("정수 입력 : "); scanf("%d", &end); char** nums = (char**)calloc(end - 2, sizeof(char*)); if (nu..