전체 글 116

객체 지향(OOP)

객체 지향 프로그래밍의 여러가지 이점이 있다. 가장 큰 이점은 프로그램을 보다 유연하고 변경이 용이하게 만들 수 있다는 것. 객체 지향은 코드 변경을 최소화하고 유지보수를 하는데 유리하다. 객체는 자동차와 같은 하나의 객체를 추상화 시켜 속성과 기능으로 분류하고 이것을 변수와 함수로 정의한다. 객체지향의 4가지 특징. 1. 추상화 불필요한 세부 사항들은 제거하고 가장 본질적이고 공통적인 부분만을 추출하여 표현. 어떤 객체가 수행해야하는 핵심적인 역할만을 규정해두고, 실제 구현은 해당 인터페이스를 구현하는 각각의 하위 클래스에서 하도록 설계하는 것. 이렇게 함으로써 자동차와 오토바이의 전진이 다른 방식으로 움직이듯이 다른 형태의 구현을 가능하도록하고 코드간의 직접적인 결합도를 낮추게 할 수 있다. 아래는 ..

C++ 2023.10.02

Lambda(람다)

람다의 구성 람다는 위 그림과 같이 4 개의 부분으로 구성되어 있다. 그 4 개의 부분은 각각 개시자 (introducer), 인자(parameters), 반환 타입 (return type), 그리고 함수의 몸통 (statement) 라 한다. 일단, 람다 맨 처음에 나타나는 [] 는 개시자로, 그 안에 어떤 외부 변수를 써 넣는다면 람다 함수가 이를 캡쳐 해서, 이 변수를 람다 내부에서 이용할 수 있게 된다. 위 경우 my_mod 라는 변수를 람다 내부에서 이용할 수 있게 된다. 그 다음의 () 는 람다가 실행시 받을 인자들을 써 넣는다. 위 람다는 int 형의 v_ 를 인자로 받는다. 여기는 그냥 실제로 함수에서 사용하는 인자 리스트와 동일하게 적어주면 된다. 이제, 그 옆으로 보면 -> 가 있고 반..

C++ 2023.10.01

메모리 단편화

: 메모리 공간이 작은 조각으로 나뉘어져 사용가능한 메모리가 충분히 존재하지만 할당이 불가능한 상태 내부 단편화 : 메모리를 할당할 때 프로세스가 필요한 양보다 더 큰 메모리가 할당되어서 프로세스에서 사용하는 메모리 공간이 낭비되는 상황. ex) 할당을 요구하는 프로세스는 1kb만 필요하지만 운영체제가 4kb를 할당해 주었다면 내부단편화가 3kb 발생한 것 외부 단편화 : 메모리가 할당되고 해제되는 작업이 반복될 때 작은 메모리가 중간중간 존재하게 된다. 이 때 중간중간에 생긴 사용하지 않는 메모리가 많이 존재해서 총 메모리 공간은 충분하지만 실제로 할당할 수 없는 상황. ex) 20kb의 공간중 5kb, 8kb 5kb의 세 프로세스가 할당을 받았는데 5kb의 두 프로세스가 메모리 할당을 해제하게 되면 ..

컴퓨터 지식 2023.10.01

Caching(캐싱)

캐시는 데이터의 지역성이라는 특성을 이용해서 성능 개선을 달성한다. 지역성에는 공간 지역성과 시간 지역성이 존재하는데, 공간 지역성은 한 번 접근한 데이터의 인근에 저장되어 있는 데이터가 다시 접근될 가능성이 높은 특성을 의미한다. 시간 지역성은 한 번 접근된 데이터가 가까운 시간내에 다시 접근될 가능성이 높다는 의미. 즉, 자주 쓰거나 쓸 가능성이 높은 데이터를 캐시메모리에 저장한여 빠르게 접근해서 사용할 수 있게하는 것. - 데이터를 어떻게 두느냐가 성능에 영향을 미침 - 자료구조를 잘 만들어서 처리하려는 값이 메모리 내에서 서로 가까이 붙어 있도록 하는 것이 유리 - 만약 멀테스레드 애플리케이션에서 근처 데이터를 고쳐야 한다면, 코어마다 다른 캐시라인에 데이터를 두는게 빠르다. 두 스레드에서 같은 ..

컴퓨터 지식 2023.10.01

좌측값(lvalue) & 우측값(rvalue)

좌측값은 어떠한 메모리 위치를 가리키는데 &연산자를 통해 그 위치를 참조할 수 있다. 우측값은 좌측값이 아닌 값들이다. 우측값 참조라 정의한 것들도 좌측값 혹은 우측값이 될 수 있다. 이를 판단하는 기준은 만일 이름이 있다면 좌측값, 없다면 우측값이다. 우측값 레퍼런스 참조: https://modoocode.com/189 씹어먹는 C++ 토막글 ① - Rvalue(우측값) 레퍼런스에 관해 함수의 오버로딩에서 void foo(X& x); 는 좌측값 참조 오버로딩, void foo(X&& x); 은 우측값 참조 오버로딩 여러분은 이를 통해 foo 가 좌측값에, 혹은 우측값에 호출됨에 따라서 상황을 적절하게 처리할 modoocode.com

C++ 2023.10.01

Unreal Reflection(언리얼 프로퍼티 시스템)

공식문서의 내용 C++ 는 어떠한 형태의 리플렉션도 지원하지 않아, 언리얼에는 자체적으로 C++ 클래스, 구조체, 함수, 멤버 변수, 열거형 관련 정보를 수집, 질의, 조작하는 별도의 시스템이 구축되어 있다. 전형적으로 이러한 리플렉션은 '프로퍼티 시스템'이라고 부르는데, '리플렉션'은 그래픽 용어이기도 하기 때문. 리플리케이션 시스템은 옵션입이다. 리플렉션 시스템에 보이도록 했으면 하는 유형이나 프로퍼티에 주석을 달아주면, Unreal Header Tool (UHT)가 그 프로젝트를 컴파일할 때 해당 정보를 수집한다. 헤더에 리플렉션이 있는 유형으로 마킹을 하려면, 파일 상단에 특수한 include 를 추가해 줘야 한다. 그러면 리플렉션이 있는 유형은 이 파일을 고려해야 함을, 시스템 구현에도 필요함을..

Unreal Engine 2023.10.01

Condition_Variable(조건 변수)

다른 스레드가 공유 변수를 수정하고 Condition_Variable로 통지할 때까지 스레드나 여러 스레드를 대기하도록 하는데 사용할 수 있는 동기화 기법 C++의 조건 변수(Condition Variable)는 멀티스레딩 환경에서 스레드 간 동기화와 통신을 위한 중요한 도구 중 하나다. 조건 변수는 C++의 표준 라이브러리인 `` 헤더에서 제공된다. 조건 변수는 주로 다음과 같은 상황에서 사용된다: 1. 스레드 대기(Waiting): 하나 이상의 스레드가 특정 조건이 충족될 때까지 대기하도록 만든다. 이 조건은 다른 스레드가 어떤 작업을 마치고 조건 변수를 통해 대기 중인 스레드에게 신호를 보낼 때까지 대기한다. 2. 스레드 깨우기(Notify): 조건이 충족되었을 때, 다른 스레드에게 대기 중인 스레..

C++ 2023.09.30

RAII(Resource Acguisition Is Initialization)

SBRM(Scope Bound Resource Management)이 RAII의 다른 이름: 핵심 개념은 파괴인데 이름이 초기화라 다른 이름이 생김 자원의 안전한 사용을 위해 객체가 쓰이는 스코프를 벗어나면 자원을 해제해 주는 기법ex) std::unique_ptr, lock_guard 의 개념이 여기에 해당 C++에서 heap에 할당된 자원은 명시적으로 해제하지 않으면 해제되지 않지만, stack에 할당된 자원은 자신의 Scope가 끝나면 메모리가 해제되며, 소멸자가 불리는 원리를 이용-> 자원 관리를 스택에 할당한 객체를 통해 수행 예시)스마트 포인터는 소유하는 메모리의 할당 및 삭제를 처리한다. 스마트 포인터를 사용하면 클래스에서 명시적 소멸자를 widget 사용할 필요가 없다.#include cl..

C++ 2023.09.30