no image
[선형대수] 1. 벡터
벡터의 개념벡터를 바라보는 시각은 크게 3가지가 존재한다. 물리학자공간상의 한 화살표 = 길이 + 방향컴퓨터 과학자숫자의 나열을 의미하며 배열, 리스트와 같은 자료구조를 떠올리면 된다.수학자 물리학자와 컴퓨터 과학자의 관점을 합치려(일반화) 한다. "연산만 성립하면 벡터"라는 관점이지만 추상적인 관점이라 3Blue 1Brown은 시리즈 막바지까지 이 관점에 대해선 무시하는 것이 정신 건강에 좋다고 한다. 공부를할 때는 꼬리가 원점에 고정된 화살표를 떠올리자. 벡터의 좌표는 한 쌍의 숫자이며 벡터의 머리가 꼬리로부터 얼마나 떨어져 있는지를 나타낸다. 첫 번째 숫자는 x축을 따라 얼마나 움직였는지를 의미하며, 양수는 오른쪽 움직임을 가리키고, 음수는 왼쪽 움직임을 가리킨다. 두 번째 숫자는 y축에 나란히 얼..
2026.05.09
절차적 프로그래밍(Procedure programming)
절차적 프로그래밍(Procedure programming)절차적 프로그래밍은 처리(processing) 과정과 그에 적합한 자료 구조의 설계에 초점을 맞춘 프로그래밍 패러다임(스타일)이다. 이는 C가 지원하도록 설계된 방식이다. C++에서 이를 지원하는 수단은 내장 타입(built-in types), 연산자, 문(statements), 함수, 구조체(struct), 공용체(union) 등이 있다. 사소한 예외를 제외하면, C는 C++의 부분집합(subset)이다. C와 비교했을 때, C++은 많은 추가적인 언어 구성요소와 더 엄격하고 유연한 지원적인 타입 시스템의 형태로 절차적 프로그래밍에 대한 추가적인 지원을 한다.Stroustrup, B. (2013). The C++ Programming Langua..
2026.05.01
[OpenGL] 삼각형 렌더링 구현코드와 필요한 정보의 설명
들어가며컴퓨터 그래픽스는 입문 장벽이 높은 영역 중 하나라고 생각한다. 이는 해당 도메인의 난이도 자체의 문제도 있지만, 한글로 된 자료가 부족하고, 선형 대수 연산의 기하학적인 감을 어느 정도는 잡고 있어야 하기 때문인 것 같다. 또한 코드를 작성할 떄도 managed 언어로 입문하거나, 이에 더 적응이 많이 되어있는 사람들에게는 C++이라는 언어 자체도 입문 장벽을 높이는데 기여를 꽤나 하게 된다. 여러 LLM 서비스들이 활성화되어 학습에 매우 도움이 되지만, 그래도 레퍼런스로 잡고갈만한 학습 자료는 매우 중요하다. 이에 대한 갈증을 Rinthel Kwon 교수님께서 해소시켜 주셨으며, 이에 대해 감사인사를 포스팅을 작성하며 남긴다. VScode 기반에서 CMake로 C++ 프로젝트를 운용하고 컴퓨터..
2026.03.22
[CMake] if 명령 조건 활용 방식
if 명령 조건 활용 방식 전체 코드 구조cmake_minimum_required(VERSION 3.19)set(CMAKE_CXX_STANDARD 17)project(if_command_test)set(SDK_ROOT "")if (NOT DEFINED SDK_ROOT) message("SDK ROOT 없음")else() message("SDK ROOT 존재함")endif()add_executable(${PROJECT_NAME} main.cpp) 1. 변수 존재 확인 방법if 안의 DEFINED 키워드는 주어진 을 가진 변수, 캐시 변수, 환경 변수가 정의되어있으면 참을 반환한다. 변수의 실제 값은 중요하지 않다.set(SDK_ROOT "")if (NOT DEFINED SDK_ROOT) ..
2026.02.04
[CMake Study] 2. First Step, CMake Stages (CGold)
Native build toolCMake는 빌드를 스스로 하려고 디자인된 도구가 아니다. 이는 실제 native build tool 파일을 생성한다. 그러므로 CMake를 사용할 때는 도구를 선택하고 필요하다면 설치해야 한다. 옵션 `-G `은 사용할 제너레이터의 타입을 지정할 때 사용된다. 만약 옵션이 없다면, CMake는 디폴트 제너레이터를 사용할 것이다. (예를 들어, nix 플랫폼이라면 `Unix Makefiles`) 사용 가능한 제너레이터 목록은 호스트 운영체제에 따라 달라진다(예: Visual Studio 계열 제너레이터는 Linux에서는 사용할 수 없다). 이 목록른 `cmake --help`명령을 통해 얻을 수 있다. > cmake --help...GeneratorsThe following..
2026.01.24
no image
[CMake Study] 1.Overview - What can’t be done with CMake (CGold)
CMake로 할 수 없는 것들CMake도 장점과 단점이 존재한다. 그래도 여기서 언급되는 대부분의 단점들은 평소 워크플로우와는 조금 다른 방식으로 접근하면 우회해서 해결할 수 있다. 전체 그림을 놓고 생각해보면 CMake 장점이 단점보다 훨씬 더 크다. CMake의 언어 및 문법 관점CMake 언어는 다른 어떤 언어와도 쉽게 비교할 수 있는 종류의 언어는 아니다. 클래스, 맵, 가상 함수, 람다는 존재하지 않는다. 심지어 함수의 입력 매개변수들을 파싱하는 것이나 함수로부터 값을 반환하는 기본 작업 또한 쉽지 않다. 일반 프로그래밍 언어처럼 알고리즘 구현이나 JSON 응답 처리같은 기능을 구현할만한 언어는 절대 아니다. 하지만 일반적인 개발 작업을 다루는 데에는 아주 효율적이다. 만약, 비표준적인 행위를 ..
2026.01.21
no image
[CMake Study] 1. Overview - What CMake can do
OverviewCMake는 meta build sytstem이다. 이는 추상화된 텍스트 구성(configuration))으로부터 실제로 native build tool 파일을 생성한다. 대개 이 코드들은 `CMakeLists.txt` 파일에 있다. 서로 다른 플랫폼/IDE에서 공유디는 C++ 프로젝트가 포함된 크로스 플랫폼 프로젝트가 있다고 가정해보자. Windows에서는 Visual studio, OSX에서는 Xcode, Linux에서는 Makefile을 사용한다고 하면 `bar.cpp`를 추가하기 위해 각각 다른 tool에 일일히 파일을 새로 추가해야 한다. 특히 빨간색 화살표는 수동으로 해야하는 작업을 의미한다. 일관된 환경을 유지하기 위해 비슷한 업데이트를 여러 번 반복해야하며, 이를 수동으로 수..
2026.01.21
[OpenGL] glPointSize()의 값 지정
문제 상황pointSize_를 어떻게 지정하던간에, 시각화되는 포인트의 크기가 1.0~1.4이라도 시각적으로 동일하게 보이고, 1.5~2.4도 동일해 보인다. 셰이더 안에서 point 크기를 다루어도 동일한 현상이 발생한다. glPointSize(pointSize_);glDrawArrays(GL_POINTS, 0, points.size()); 공식 설명glPointSize함수는 점의 래스터화 된 지름을 정한다고 한다. point size 모드가 비활성화된 경우 (`GL_PROGRAM_POINT_SIZE`를 사용하는 `glEnable` 참조) 이 값이 점을 래스터화 하는데 사용된다. 그렇지 않으면`glEnable(GL_PROGRAM_POINT_SIZE)` 인 경우, 셰이딩 언어 내장 변수 `gl_Point..
2025.12.30
[C++] 전역 변수, 내부 연결, 외부 연결, 헤더 include 주의점
전역 변수, 내부 연결, 외부 연결전역 변수전역 변수는 가급적 사용하지 않는 것이 좋지만, 부득이하게 사용해야 하는 경우가 발생하는데 그때 그때 상황이 다르다. 결국 어떻게, 사용해야할지는 프로그래머 본인들이 결정해야 한다. 전역 변수의 name hiding전역 변수와 똑같은 이름으로 선언된 지역 변수가 있으면 name hiding이 수행되어, 지역 변수가 우선적으로 사용된다. 만약 전역 변수의 값에 대해 접근하고 싶으면 `::` global scope operator를 통해 전역 변수에 접근할 수 있ㄷㅇ아.#include using namespace std;// name hiding int value = 123;int main(){ cout Linkage지역 변수의 경우 linkage가 없다..
2025.12.20
[C++] 함수 내의 static 변수 선언
staticstatic 의미를 이해할 때, C언어를 만든 사람입장(컴퓨터 구조, 어셈블러)에서 보면 이해하는게 조금 쉽다. static 변수는 os로부터 받은 "메모리"가 정적으로 선언된다는 것이 static이라는 것이다. 동적할당에 대비하여 생각하면 더 와닿을 것이다. 함수 내의 static 변수 선언static으로 함수 내의 변수가 선언되면 해당 함수 영역에서 변수가 선언될 때 같은 메모리를 쓰고, 초기화를 한 번 밖에 안한다.void doSomething(){ static int a = 1; ++a; cout doSomething()함수를 몇 번 호출하고 VS의 디버거를 통해 함수 내의 선언된 변수 a를 살펴보면, 함수 스코프에서 나와도 조사식에 값이 남아있는 것을 볼 수 있다. (F11이 아닌..
2025.11.30
[C++] int8_t, int_least8_t and int_fast8_t 차이
int8_t, int_least8_t and int_fast8_t 차이해당 차이점은 Carl Norum이 인용한 C99 표준의 섹션에 정의되어있다. 하지만 예제를 통해 이해하는 것이 도움이 될 수 있다. 우리가 36-bit system에 대한 C컴파일러를 가지고 있다고 가정해보자. `char` = 9bits, `short`=18bits, `int`=36bits, `long` = 72 bits 라면,`int8_t`는 존재하지 않는다. 이는 패딩없이 정확히 8bit를 가진다는 제약을 만족시키지 못하기 때문이다.`int_least8_t`는 `char`의 typedef이다. `short`나 `int`가 아니다. 표준은 최소 8bit를 가지면서 가장 작은 타입을 요구하기 때문이다.`int_fast8_t`는 무엇이..
2025.10.05
[C++] 변수 초기화 방식
Copy Initializationint a = 123; Direct Initializationint a(123); Unifrom Initializationint b {123}; direct와 unifrom 초기화는 사용자 정의 데이터 타입을 초기화 할 때 많이 사용한다. 최근에는 uniform 초기화를 권장한다는 소리가 있다. 이는 uniform 초기화 방식이 더 엄격하기 때문이다. 예를 들어, Direct 초기화 방식을 사용하면,#include using namespace std;int main(){ int a(3.14); return 0;} 에러가 아닌 warning 메시지만 띄운다. 출력 또한 3으로 잘된다. 이는 Copy 초기화 방식도 동일하다. 하지만, unifrom으로 초기..
2025.09.25