본문 바로가기

C#

(6)
LINQ(2) - 일반적인 LINQ 코드 작성 원칙 및 유의점 LINQ에 대한 여러가지 LINQ는 워낙 거대한 기능이라 사용방법이 복잡하다. 이 글에서는 LINQ에 관련된 여러가지 잡다한 이야기와 LINQ 코드를 사용할 때 주의할 점들에 대해 서술한다. 또한 이 글은 유니티에서의 사용을 전제로 삼고 있다. LINQ는 SQL로 변환될 수 있는 쿼리 표현식으로 널리 사용되지만, 여기서는 고려하지 않는다. . LINQ 코드 작성 원칙 이 글에서 제안하는 LINQ 관련 코드 작성 원칙이다. 1. 쿼리 구문보다 메서드 구문을 사용한다. 쿼리 구문은 일반적인 C# 코드와 너무 이질적인 모양을 하고 있다. SQL보다는 C#에 익숙할 유니티 프로그래머들이 굳이 더 생소하게 보일 쿼리 구문을 사용할 필요가 없다. 유니티에서 실제 DB에 쿼리할 일이 없으니 더욱 그렇다. 또한 쿼리 ..
LINQ(1) - 함수형 프로그래밍에 대해서 함수형 프로그래밍은 프로그래밍을 하다 보면 누구나 한번쯤은 빠져들게 되는 주제이다. 이 글에서는 C#의 가장 중요한 기능 중 하나인 LINQ에 대해 설명하기 전, 함수형 프로그래밍에 대해 간략하게 설명한다. 명령형 프로그래밍vs선언형 프로그래밍 함수형 프로그래밍에 대해 생각하기 전에 먼저 명령형imperative 프로그래밍과 선언형declarative 프로그래밍의 개념부터 알아야 한다. 명령형 프로그래밍이란 어떻게 해야 하는지를 서술하는 것이다. 반면에 선언형 프로그래밍은 내가 무엇을 할지를 서술하는 것이다. 예를 들어 지금 Q라는 글자를 타이핑하려고 해보자. 명령형 프로그래밍의 관점에서 Q를 타이핑하는 방법은 다음과 같다: 새끼손가락을 왼쪽으로 0.5cm, 앞쪽으로 0.5cm 이동한다. 새끼손가락 끝에..
C#의 프로퍼티와 필드는 뭐가 다를까? 프로퍼티vs필드 프로그래밍을 입문하는 경우 C/C++로 입문하는 경우가 많다. 그래서 클래스를 "메서드"와 "멤버 변수"의 묶음으로 이해하는게 대부분이다. 그런데 C#에는 "멤버 변수" 대신 필드와 프로퍼티가 있다. 뭐가 다를까? 필드는 전통적인 의미의 멤버 변수이다. 인스턴스의 상태를 저장한다. 프로퍼티는 C++등에서도 흔하게 만들던 setter/getter 메서드를 언어 문법으로 가져온 것이다. 아래는 해당 개념을 코드로 표현한 것이다. public class ClassWithProperty { public int Field; private int _backingVariable; public int Property { get { return _backingVariable; } set { _backin..
C#의 확장 메서드는 언제 사용하면 좋을까? 확장 메서드가 뭔가요? 확장 메서드는 C#의 기능으로, 어떤 클래스에 외부에서 메서드를 정의해서 추가하는 것이다. 확장 메서드는 다음과 같이 정의된다. SomeClass someClass = new SomeClass(); someClass.ExtensionMethod(42);// someClass.A = 42 class SomeClass { public int A; } static class SomeClassExtension { public static void ExtensionMethod(this SomeClass s, int a) { s.A = a } } 정적 클래스에 첫 번째 매개변수를 this로 선언할 것 이렇게 하면 첫 번째 매개변수로 지정한 클래스에 원래 그런 이름의 메서드가 있었던 것 처럼 ..
IEnumerable, IEnumerator를 반환타입으로 가지는 메서드 파고들기 코루틴과 yield의 마법 유니티를 접하면서 코루틴을 처음 써보면 대기하는 것 같아 신기하다. 분명히 코드는 한줄한줄 순서대로 실행되는데 어떻게 yield에서 대기해놓고 다른곳을 실행할 수 있을까? IEnumerator와 yield가 정확히 어떻게 동작하는지는 찾아보면, 대략 MoveNext()를 호출할 때마다 다음 yield를 만날 때까지 실행해서 값을 반환한다는 식으로 이해된다. 약간 더 깊이 파고들면, 프로그래밍 언어에서 함수 호출을 하는 방식을 생각해볼 수 있다. 함수를 호출하면 스택에 반환될 주소와 함수 내부의 지역변수들이 추가된다. 그런데 만약 함수에서 값을 반환해버리면 스택이 없어질테고, 다음에 "중간부터 다시 시작" 할 수는 없을 것 같다. 어떻게 이런 일이 가능한 것일까? IEnumera..
C#의 readonly 키워드와 불변성에 대해 readonly vs const 처음 readonly를 접하면, 자연스럽게 const와 비교하게 된다. 언뜻 보기에는 둘다 변하지 않는 값을 선언하는 문법으로, 큰 차이를 느낄 수 없다. 다른 점을 찾아봐도 주로 const는 컴파일 시간 상수고, readonly는 런타임 상수라는 정도, 혹은 readonly는 생성자에서 값을 변경할 수 있다 라는 정도로 이해하는 경우가 대다수이다. 그러나 이는 완전한 오해이다. const와 readonly는 의미적으로나 실제로나 완전히 다르다. 근본적인 차이점은 const는 상수이고 readonly는 변수라는 것이다. const는 일종의 별명과도 같다. const int a = 1; 이라는 문장이 있을 때, 이 것은 1의 별명을 a로 하겠다는 선언이다. 이는 재정의하거나..