<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>https://wiki.conaondaapps.com/index.php?action=history&amp;feed=atom&amp;title=C%2B%2B_%EC%84%A0%EC%96%B8%ED%98%95_%EB%8D%B0%EC%9D%B4%ED%84%B0_%EC%B2%98%EB%A6%AC</id>
	<title>C++ 선언형 데이터 처리 - 편집 역사</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.conaondaapps.com/index.php?action=history&amp;feed=atom&amp;title=C%2B%2B_%EC%84%A0%EC%96%B8%ED%98%95_%EB%8D%B0%EC%9D%B4%ED%84%B0_%EC%B2%98%EB%A6%AC"/>
	<link rel="alternate" type="text/html" href="https://wiki.conaondaapps.com/index.php?title=C%2B%2B_%EC%84%A0%EC%96%B8%ED%98%95_%EB%8D%B0%EC%9D%B4%ED%84%B0_%EC%B2%98%EB%A6%AC&amp;action=history"/>
	<updated>2026-08-20T17:03:30Z</updated>
	<subtitle>이 문서의 편집 역사</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://wiki.conaondaapps.com/index.php?title=C%2B%2B_%EC%84%A0%EC%96%B8%ED%98%95_%EB%8D%B0%EC%9D%B4%ED%84%B0_%EC%B2%98%EB%A6%AC&amp;diff=5&amp;oldid=prev</id>
		<title>Admina7ec671ac513: migrate: import legacy Wiki content to Vultr</title>
		<link rel="alternate" type="text/html" href="https://wiki.conaondaapps.com/index.php?title=C%2B%2B_%EC%84%A0%EC%96%B8%ED%98%95_%EB%8D%B0%EC%9D%B4%ED%84%B0_%EC%B2%98%EB%A6%AC&amp;diff=5&amp;oldid=prev"/>
		<updated>2026-08-20T04:18:20Z</updated>

		<summary type="html">&lt;p&gt;migrate: import legacy Wiki content to Vultr&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;C++ 선언형 데이터 처리&amp;#039;&amp;#039;&amp;#039;는 반복문과 임시 컨테이너로 처리 순서를 직접 작성하는 대신, 필터·변환·정렬·집계 같은 원하는 결과를 연속된 연산으로 표현하는 방식이다. [https://github.com/jeb2239/CINQ CINQ]는 Microsoft LINQ의 메서드 구문을 C++에 옮긴 교육·연구 성격의 구현이다.&lt;br /&gt;
&lt;br /&gt;
== 개요 ==&lt;br /&gt;
CINQ는 &amp;#039;&amp;#039;C++ Integrated Query&amp;#039;&amp;#039;의 약자이며 “sink”로 읽는다. Bjarne Stroustrup의 Language Library Design 수업에서 만든 클래스 프로젝트로, C++ 템플릿과 당시의 Concepts 구현을 활용해 LINQ와 비슷한 질의 인터페이스를 제공한다. 저장소의 대표 예제는 비가 온 날을 고르고, 최저 기온으로 정렬하고, 앞의 다섯 개만 취한 뒤, 기온 값으로 변환하는 코드를 하나의 체인으로 표현한다.&lt;br /&gt;
&lt;br /&gt;
명령형 구현은 필터 결과, 정렬 결과, 상위 N개, 최종 값마다 벡터와 반복문을 따로 만들기 쉽다. CINQ 표현은 &amp;lt;code&amp;gt;from&amp;lt;/code&amp;gt; 뒤에 &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;order_by&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;take&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;select&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;to_vector&amp;lt;/code&amp;gt;를 이어 붙여 데이터가 어떤 단계를 통과하는지 읽게 한다. 선언형이라는 말은 실행 비용이 사라진다는 뜻이 아니라, 제어 흐름보다 데이터 변환의 의도를 API에 드러낸다는 뜻이다.&lt;br /&gt;
&lt;br /&gt;
== 핵심 구조/작동 방식 ==&lt;br /&gt;
질의는 &amp;lt;code&amp;gt;cinq::from(container)&amp;lt;/code&amp;gt;에서 시작한다. &amp;lt;code&amp;gt;from&amp;lt;/code&amp;gt;은 입력 시퀀스에 관한 정보를 가진 &amp;lt;code&amp;gt;enumerable&amp;lt;/code&amp;gt; 객체를 값으로 만들고 원본 컨테이너의 반복자를 얻는다. 이어지는 메서드는 &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt; 연산자로 연결되고 마지막에 &amp;lt;code&amp;gt;to_vector&amp;lt;/code&amp;gt; 같은 연산으로 결과를 받는다. 설계 문서는 다른 C++ LINQ 구현에서 사용하는 &amp;lt;code&amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;lt;/code&amp;gt;보다 점 연산자가 초보자에게 익숙하고 메서드 체인의 의미를 분명히 한다고 설명한다.&lt;br /&gt;
&lt;br /&gt;
구현된 핵심 연산에는 매핑을 수행하는 &amp;lt;code&amp;gt;select&amp;lt;/code&amp;gt;, 조건을 만족하는 항목을 남기는 &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;, 단일 항목을 요구하는 &amp;lt;code&amp;gt;single&amp;lt;/code&amp;gt;, 조건 검사인 &amp;lt;code&amp;gt;any&amp;lt;/code&amp;gt;와 &amp;lt;code&amp;gt;all&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;min&amp;lt;/code&amp;gt;·&amp;lt;code&amp;gt;max&amp;lt;/code&amp;gt;·&amp;lt;code&amp;gt;sum&amp;lt;/code&amp;gt;·&amp;lt;code&amp;gt;average&amp;lt;/code&amp;gt;, 구간을 자르는 &amp;lt;code&amp;gt;take&amp;lt;/code&amp;gt;와 &amp;lt;code&amp;gt;skip&amp;lt;/code&amp;gt;, 위치 접근인 &amp;lt;code&amp;gt;element_at&amp;lt;/code&amp;gt;·&amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt;·&amp;lt;code&amp;gt;last&amp;lt;/code&amp;gt;, 시퀀스 결합인 &amp;lt;code&amp;gt;concat&amp;lt;/code&amp;gt;, 정렬인 &amp;lt;code&amp;gt;order_by&amp;lt;/code&amp;gt;, 순서를 뒤집는 &amp;lt;code&amp;gt;reverse&amp;lt;/code&amp;gt;가 있다. 숫자 시퀀스에는 매퍼를 생략한 집계 오버로드를 제공한다.&lt;br /&gt;
&lt;br /&gt;
CINQ의 &amp;lt;code&amp;gt;order_by&amp;lt;/code&amp;gt;는 C# LINQ의 &amp;lt;code&amp;gt;OrderBy&amp;lt;/code&amp;gt;와 &amp;lt;code&amp;gt;ThenBy&amp;lt;/code&amp;gt;를 별개 체인으로 두지 않고 여러 매핑 람다를 한 호출에 받는다. 내부에서는 람다를 재귀적으로 조합해 비교 함수를 만들고 &amp;lt;code&amp;gt;std::stable_sort&amp;lt;/code&amp;gt;에 전달한다. 첫 번째 키가 같으면 다음 키로 비교하는 방식이다. 템플릿 제약은 매퍼를 항목에 호출할 수 있는지, 반환값이 정렬 가능한지 등을 컴파일 시점에 확인하려는 장치이다.&lt;br /&gt;
&lt;br /&gt;
설계상 모든 단계가 지연 평가되는 것은 아니다. 공식 설계 문서의 메모리 흐름에 따르면 &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;는 필터 결과를 담을 새 벡터를 만들고, &amp;lt;code&amp;gt;to_vector&amp;lt;/code&amp;gt;는 그 데이터를 복사해 반환한다. 입력 컨테이너는 질의 중 파괴되거나 수정되지 않는다는 전제가 있다. 따라서 간결한 표기와 별개로 중간 할당과 복사 비용을 이해해야 한다. 프로젝트는 일부 연산에서 컨테이너의 반복자 종류에 따라 더 효율적인 구현을 선택하도록 Concepts 기반 오버로드를 사용했다.&lt;br /&gt;
&lt;br /&gt;
오류 처리에서는 결과와 혼동될 수 있는 특수 숫자를 반환하지 않고, 전제 조건이 맞지 않으면 설명이 있는 예외를 던진다. 빈 시퀀스의 평균처럼 정의할 수 없는 연산은 &amp;lt;code&amp;gt;length_error&amp;lt;/code&amp;gt;를 발생시키며, 음수를 &amp;lt;code&amp;gt;size_t&amp;lt;/code&amp;gt;로 잘못 변환하는 문제를 피하려고 정수 인자를 검사하는 오버로드도 둔다. 원시 포인터와 명시적 &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt;를 피하고 STL 컨테이너의 수명 관리에 의존하는 것도 설계 원칙이다.&lt;br /&gt;
&lt;br /&gt;
== 활용 ==&lt;br /&gt;
짧은 인메모리 데이터 전처리, 로그 레코드 필터링, 센서 샘플 정렬과 집계, UI 모델에서 조건에 맞는 항목을 뽑는 코드에 선언형 체인을 적용할 수 있다. 업무 규칙을 &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;와 &amp;lt;code&amp;gt;select&amp;lt;/code&amp;gt; 람다로 분리하면 반복문 안에 조건과 변환이 뒤섞이는 문제를 줄인다. 테스트에서는 각 단계의 입력과 출력을 작게 검증할 수 있고, 복잡한 파이프라인은 이름 있는 람다나 함수로 쪼개 의미를 보존할 수 있다.&lt;br /&gt;
&lt;br /&gt;
개념적으로는 [[Python 개발 환경 베스트 프랙티스]]에서 말하는 명확한 모듈 경계, [[.NET 머신 러닝 프레임워크]]의 학습·변환 API처럼 연산의 의도를 인터페이스로 노출한다. 다만 CINQ를 채택하는 것과 C++ 표준 라이브러리의 알고리즘·ranges를 사용하는 것은 별도 선택이다. 기존 코드의 컴파일러, 성능, 유지보수 조건을 기준으로 작은 벤치마크와 프로토타입을 먼저 만드는 편이 안전하다.&lt;br /&gt;
&lt;br /&gt;
== 한계 및 주의점 ==&lt;br /&gt;
CINQ는 수업 프로젝트이며 공식 README에는 안정 릴리스, 패키지 배포, 장기 지원 정책이 제시되어 있지 않다. 설계 문서는 현대 C++ Concepts가 표준화되기 전의 실험적 도구 체인을 전제로 작성되었다. 현재 컴파일러에 그대로 빌드되는지, 소스가 요구하는 Concepts 문법과 표준 라이브러리 구현이 호환되는지는 직접 확인해야 한다. 저장소의 설정 문서 역시 당시 환경을 반영한다.&lt;br /&gt;
&lt;br /&gt;
메서드 체인이 언제나 더 빠르거나 메모리를 적게 쓰는 것은 아니다. 공식 성능 표에서도 연산 조합별 오버헤드가 서로 달랐고, &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;와 결과 변환은 중간 벡터와 복사를 만들 수 있다. 큰 데이터, 스트리밍 입력, 이동 불가능한 객체에는 수명과 물질화 비용이 중요하다. 긴 체인은 디버깅 지점을 숨길 수 있으므로 중간 결과의 크기, 예외, 정렬 기준을 관찰할 수 있게 설계해야 한다. 2026년 8월 16일 확인 시 저장소에는 별도의 라이선스 파일이나 README의 라이선스 표시가 없었다. 공개 열람이 복제·배포·파생물 작성 허가를 뜻하지 않으므로 제품 채택 전에는 권리자에게 재사용 조건을 확인해야 한다.&lt;br /&gt;
&lt;br /&gt;
== 함께 보기 ==&lt;br /&gt;
* [[최근 GitHub Star 연구 주제]]&lt;br /&gt;
* [[Python 개발 환경 베스트 프랙티스]]&lt;br /&gt;
* [[.NET 머신 러닝 프레임워크]]&lt;br /&gt;
* [[Qt 도킹 UI]]&lt;br /&gt;
&lt;br /&gt;
== 출처 ==&lt;br /&gt;
* [https://github.com/jeb2239/CINQ jeb2239/CINQ 공식 저장소]&lt;br /&gt;
* [https://github.com/jeb2239/CINQ/blob/master/docs/tutorial.md CINQ 공식 튜토리얼]&lt;br /&gt;
* [https://github.com/jeb2239/CINQ/blob/master/docs/design_document.md CINQ 공식 설계 문서]&lt;br /&gt;
* [https://github.com/jeb2239/CINQ/blob/master/docs/concepts_setup.md CINQ Concepts 설정 문서]&lt;br /&gt;
&lt;br /&gt;
[[분류:GitHub Star 연구]]&lt;br /&gt;
[[분류:C++]]&lt;br /&gt;
[[분류:데이터 처리]]&lt;br /&gt;
[[분류:선언형 프로그래밍]]&lt;/div&gt;</summary>
		<author><name>Admina7ec671ac513</name></author>
	</entry>
</feed>