본문 바로가기

csharp

[C#] 병렬 프로그래밍 Parallel Programming (3) - 데이터 흐름 데이터 흐름 데이터 흐름은 프로그래밍 패러다임이 다른 병렬 프로그래밍입니다. 일반적으로 배우는 프로그래밍 언어는 코드로 절차를 정의하고 실행해 결과를 만듭니다. 절차는 메서드로 구현되고 메서드의 실행 순서에 따라 프로그램이 동작합니다. 반면, 데이터 흐름은 절차가 아닌 데이터가 중심입니다. 데이터 중심이란 데이터로 프로그램의 동작을 정의하게 되는걸 의미합니다. 데이터 흐름에서 프로그램은 필요한 데이터를 준비시키고, 데이터가 준비되어야 다음 연산을 실행합니다. 다시말해 프로그램은 데이터가 준비되어야만 진행됩니다. 예를 들어 여러 이미지를 합성해 하나의 이미지로 만드는 프로그램은 소스가 되는 이미지들이 준비되었는지를 먼저 확인합니다. 소스 이미지들이 준비되었으면 프로그램은 이미지를 합성하는 연산을 진행합니다..
[C#] 병렬 프로그래밍 Parallel Programming (2) - 작업 병렬화 작업 병렬화 Task Parallelism 작업 병렬화는 일반적으로 생각하는 병렬 처리를 방식입니다. 작업 병렬화는 데이터 병렬화와 달리, 데이터마다 동일한 처리를 하는 방법이 아닌, 독립적인 작업들을 동시에 처리하는 방식입니다. 데이터 병렬화와 마찬가지로 작업 병렬화도 TPL 이 개발자를 대신하여 스레드를 관리합니다. 따라서 개발자는 병렬 프로그래밍을 Parallel.Invoke 메서드를 사용해 아래와 같이 손쉽게 구현할 수 있게 되었습니다. Parallel.Invoke(() => DoSomeWork(), () => DoSomeOtherWork()); 예제 코드는 Parallel.Invoke 메서드로 DoSomeWork() 과 DoSomeOtherWork()을 병렬로 처리하고 있습니다. 코드의 내부 동..
[C#] 병렬 프로그래밍 Parallel Programming (1) - 데이터 병렬화 병렬 프로그래밍 Parallel Programming C++ 시절 병렬 프로그래밍은 하드웨어 수준의 조작이 필요해 굉장히 어려웠고 버그도 많았습니다. 더 큰 문제는 병렬 프로그래밍을 위한 디버깅 도구도 마땅치 않았으며, 병렬 프로그래밍에 능숙한 개발자도 없어 팀으로 일하는건 불가능했습니다. 하지만 Visual Studio 의 뛰어난 기능과 편리한 라이브러리의 등장으로 병렬 프로그래밍에 입문하기 굉장히 쉬워졌습니다. 시작하기에 앞서... 개발자가 굉장히 쉽게 오해하는 부분이 병렬 프로그래밍을 비동기 프로그래밍 개념의 확장으로 이해하는 부분입니다. 병렬 프로그래밍은 비동기 프로그래밍이 아닙니다! 병렬 프로그래밍과 비동기 프로그래밍 모두 컴퓨터에게 제일 중요한 자원인 중앙처리장치(CPU)를 효율적으로 사용하기..
[C#] LINQ 사용방법 - 조인 작업 Join, GroupJoin 조인 작업 Join Operations 조인은 데이터베이스에 등장하는 개념입니다. 조인 작업은 집합 간에 데이터를 연결합니다. 조인 작업은 클래스 간에 참조 관계가 없더라도 데이터를 연결할 수 있습니다. 이해하기 힘든 개념이므로 공식문서를 읽으면서 익혀주시길 바랍니다. 여기서는 조인 작업이 일반 코드보다 간결하다는 점만 보여드리도록 하겠습니다. 예를 들어, 아래와 같이 정의되어 있을 때 Customer 클래스에 City 속성이 있지만 City 클래스에 Customer 와 관련된 속성이 없으므로 모든 도시에 거주하는 모든 고객의 목록을 구하려면 아래와 같이 복잡한 메서드를 작성해야 합니다. class Customer { public City City { get; set; } } class City { pu..
[C#] LINQ 사용방법 - 시퀀스 작업 SequenceEqual, Concat, Zip 시퀀스 작업 Sequence operations 시퀀스 작업에 포함된 메서드는 SequenceEqual, Concat, Zip 입니다. 시퀀스 작업 메서드는 집합 전체를 대상으로 작업합니다. 두 집합의 모든 요소가 같은 순서대로 있는지 비교하기 var wordsA = new string[] { "cherry", "apple", "blueberry" }; var wordsB = new string[] { "cherry", "apple", "blueberry" }; bool match = wordsA.SequenceEqual(wordsB); // match = true var wordsA = new string[] { "cherry", "apple", "blueberry" }; // 순서를 변경하면 결과가 ..
[C#] LINQ 사용방법 - 집계 작업 Aggregate 집계 작업 Aggregators 집계 작업은 집합 모든 요소를 계산하여 하나의 값으로 반환하는 작업입니다. 집계 작업에 해당하는 LINQ 메서드로는 Count, Sum, Min, Max, Average, Aggregate 가 있습니다. Aggregate Enumerable.Aggregate 메서드는 영어를 모국어로 사용하지 않는 개발자에겐 직관적으로 와닿지 않는 메서드입니다. 영단어 Aggregate는 합계, 총액 이란 뜻으로 직역되지만, 언어적 뉘앙스는 작은 단위가 누적되어 합쳐져 하나를 이루는 느낌입니다. 따라서 Enumerable.Aggregate 메서드는 Enumerable.Sum 메서드와는 다르게 사용됩니다. 기본적인 사용방법 double[] doubles = { 1.7, 2.3, 1.9, 4...
[C#] LINQ 사용방법 - 집계 작업 Average 집계 작업 Aggregators 집계 작업은 집합 모든 요소를 계산하여 하나의 값으로 반환하는 작업입니다. 집계 작업에 해당하는 LINQ 메서드로는 Count, Sum, Min, Max, Average, Aggregate 가 있습니다. Average 집합 내에서 평균값 계산하기 int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; double averageNum = numbers.Average(); // averageNum = 4.5 집합 내 원소를 활용하여 평균값 계산하기 string[] words = { "cherry", "apple", "blueberry" }; double averageLength = words.Average(w => w.Length); // a..
[C#] LINQ 사용방법 - 집계 작업 Max 집계 작업 Aggregators 집계 작업은 집합 모든 요소를 계산하여 하나의 값으로 반환하는 작업입니다. 집계 작업에 해당하는 LINQ 메서드로는 Count, Sum, Min, Max, Average, Aggregate 가 있습니다. Max 집합 내에 최댓값 찾기 int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; int maxNum = numbers.Max(); // maxNum = 9 집합 내 원소를 사용하여 최댓값 찾기 string[] words = { "cherry", "apple", "blueberry" }; int longestLength = words.Max(w => w.Length); // longestLength = 9 그룹 내에서 최댓값 찾기 Li..