Concurrent computing is a form of computing in which several computations are executed concurrently—during overlapping time periods—instead of sequentially—with one completing before the next starts1. 어떠한 프로그래밍 로직이 요청한 결과를 순차적으로 처리하는 것이 아닌 여러 곳의 요청을 동시에 처리하는 것을 말한다.
Concurrency는 Parallelism의 난해함을 풀어낸 방법2인데 대표적인 것이 Coroutine(C#, Unity)이다. Rust 프로그래밍에서 Concurrency 예제3와 Go 프로그래밍에서 Concurrency 예제4는 과거 포스팅한 글에서 볼 수 있다. 이번 예제는 Qt(C++)에서 Concurrency를 구현하는 간단한 예제를 VoidRealms5강좌를 통해 소개하였다.
cmake_minimum_required(VERSION 3.14)
project(QtExam LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(QT NAMES Qt6 Qt5 COMPONENTS Core
Concurrent REQUIRED)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core
Concurrent REQUIRED)
add_executable(QtExam
main.cpp
)
target_link_libraries(QtExam Qt${QT_VERSION_MAJOR}::Core
Qt${QT_VERSION_MAJOR}::Concurrent)
#set_target_properties(QtExam PROPERTIES WIN32_EXECUTABLE TRUE)
Delegate(델리게이트, 대리자)는 C#에서 매우 중요한 개념이다. Delegate는 CLI(Common Language Infrastructure)에서 사용하는 Type-safe function pointer의 한 형태1라고 설명할 수 있다.
Method를 참조하여 호출하기에 콜백 및 이벤트 리스너2를 구현하는 데 사용한다. C++의 함수 포인터3와 같은 개념이라고 보면 된다. 단순하게 설명하면 int, string 타입처럼 함수를 변수처럼 선언하거나 함수의 파라미터로 활용4할 수 있게 해주는 것이다.
아래의 코드(소스)는 델리게이트, 함수포인터의 개념을 이해하고 이를 활용하는 예제이다. Delegate의 형태에는 Action, Func, Predicate5가 있다.
// Lambda와 함께 LINQ를 사용할 수 있는 이유 : Delegate (Action, Func, Predicate)
List<int> list = new() { 2, 3, 4, 5, 6, 7 };
list.Where(x => x > 5).ToList().ForEach(Console.WriteLine);
기본적으로 ASP.NET Core는 클래스와 해당 종속성 간의 IoC(Inversion of Control)를 실현하는 기술인 DI(종속성 주입) 소프트웨어 디자인 패턴을 지원1한다.
Desktop 애플리케이션 개발에 자주 사용하는 WPF는 개발자가 직접 작성하여 추가하거나 또는 MVVM 패턴을 지원하는 Caliburn.Micro2와 같은 프레임워크를 사용하여 DI(종속성 주입) 환경을 구축한다.
WPF를 이용한 개발에 DI를 적용하는 기본적인 환경 구성을 Microsoft.Extensions.Hosting 패키지를 이용(IHost Interface3)하여 구축할 수 있다.
<Application x:Class="ExamHelloDI.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!-- StartupUri="MainWindow.xaml" : 기본값 제거-->
<Application.Resources>
</Application.Resources>
</Application>