일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- c# 윈폼
- docker
- c# winform
- Data Structure
- HTML
- 다트 언어
- git
- c# 추상 클래스
- Houdini
- 포인터
- C# delegate
- Unity
- vim
- dart 언어
- Python
- 도커
- 깃
- 유니티
- Algorithm
- jupyter lab
- Flutter
- jupyter
- gitlab
- c언어
- github
- C++
- c#
- 구조체
- C언어 포인터
- 플러터
- Today
- Total
목록Programming (313)
nomad-programmer
함수 호출에 사용되는 인자의 전달에 사용되는 ( )도 연산자이므로 오버로딩이 가능하다. 그리고 이 연산자를 오버로딩 하면, 객체를 함수처럼 사용할 수 있게 된다. adder(5, 7); 객체의 이름이 adder이고 이 객체에 ( )연산자가 멤버함수로 오버로딩 되어 있는 상태라면, 다음과 같이 해석된다. adder.operator()(5, 7); 연산자가 ( )이니 멤버함수의 이름은 operator()이다. 그리고 함수에 전달되는 인자의 정보는 5와 7이다. #include #pragma warning(disable: 4996) using std::cout; using std::cin; using std::endl; class Point { private: int xpos, ypos; public: exp..
스마트 포인터란 말 그대로 똑똑한 포인터이다. 그리고 스마트 포인터는 객체이다. 포인터의 역할을 하는 객체를 뜻한다. #include #pragma warning(disable: 4996) using std::cout; using std::cin; using std::endl; class Point { private: int xpos, ypos; public: explicit Point(const int x = 0, const int y = 0) : xpos(x), ypos(y) { cout
new와 delete도 연산자이기 때문에 오버로딩이 가능하다. new 연산자 기본적으로 제공되는 new 연산자가 하는 일은 다음과 같다. 메모리 공간의 할당 생성자의 호출 할당하고자 하는 자료형에 맞게 반환된 주소 값의 형 변환 이 중 세 번째 내용은 C언어에서 사용하면 malloc함수와 달리, new 연산자가 반환하는 주소 값을 형 변환할 필요가 없음을 의미한다. new 연산자의 오버로딩은 1번에 해당하는 메모리 공간의 할당만 오버로딩할 수 있다. 나머지 두 가지 작업은 C++ 컴파일러에 의해 진행이 되며, 오버로딩할 수 있는 대상도 아니다. new 연산자 오버로딩은 다음과 같이 오버로딩 하도록 이미 약속이 되어있다. void* operator new(size_t size) { ... } 반환형은 반드..
#include #include #pragma warning(disable: 4996) using std::cout; using std::cin; using std::endl; class BoundCheckIntArray { private: int* arr; int arrlen; explicit BoundCheckIntArray(const BoundCheckIntArray& ref) {} BoundCheckIntArray& operator=(const BoundCheckIntArray& ref) {} public: explicit BoundCheckIntArray(int len) : arrlen(len) { arr = new int[len]; } ~BoundCheckIntArray() { delete[]..
함수 호출관계 모호함은 다음과 같은 상황에서도 발생할 수 있다. #include #include #pragma warning(disable: 4996) using std::cout; using std::cin; using std::endl; class Base { public: explicit Base() { cout
가상함수의 동작원리를 이해하면, C++이 C보다 느린 이유를 조금이나마 알 수 있다. 다음의 예를 살펴보자. #include #include #pragma warning(disable: 4996) using std::cout; using std::cin; using std::endl; class AAA { private: int num1; public: virtual void Func1() { cout
가상함수 말고도 virtual 키워드를 붙여줘야 할 대상이 하나 더 있다. 그것은 바로 '소멸자'이다. 즉, virtual 선언은 소멸자에도 올 수 있다. 가상 소멸자(Virtual Destructor) virtual로 선언된 소멸자를 가리켜 '가상 소멸자'라 부른다. 다음의 예를 살펴보자. #include #include #pragma warning(disable: 4996) using std::cout; using std::cin; using std::endl; class First { private: char* strOne; public: explicit First(const char* str) { cout
함수를 override 했다는 것은, 해당 객체에서 호출되어야 하는 함수를 바꾼다는 의미이다. 하지만 포인터 변수의 자료형에 따라 호출되는 함수 종류가 달라지는 것은 문제가 있다. 다음의 예제를 보자. #include #pragma warning(disable: 4996) using std::cout; using std::cin; using std::endl; class First { public: void MyFunc() { cout
다음은 List 사용의 main.c 파일의 내용이다. #include #include #include "List.h" /* clinet */ void* AllocData(double data){ double* p = (double*)malloc(sizeof(double)); *p = data; return p; } void FreeData(void* p){ free(p); } void PrintPrevious(LIST* lst){ printf("prev: "); for(ResetTailPos(lst); HasPrevious(lst); Previous(lst)){ printf("%lf ", *(double*)GetItem(lst)); } puts(""); } void PrintNext(LIST* lst){..
비트 필드는 구조체와 흡사하나 구조체는 바이트 단위로 멤버를 사용할 수있지만 비트 필드는 비트 단위로 멤버를 사용할 수 있다. 그래서 많은 상태를 저장하거나 비트별로 제어해야 하는 경우에 비트 필드를 사용한다. 비트 필드의 멤버는 unsigned형(unsigned int형)과 int형의 멤버를 가질 수 있고 비트 필드 변수의 크기는 int형 크기와 같은 4바이트(32비트)이다. signed와 unsigned는 char, short, int, long 등의 자료형 앞에 사용되어 부호가 있는 정수와 부호가 없는 정수를 나타내는 자료형으로 사용되며 signed는 보통 생략하여 사용한다. 비트 필드처럼 unsigned가 단독으로 사용되면 unsigned int형을 간략하게 표현한 형태이다. 다음은 비트 필드를 ..
#include #include #include void Menu(){ puts(""); puts("1. 문자열 입력"); puts("2. 문자열 삭제"); puts("3. 문자열 출력"); puts("4. 문자열 정렬"); puts("5. 종료"); } void ClearBuffer(){ while(getchar() != '\n'); } char* Input(){ char temp[100]; char* str; printf("100자 이하의 문자 입력: "); scanf("%s", temp); ClearBuffer(); str = (char*)malloc(sizeof(char)*strlen(temp)+1); strcpy(str, temp); return str; } void Remove(char* st..
다음은 9 X 9 배열을 포인터 변수 int (*arr)[3][3]에 저장하여 메모리에 사용하는 응용 예제이다. #include #include typedef int (*ARR9)[9]; typedef int (*ARR33)[3][3]; // int (*arr)[9] void PrintArray(ARR9 arr){ for(int i=0; i
다음은 쉬프트 비트 연산을 이용하여 4바이트를 2바이트로 분할하는 예제이다. #include #define LOWORD(x) ((unsigned short)x) #define HIWORD(x) ((unsigned int)x >> 16 & 0xFFFF) int main(int argc, const char * argv[]) { int n = 0x44434241; printf("%x\n", LOWORD(n)); printf("%x\n", HIWORD(n)); return 0; } */ 결과 4241 4443 */ 다음은 1바이트의 두 정수를 2바이트로 2바이트의 두 정수를 4바이트로 결합하는 예제이다. #include typedef unsigned char BYTE; typedef unsigned short..
XOR를 이용하면 손쉽게 데이터를 교환할 수 있다. 예를 들어, 연산 결과를 F라 하면 F^a 는 b가 되고 F^b는 a가 된다. 다음의 예제를 살펴보자. #include // 매크로를 이용한 데이터 교환 #define SWAP(a, b) { a^=b; b^=a; a^=b; } // 함수를 이용한 데이터 교환 void Swap(int* a, int* b){ *a ^= *b; *b ^= *a; *a ^= *b; } int main(int argc, const char * argv[]) { int a = 10; int b = 20; printf("a: %d, b: %d\n", a, b); Swap(&a, &b); printf("a: %d, b: %d\n", a, b); SWAP(a, b); printf("a..
가변 인자가 특정 자료형이 아닌 여러 자료형이 전달된다면 첫 번째 인자에 인자의 개수와 자료형의 정보까지도 전달해야 한다. 그래서 printf()와 같은 함수는 첫 번째 인자를 문자열로 만들고 '%c, %d, %s' 등을 사용하여 자료형과 인자의 개수를 전달한다. '%c' 이면 문자를 인자로 전달하고, '%d' 이면 정수를 인자로 전달하고, '%s' 이면 문자열의 시작 주소를 인자로 전달한다. #include #include #include void MiniPrintf(char *fmt, ...){ int i = 0; va_list ap; va_start(ap, fmt); while(fmt[i] != '\0'){ if(fmt[i] != '%'){ putchar(fmt[i]); } else{ switch(..
포인터의 선언과 그 포인터의 의미 단순한 포인터 선언 타입 의미 int* np; 1차원 포인터 int형의 주소를 저장 int** npp; 2차원 포인터 int형의 2차원 주소를 저장 단순한 배열 선언 타입 의미 int arr[3]; 1차원 배열 int형 값들을 저장 int arr[2][3]; 2차원 배열 int형 값들을 저장 배열과 포인터 선언 타입 의미 int* arr[3]; 1차원 포인터 배열 int형 주소값 3개를 저장 int (*arr)[3]; 2차원 배열 포인터 포인터 연산시, int형 3개를 건너뛰는 2차원 배열 포인터이며 2차원 배열의 주소를 저장 int (*arr)[2][3]; 3차원 배열 포인터 포인터 연산시, int형 2x3개를 건너뛰는 3차원 배열 포인터이며 3차원 배열의 주소를 저장..
구조체는 멤버 변수들의 크기에 따라 구조체의 크기가 결정되지만 구조체의 크기를 예측하여 동적 메모리를 생성하거나, 파일에 저장하거나, 네트워크에 전송하는 등의 작업을 하면 예상했던 구조체의 크기와 달라 오류가 발생하는 경우가 있다. 이유는 컴파일러가 프로그램 성능을 향상시키기 위하여 일정한 크기 형태로 구조체 변수들을 주소에 매핑시키기 때문이다. 매핑 : 패딩 바이트를 추가한 바이트 정렬 그래서 구조체의 크기는 모든 멤버 변수 크기의 합과 다를 수 있다. 다음은 구조체의 크기를 출력하는 예이다. #include typedef struct { char c; int n; } _data1; typedef struct { short s; int n; } _data2; typedef struct { int n1;..
컴퓨터는 메모리에 0과 1만을 저장할 수 있으므로 컴퓨터는 문자를 표현하기 위해 각각의 문자와 대응하는 숫자를 정의하고 있는데 이것을 문자 코드라 한다. 대표적인 문자 코드가 ASCII 코드이며 영문자, 숫자, 기호 등을 ANSI 라는 표준화 기구에서 정의한 7비트 문자 코드(0~127) 이다. 그래서 ASCII코드를 ANSI코드라고도 한다. 정확히 말하면 ANSI코드는 ASCII 코드에 1비트를 더확장(128~255)하여 정의한 8비트 문자 코드이다. C언어에서는 ASCII코드를 사용하여 문자를 표현한다. 사실 ASCII코드 외에도 많은 문자 코드가 존재하며 문화, 지역, 나라, 운영체제, 성능 등 여러 가지 요소들에 따라 문자 코드의 정의와 사용이 다랄져야 하기 때문에 문자 코드는 상당히 복잡하다. ..
SVG(Scalable Vector Graphics)는 벡터 그래픽을 표현할 때 사용하는 형식이다. 원래 SVG 태그는 인터넷 익스플로러 8 버전 이후의 인터넷 익스플로러에서만 지원하는 기능이었다. 하지만 HTML5부터는 SVG 태그가 표준으로 제정되어 모든 웹 브라우저에서 사용할 수 있게 되었다. 기존의 플래시가 벡터 이미지를 사용했으므로 SVG 태그를 사용하면 플래시 콘텐츠를 쉽게 HTML5로 변환할 수 있다. 기본적인 사용 방법 다음과 같이 HTML 페이지를 구성하고 body 태그안에 sav 태그를 입력한다. svg 태그는 width 속성과 height 속성을 반드시 사용해야 한다. svg 태그 내부에는 SVG 관련 태그를 입력한다. fill 속성을 사용해 색을 칠한다. 선은 stroke 속성을 사..
Sass & SCSS 란 무엇인가? CSS 전처리기 (CSS pre-processor)라 불리는 Sass(Syntactically Awesome StyleSheet)는 CSS의 단점을 보완한 CSS의 확장형이다. CSS 전처리기 종류에는 대표적으로 Sass(SCSS), Less, Stylus 등이 있다. Sass는 2006년부터 시작하여 가장 오래된 CSS 확장 언어이다. 그 만큼 높은 성숙도와 많은 커뮤니티를 가지고 있고 기능도 훌륭하다. SCSS는 Sass의 3버전에서 새롭게 등장하였다. SCSS는 CSS 구문과 완전히 호환되도록 새로운 구문을 도입해 만든 Sass의 모든 기능을 지원하는 CSS의 상위 집합(Superset)이다. 한마디로 SCSS는 Sass를 더 편리하고 CSS답게 수정한 버전이다...