일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- github
- C++
- HTML
- 구조체
- 플러터
- c언어
- dart 언어
- C# delegate
- 다트 언어
- git
- Houdini
- Python
- gitlab
- 도커
- 포인터
- 깃
- Unity
- jupyter
- jupyter lab
- Algorithm
- Flutter
- docker
- C언어 포인터
- vim
- c#
- c# 추상 클래스
- c# 윈폼
- 유니티
- Data Structure
- c# winform
- Today
- Total
목록분류 전체보기 (488)
nomad-programmer
다중 상속(Multiple Inheritance)은 두 개 이상의 부모 클래스를 동시에 상속하는 경우를 말한다. 왜 다중 상속을 사용해야 할까 학생 정보를 관리하는 프로그램을 작성한다고 하자. 기본적으로 학부생과 대학원생의 정보를 관리하는 2개의 클래스를 생각해볼 수 있다. 그리고 기숙사생의 정보를 관리하는 클래스도 생각해볼 수 있다. 그렇다면 학부생이면서 동시에 기숙사생인 학생의 정보는 어떤 클래스에 의해서 관리되어야 할까. 학부생 클래스 아니면 기숙사생 클래스? 바로 이런 경우에 다중 상속을 사용할 수 있다. 학부생 클래스와 기숙사생 클래스를 모두 상속해서 학부생이면서 기숙사생인 학생의 정보를 관리하는 클래스를 만들 수 있다. 다중 상속의 사용 다음 예제에는 세 개의 클래스가 등장한다. 각각 학부생 ..
접근 제어 키워드 public: 모든 곳으로부터의 접근 허용 protected: 자식 클래스의 멤버 함수로부터의 접근만 허용 private: 자신의 멤버 함수 외에는 접근 불가 다음 예제를 보며 이 키워드가 의미하는 바를 구체적으로 확인해보자. #include using namespace std; class Parent{ private: int priv; protected: int prot; public: int publ; }; class Child : public Parent { void AccessParents(){ int n; // 부모의 멤버에 접근 시도 n = prev; // 실패 n = prot; // 성공 n = publ; // 성공 } }; int main(int argc, const ch..
단항 연산자 오버로딩 오버로딩이 가능한 단항 연산자는 !, &, ~, *, +, -, ++, -- 형 변환 연산자이다. ++, --연산자로 단항 연산자 오버로딩에 대해 알아보자. ++, -- 연산자 오버로딩 ++ 연산자는 전위 ++ 연산자와 후위 ++ 연산자가 있습니다. 컴파일러와 약속된 함수는 operator++() 와 operator++(int) 입니다. #include using namespace std; class Point { public: Point(const int x, const int y); ~Point(); void Print() const; // 전위 ++, -- const Point& operator++(); const Point& operator--(); // 후위 ++, -- c..
const 멤버 함수는 멤버 함수 내에서 객체의 멤버 변수를 변경하지 않는다는 것을 보장하는 함수이다. 따라서 const 객체는 const 멤버 함수만 호출할 수 있다. const 멤버 함수에서 멤버 변수를 변경하면 컴파일 에러가 발생한다. 사실 자신의 멤버를 변경하지 않는 멤버 함수는 모두 const 멤버 함수여야만 한다. 다음은 cosnt 멤버 함수 예제이다. class Point{ public: Point(int _x=0, int _y=0) : x(_x), y(_y) {} int GetX() const { return x; } int GetY() const { return y; } void SetX(int _x) { x = _x; } void SetY(int _y) { y = _y; } void P..
C++ 입문자에게 STL은 책 끝부분 쯤에 다뤄지는 어렵고 불필요한 내용 정도로 인식되곤 한다. 그러나 STL은 C++ 프로그램 현장에서 광범위하게 사용된다. STL의 이해는 프로그램의 생산성과 직결되므로 간과해서는 안 된다.
WebGL 관련 https://webglfundamentals.org/webgl/lessons/ko/webgl-shadertoy.html WebGL Shadertoy Shadertoy 셰이더 webglfundamentals.org OpenGL 관련 https://learnopengl.com/Advanced-Lighting/Parallax-Mapping LearnOpenGL - Parallax Mapping Parallax Mapping Advanced-Lighting/Parallax-Mapping Parallax mapping is a technique similar to normal mapping, but based on different principles. Just like normal mappin..
멤버 변수와 멤버 함수 외에 클래스의 정의 안에 포함할 수 있는 것들이 있다. 그 중에서도 자주 사용하는 열거체와 typedef에 대해 알아보자. 열거체 클래스의 정의 안에 열거체를 넣는 것은 클래스 밖에서 정의하는 것과 크게 다르지 않다. 클래스에 소속된다는 점에서 차이가 있을 뿐이다. 예를 들어 클래스의 안에서만 사용하거나 클래스와 관련된 열거체의 경우에는 클래스의 소속으로 두는 것이 좋다. 관련된 것은 끌어 모을수록 좋은 것이다. 다음의 예제를 보자. x, y값의 범위를 열거체를 사용해서 정의했다. 상수 대신 심볼을 사용하면 소스 코드를 읽기도 쉽고 관리하기도 쉽다. #include #include using namespace std; class Point{ public: enum {MIN_X=0,..
다음 예제에서 유심히 봐야할 것은 생성자가 private으로 되어 있다는 점이다. 즉, 클래스의 외부에서 객체 생성하는 것은 불가능하다. 하지만 멤버라면 가능하다. 그래서 정적 멤버 함수에서 객체를 동적으로 생성해서 그 주소를 반환하게 만들었다. #include #include using namespace std; class Student{ public: string name; int sNo; void Print(); private: Student(const string& name_arg, int stdNumber); public: static int studentNumber; static Student* CreateStudent(const string& name_arg); }; int Student::..
c++ 상속을 공부하며 많이 보았던 키워드는 virtual 키워드일 것이다. virtual에 비하여 많이 보지 못했던 키워드는 override와 final 키워드일 것이다. override와 final 키워드는 c++11 이후에 등장하는 키워드라서 그렇다. 고로 오래된 c++ 책으로 공부를 했다면 virtual 키워드만 보았을 가능성이 높다. virtual, override, final은 모두 상속 관련하여 오버라이딩할 때 사용하는 키워드들이다. 조금씩 용도는 다르다. override와 final 키워드가 새롭게 추가된 이유를 한번 알아보고 각 키워드가 무엇을 뜻하는지 살펴보자. virtual 키워드 virtual 키워드는 가상 함수를 뜻한다. 가상함수에는 함수의 몸체를 정의하지 않는 순수 가상함수(추상..
일반적인 함수에 대한 포인터를 만들던 방식으로는 멤버 함수를 가리킬 수 없다. 멤버 함수에 대한 포인터를 만드는 문법은 조금 다르기 때문이다. #include using namespace std; // void XX() 형태의 함수에 대한 포인터 typedef void (*FP1)(int); // void Point::XX() 형태의 멤버 함수에 대한 포인터 typedef void (Point::*FP2)(int); int main(int argc, const char * argv[]) { Point pt(12, 34); FP1 fp1 = &Point::SetX; // 오류 FP2 fp2 = &Point::SetX; // 성공 // 함수 포인터를 사용해서 함수 호출 (pt.*fp2)(100); retur..
const 함수를 사용하는 이유 멤버 변수의 값을 변경하지 않는 멤버 함수 멤버 함수 안에 멤버 변수의 값을 변경하는 코드가 없다는 뜻이다. 멤버 변수의 값을 읽는 것은 상관 없다. 그렇다면 멤버 함수를 const로 만드는 것은 어떤 의미가 있을까? 크게 세 가지 정도의 의미를 찾아볼 수 있다. 다른 개발자가 "이 함수에는 멤버 변수의 값을 변경하지 않는구나" 라고 생각하게 만든다. 실수로 멤버 변수의 값을 바꾸려고 하면, 컴퓨터가 오류 메시지를 통해 알려준다. const 객체를 사용해서 이 함수를 호출할 수 있다. const Point pt(123, 234); 문법만 보면 기존에 기존 타입의 변수를 const로 정의하던 것과 다를 것이 없다. 기본 타입의 변수가 const라면 그 변수의 값을 바꿀 수가..
헤더 파일 구현 파일 클래스의 정의 인라인 멤버 함수 멤버 함수의 정의 정적 멤버 함수의 정의 정적 멤버 변수의 정의 인라인 함수는 새로운 종류의 함수가 아니고 함수의 속성이다. 멤버가 아닌 함수도 인라인이 될 수 있다. 왜 인라인 함수를 사용할까? 인라인 함수의 기본 개념은 함수를 호출하는 대신 함수의 내용을 그대로 옮겨 놓는 것이다. 아래의 예를 보자. #include #include using namespace std; inline void Func(){ cout
vim 튜토리얼 사이트 소개 https://github.com/johngrib/simple_vim_guide GitHub - johngrib/simple_vim_guide: simple vim guide simple vim guide. Contribute to johngrib/simple_vim_guide development by creating an account on GitHub. github.com https://www.openvim.com Interactive Vim tutorial / www.openvim.com
cmake 튜토리얼 사이트 https://www.tuwlab.com/27260 [CMake 튜토리얼] 2. CMakeLists.txt 주요 명령과 변수 정리 - ECE - TUWLAB ▶ 이 글에서는 CMake 빌드 스크립트인 CMakeLists.txt 파일을 작성하는 방법에 대해 다룹니다. CMake 2.8.x 버전 기준이며, C언어 프로젝트를 기준으로 자주 사용되는 명령과 변수들을 선별하여 기능에 www.tuwlab.com https://www.tuwlab.com/27270 [CMake 튜토리얼] 3. CMakeLists.txt 기본 패턴 - ECE - TUWLAB ▶ 이 글에서는 복붙으로 바로 활용할 수 있는 CMakeLists.txt 빌드 스크립트의 기본 패턴을 제시합니다. 빌드 결과물이 실행 바..
비트 필드(Bit Fields)를 사용하면 구조체의 멤버가 차지하는 메모리 공간을 원하는 데로 조절할 수 있다. 예를 들면 멤버 a는 3비트만, b는 4비트만 차지하게 만드는 것이 가능하다. struct Flags { int a : 3; int b : 4; bool c : 1; }; 비트 필드를 사용하는 멤버는 정수 타입만 가능한데, 멤버의 뒤에 적힌 숫자가 멤버가 차지할 비트 수를 의미하게 된다. 즉 위의 구조체를 사용해서 변수를 정의하게 되면 다음과 같은 메모리 구조를 갖게 된다. 중간에 사용하지 않는 비트를 넣고 싶을 때는 멤버의 이름을 적어주지 않으면 된다. 이렇게 해주면 중간에 5비트는 사용하지 않은 채로 남게 된다. struct Flags { int a : 3; int b : 4; int : ..
// point vop - snippet node float pi = 3.1415926535897932384; float dx = end[0] - start[0]; float dy = end[1] - start[1]; float coord0, coord1, coord2, coord3; vector4 coords4d; if(type == "simplex" || type == "perlin"){ float total = 0; float amplitude = max_amplitude; float max_value = 0; for(int i = 0; i
포인터 변수를 정의할 때는 const를 최대 2개까지 포함할 수 있다. 그 이유는 포인터 변수는 2개의 정보와 관련이 있기 때문이다. 하나는 포인터 변수 자체에 보관된 정보다. 그리고 다른 하나는 포인터가 가리키는 변수에 보관된 정보를 말한다. 즉, 이 두 가지 정보에 대해서 const 여부를 설정할 수 있는 것이다. int a = 10; int b = 20; const int* p = &a; p = &b; // ok *p = 30; // fail 맨 앞에 const를 추가했다. 이렇게 한 것은 "p가 가리키는 변수는 const int 타입니다"라는 의미가 된다. 따라서 p가 가리키는 변수의 값을 바꾸는 것을 허용하지 않게 된다. p가 가리키는 변수는 실제로 const속성을 가졌는지는 중요하지 않다. 다..
바탕화면 설정 시에 '16비트(트루컬러)'라는 용어를 접해봤을 것이다. 16비트 컬러의 의미는 점 하나를 표시하는데 16비트를 사용한다는 뜻이다. 즉, 16비트가 표현할 수 있는 상태의 수 만큼이나 다양한 색상을 표현할 수 있다는 의미이다. 컴퓨터 상에서 색상을 표현할 때는 보통 빛의 3요소인 빨강(Red), 초록(Green), 파랑(Blue), 즉 RGB를 기본 원소로 사용한다. 이 R, G, B 각각의 밝기에 따라서 여러 가지 색깔이 만들어지는 것이다. 16비트 컬러의 경우에는 이 R, G, B 각각의 밝기가 16비트 안에 모두 포함되어야 한다. 그래서 R, G, B가 보통 5비트, 6비트, 5비트씩 할당된다 (각각 5비트씩 할당하고 1비트는 쓰지 않는 경우도 있다). 그래서 R과 B는 2의5승 단계..
#include #include using namespace std; int main() { char c = 1; short int si = 2; int i = 4; cout
나는 무엇인가를 학습할 때, 무작정 하기보다는 시간 별로 기록하면서 학습을 진행한다. 이렇게 하였을 때 장점으로는 잉여 시간을 확실하게 줄일 수 있다. 30분동안의 나의 행동을 점수로 매겨 해당 점수를 준 이유와 보완할 것을 기록한다. 그런데... 5점을 주는 경우가 별로 없다... 아주 간혹 있다... 아주 간혹. 이렇게 내가 무엇을 했는지 기록하여 본다면, 내가 학습할 대상에 더욱 집중하게 된다. 그리고 1시간 단위가 아닌 30분 단위로 한 이유는 조금 더 세세하게 기록하기 위함도 있고 1시간 동안 오직 한 가지 학습에 집중할 수가 없기 때문이다. 인간이 집중할 수 있는 시간은 15분이라고 알고 있다. 따라서 15분 단위로 기록하면 더욱 좋다. 하지만 나는 30분 단위로 하였다. 칸 수가 너무 많아져..