본문 바로가기
반응형

프로그래밍507

C# yield return을 이용한 소수 생성기 yield return을 이용한 지연 계산 yield return에 대해서 공부하면서 대량의 데이터를 다루기 편해지고 지연 로딩이 강점이라는 설명글들을 많이 읽었지만 "그래서 이걸 대체 어디에 사용하지?"라는 의문에 계속해서 들고 있었다. 그러다가 피보나치 수열을 만드는 예제를 보고 yield return을 사용해서 소수를 만드는 메서드를 만들면 좋을거 같다는 생각이 들어서 코드를 한번 짜봤다. 사용자는 자기가 필요한만큼 소수를 꺼내쓰기만 하면 된다. 이에 대한 계산은 그때 그때 온-디멘드(OnDemand)로 이루어진다. 예제 public static IEnumerable GeneratePrimeNumber() { int start = 2; while (true) { for (int i = 2; i < .. 2024. 2. 14.
C# yield 이해하기 C# yield 이해하기 yield는 iterator를 포함하는 메서드에서 사용되는 강력한 키워드이다. yield를 사용하면 enumerable 배열을 간단하게 반환할 수 있다. 하나의 요소를 해당 시점에서 반환하기 때문에 기존의 전통적인 반환 방법과는 다르다. 지연 평가(lazy evaluation) 성능 향상(increased perforamance) 대량의 데이터, 복잡한 데이터 구조를 다루는데 효과적 iteration 간의 상태 지속이 가능 기본 구문 public IEnumerable GetNumbers() { for (int i = 0; i < 10; i++) { yield return i; } } 위의 예에서, GetNumbers()는 0에서 9까지의 정수 시퀀스를 생성한다. yield ret.. 2024. 2. 14.
Effective C# Item 36 : 쿼리 표현식과 메서드 호출 구문이 어떻게 대응되는지 이해하라 쿼리 표현식과 메서드 호출 구문이 어떻게 대응되는지 이해하라 LINQ는 쿼리 언어와 그 쿼리 언어를 일련의 메서드 집합으로 변환하는 2개의 핵심 구조를 기반으로 한다. C# 컴파일러는 쿼리 언어로 작성된 쿼리 표현식을 메서드 호출 구문으로 변환해 준다. 클래스 사용자의 관점에서 볼 때 쿼리 표현식은 단순히 메서드 호출 구문의 다른 표현 방법일 뿐이다. where 절은 적절한 인자를 이용하여 Where()라는 메서드를 호출하는 코드로 변환된다. 클래스 설계자의 관점에서는 기본 프레임워크에서 제공하는 메서드들이 어떻게 구현됐는지를 살펴보고 더 나은 방법으로 구현할 수 있을지를 판단해야 한다. 더 나은 구현 방법이 없다면 기본 라이브러리를 그대로 사용하면 되겠지만 개선의 가능성이 있다면 우선 쿼리 표현식이 메.. 2024. 2. 13.
C# 지연 평가(lazy evaluation)에 대해서 지연 평가란 무엇인가? 컬렉션의 단일 요소가 미리 계산되지 않고 호출되는 시점에서 평가가 이루어지고 실행된다. 즉, 호출시점까지 평가가 지연된다. 즉시 평가(eager evaluation) 즉시 평가를 사용하는 경우 모든 값들이 평가되어야지만 수행이 가능하다. 그래서 while(true)로 선언된 경우 끝에 도달하지 못하고 메모리 부족으로 예외가 발생한다. 지연 평가(lazy evaluation) 지연 평가를 사용하는 경우 while(true)로 선언되어 있다 하더라도 모든 값들을 미리 평가하고 시작하지 않는다. 호출되는 시점에서 필요한 부분까지만 평가하기 때문에 Take(10)에 해당하는 부분까지 지연평가되고 정상적으로 프로그램이 실행된다. 예제 코드 using System.Collections.Gen.. 2024. 2. 13.
부수 효과(Side Effect)와 참조 투명성(Referential Transparency)에 대해서 부수효과(Side Effect) 함수형 프로그래밍(Functional Programming)의 정의를 설명할 때, 중요하게 언급되는 2가지 개념은 바로 '부수 효과'와 '참조 투명성'이다. 먼저 '부수 효과'는 함수 내의 실행으로 인해 함수 외부가 영향을 받는 것을 의미한다. 함수의 매개 변수의 값이 변경되어, 이로 인해 함수를 사용하는 코드에 영향을 주거나, 함수의 외부 세계인 데이터베이스, 파일 시스템, 네트워크 등으로 데이터 이동이 발생하는 것을 말한다. 함수형 프로그래밍에서 함수는 부수효과를 발생하지 않는다. public static int add(int a, int b) { while (b > 0) { a++; b--; } return a; } 위의 메서드는 함수적이다. 정수형 a, b를 매개 .. 2024. 2. 13.
이진수 뺄셈을 해보자! 이제 뺌셈을 해보자 뺄셈은 기본적으로 덧셈과는 다르게 빌림수(borrow)가 발생한다. 253 -176 =??? 이 문제를 풀기 위해 오른쪽 자리에서부터 시작하도록 하자. 우선 6은 3보다 크기 때문에 윗자리의 5에서 1을 빌려와서 13에서 6을 빼는 형태로 연산을 수행하게 되고, 결과는 7이 된다. 좀 전에 아랫자리로 1을 빌려주었기 때문에 그다음자리의 연산은 4에서 7을 빼는 연산이 된다. 4 역시 7보다 작기 때문에 윗자리에의 2에서 1을 빌려와서 14에서 7을 뺴는 형태를 가지게 되고, 그 결과는 7이 된다. 그다음 자리 연산 역시 좀 전에 아랫자리로 1을 빌려주었기 때문에 2가 아닌 1이 되고, 1에서 1을 빼서 결과는 0이 된다. 따라서 최종 결과는 77이 되는 것이다. 253 -176 = 7.. 2024. 2. 7.