전체 글 75

MORE Effective C# 7. 튜플을 사용해서 타입의 사용 범위를 제한하라

C#은 객체나 자료구조를 표현하는 사용자 정의 타입을 만드는 다양한 방법을 제공합니다. 예로는 클래스, 구조체, 튜플 타입, 익명 타입 등이 있는데 많은 개발자가 반사적으로 클래스나 구조체를 선택하곤 합니다. 클래스와 구조체는 강력한 도구이지만 간단한 기능을 구현하는데도 많은 규약이 필요합니다. 대신, 익명 타입이나 튜플처럼 간단한 기능을 사용하는 편이 코드의 가독성에 유리합니다. 익명 타입은 컴파일러가 생성하는 변경 불가능한 참조 타입입니다. var aPoint = new { X = 5, Y = 67 }; 이 문장은 내부적으로 활용할 2개의 읽기 전용 public 속성을 갖는 새로운 sealed 클래스가 필요함을 말해줍니다. 다시 말해, 컴파일러에 대략 다음과 같은 코드를 작성해 달라고 말한 것과 같습..

카테고리 없음 2023.10.06

MORE Effective C# 6. 속성을 데이터처럼 동작하게 만들라

속성은 외부에서는 수동적인 데이터 요소처럼 보이지만 내부는 메서드로 구현됩니다. 이런 점 때문에 대부분의 사용자는 속성이 데이터 멤버와 동일하게 작동하고 많은 작업을 수행할 것이라고 생각하지 않습니다. 아래 코드처럼 Length 속성에 여러 번 접근하는 경우 최적화의 측면이나 멀티 스레드 환경에서 문제가 발생할 수 있습니다. for (int index = 0; index < myArray.Length; index++) 이런 문제를 방지하기 위해서는 get 접근자가 내부적으로 너무 많은 작업을 수행하지 않도록 하고, set 접근자에서도 값의 유효성 검증 정도만 처리하도록 작성하는 것이 좋습니다. 구체적으로는 암묵적 속성을 이용하는 방법, 속성 접근자의 구현부에서 값을 계산하는 것이 성능을 저하시키거나 속성..

카테고리 없음 2023.10.05

MORE Effective C# 5. 값 타입에서는 0이 유효한 상태가 되도록 설계하라

C#은 기본적으로 모든 객체를 0으로 초기화합니다. 열거형은 조금 특별한 사례인데 열거형의 값은 0부터 시작하지만, 이러한 동작을 임의로 변경할 수 있습니다. public enum Planet { Mercury = 1, Venus = 2, Earth = 3, Mars = 4, Jupiter = 5, Saturn = 6, Uranus = 7, Nepune = 8, } Planet sphere = new Planet(); var anotherSphere = default(Planet); 이런 경우에는 sphere와 anotherSphere 둘 다 값이 0이 되는데 이는 유효한 값이 아니고 따라서 작성한 코드를 제대로 작동하지 않습니다. 앞의 코드를 제대로 활용하려면 반드시 명시적으로 값을 초기화해야 합니다...

카테고리 없음 2023.10.04

MORE Effective C# 4. 값 타입과 참조 타입을 구분하라.

값 타입은 다형성이 없으므로 데이터를 저장하는데 적합하고 참조 타입은 다형성이 있으므로 동작을 정의하는데 적합합니다. C++에서는 모든 매개변수와 반환값이 값으로 전달됩니다. 이 방식은 부모 객체가 요구되는 곳에 자식 객체를 넘기면 객체의 부모 부분만 복사된다는 문제가 있었습니다. JAVA에서는 이 문제를 해결하기 위해 값 타입을 가능한 한 제거했습니다. 모든 사용자 정의 타입과 매개변수, 반환값이 참조로 전달됩니다. 이 방식은 일관적이라는 장점이 있지만 성능을 저하시키는 요인입니다. C#은 이런 문제들을 해결하기 위해서 값 타입과 참조 타입을 구분했습니다. .NET 문서에는 값 타입과 참조 타입을 선택하기 위한 기준으로 타입의 크기를 고려해야 한다고 하지만 실제로는 타입의 용도를 기준으로 삼는 것이 훨..

카테고리 없음 2023.10.03

MORE Effective C# 3. 값 타입은 변경 불가능한 것이 낫다.

변경 불가능한 타입(불변 타입)은 한 번 생성된 후에는 그 값을 변경할 수 없는 타입을 말합니다. public struct Address { public string Line1 { get; } public string Line2 { get; } public string City { get; } public string State { get; } public int ZipCode { get; } } 객체를 생성할 때 매개변수를 검증했다면 그 객체의 상태는 항상 유효하므로 불필요한 오류 확인에 들이는 노력을 줄일 수 있습니다. 여러 스레드가 동일한 컨텐츠에 접근하므로 멀티스레드에 대해서도 안전합니다. 변경 불가능한 타입을 초기화하는 방법에는 세 가지가 있습니다. 첫 번째 전략은 생성자를 정의하는 방식입니다...

카테고리 없음 2023.10.02

MORE Effective C# 2. 변경 가능한 데이터에는 암묵적 속성을 사용하는 것이 낫다

암묵적 속성(Implicit property)은 속성의 접근자에 구현부가 필요 없는 경우 컴파일러가 자동으로 private 필드를 추가해 주는 것입니다. public string Name { get; set; } 자동으로 생성되는 필드로 인해서 개발자의 생산성과 클래스의 가독성이 높아집니다. 향후 명시적 속성으로 구현부를 추가해도 클래스의 바이너리 호환성이 유지됩니다. 암묵적 속성은 Serializable 특성을 사용한 타입에는 사용할 수 없습니다. 속성이 단순히 데이터 필드를 감싸는 래퍼 역할만을 수행하는 경우 암묵적 속성을 이용하면 코드를 읽기 쉽다.

카테고리 없음 2023.10.01

MORE Effective C# 1. 접근 가능한 데이터 멤버 대신 속성을 사용하라

속성(Property)은 멤버를 public으로 노출하면서도 객체지향에 필요한 캡슐화를 유지할 수 있게 해 줍니다. public class Customer { private object syncHandle = new object(); private string name; public string Name { get { lock (syncHandle) return name; } set { if (string.IsNullOrWhiteSpace(value)) throw new ArgumentException( "Name cannot be blank", nameof(name)); lock (syncHandle) name = value; } } } 코드를 수정할 일이 생겼을 때 public 멤버와 달리 속성은 한..

카테고리 없음 2023.09.30

합병 정렬 / 병합 정렬(Merge Sort)

합병 정렬 / 병합 정렬 합병 정렬 / 병합 정렬(Merge Sort)은 정렬되지 않은 원소들을 하나의 원소로 분할한 다음 원소들을 정렬하면서 합병하는 알고리즘입니다. 먼저 원소들을 반복해서 분할해주면서 하나의 원소만 남을 때 까지 분할합니다. 그 다음에는 분할했던 두 원소들을 서로 합쳐주면서 정렬해줍니다. 이 과정을 반복해주면 정렬이 완료됩니다. 합병 정렬 / 병합 정렬 예시 합병 정렬 / 병합 정렬 C++ 코드 #define _CRT_SECURE_NO_WARNINGS #include #include void Partition(int left, int right, int numbers[]); void Merge(int left, int mid, int right, int numbers[]); void ..

카테고리 없음 2023.04.24

힙 정렬(Heap Sort)

힙 정렬 힙 정렬(Heap Sort)은 완전 이진 트리인 힙을 이용해서 원소들의 최댓값이나 최솟값을 쉽게 찾고 그것을 이용해서 정렬하는 알고리즘입니다. 먼저 부모 노드의 값이 자식 노드의 값보다 큰 최대 힙 구조를 만들어줍니다. 그리고 가장 큰 값을 가지고 있는 루트 노드를 힙의 마지막 노드와 교환해 주고 다시 최대 힙 구조를 만들어줍니다. 이 과정을 원소의 수 - 1번 반복하면 정렬이 완료됩니다. 힙 정렬 예시 본격적인 힙 정렬을 하기 전에 부모 노드의 값이 자식 노드의 값보다 큰 최대 힙 구조를 만들어야 합니다. 힙은 1차원 배열을 이용해서 구현할 수 있습니다. 부모 노드와 자식 노드의 인덱스를 쉽게 구하기 위해서 배열의 0번째 공간은 사용하지 않고 1번째 공간부터 사용합니다. 부모 노드 인덱스 ->..

카테고리 없음 2023.04.23

선택 정렬(Selection Sort)

선택 정렬 선택 정렬(Selection Sort)은 원소를 나머지 원소와 비교해서 가장 작은 원소를 찾고 그 원소와 자리를 교환하는 알고리즘입니다. 첫 번째 원소를 두 번째 원소부터 마지막 원소까지 차례대로 비교하면서 가장 값이 작은 원소를 찾고 첫 번째 원소와 가장 값이 작은 원소를 교환합니다. 다음에는 두 번째 원소를 세 번째 원소부터 마지막 원소까지 차례대로 비교하면서 가장 값이 작은 원소를 찾고 교환합니다. 이렇게 마지막에는 뒤에서 두 번째 원소와 첫 번째 원소를 비교하고 교환하면서 정렬이 완료됩니다. 선택 정렬 예시 선택 정렬 C++ 코드 #define _CRT_SECURE_NO_WARNINGS #include #include void Swap(int* a, int* b); int main() ..

카테고리 없음 2023.04.20