목록C# (122)
방프리
Item 5 : 값 타입에서는 0이 유효한 상태가 되도록 설계하라 이 항목에 해당하는건 기본적인 데이터 타입 (int, float, double 등...)이 아닌 사용자가 정의하는 enum에 초점이 맞춰져있다. 열거형은 코드의 가독성을 높히는데 가장 큰 공헌을 한다. 그만큼 자주 쓰이는데 자주 쓰이는만큼 이 타입을 어떻게 초기화할 것인지도 중요하다. public enum Planet { Murcury = 1, Venus = 2, Earth = 3, Mars = 4, Jupiter = 5, Saturn = 6, Uranus = 7, Neptune = 8, } Planet sphere = new Planet(); var anotherSphere = default(Planet); sphere와 anotherS..
Item 4 : 값 타입과 참조 타입을 구분하라 C#에서 구조체를 사용할 것인지? 클래스를 사용할 것인지는 사용자가 해당 타입을 어떤 목적으로 사용하느냐에 따라 용도에 맞게 골라서 선언하면 된다. 구조체는 데이터의 집합인 타입은 구조체로 선언하고, 어떠한 행동을 하는 타입은 클래스로 정한다. 구조체를 선언하기 전, 몇 가지를 명심해야 한다. 작고 가벼워야 한다. 구조체로 선언하게 되면 클래스 타입과 연동되지 않기 때문에 추후에 변경하게 되면 많은 작업이 들어가게 된다. 값 타입이기 때문에 복사가 이루어진다. 박싱과 언박싱이 쉽게 이루어질 수 있다. 구조체와 클래스가 어떻게 다른가? 메모리를 할당할 때에도 어떻게 할당이 이루어지는지 알아보자. public class C { private MyType a =..
Item 3 : 값 타입은 변경 불가능한 것이 낫다. 코딩을 하다보면 값이 변경되지 않아야 하는 것들이 있을 수 있다. 예로 아이템의 기본정보라던지, 특정 AccessKey값 등 여러 종류가 있겠다. 이들을 어떻게 만들면 될까? 간단한 방법으로는 const를 떠올릴 수도 있겠지만 좀 더 C#의 기능을 사용해서 변경하는 방법도 있다. public struct Address { public string Line1 { get; } public string Line2 { get; } public string City { get; } public string State { get; } public int ZipCode { get; } public Address(string _Line1, string _Line2,..
Item 2 : 변경 가능한 데이터에는 암묵적 속성을 사용하는 것이 낫다. 앞서 C#에서는 getter, setter 함수의 구현 대신 속성이란 개념이 있고, 이를 주로 사용한다는 것을 배웠다. 이 속성을 좀 더 편하게 암묵적으로 선언할 수 있는데 이를 통해 해당 변수의 사용 목적을 바로 알 수 있다. public string Name { get; protected set; } public string Name { get; internal set; } public string Name { get; protected internal set; } public string Name { get; private set; } public lstring Name { get; } virtual로 선언한다면 다음과 같이..
Item 1 : 접근 가능한 데이터 멤버 대신 속성을 사용하라 OOP의 개념 중 하나인 정보은닉을 위해 public 멤버변수에 접근할 때 getter와 setter를 구현해야 한다. 이는 언어에 따라 달라지는게 아닌 모든 언어에 공통적으로 적용되는 기법이기도 하다. C#에서는 C++보다 더 쉽게 속성(Property)이라는 것을 사용해서 구현할 수 있도록 되어 있다. public class Sample { private string _name; public string Name { get { return _name; } set { _name = value; } } } 이런 속성을 구현해주는 이유는 단순히 OOP 규칙을 맞추기 위해서 뿐만 아니라 수정에 대한 시간을 단축하기 위한 용도로도 사용이 가능하다...
Item 50 : 예외 필터의 다른 활용 예를 살펴보라 예외필터를 통해 다양한 방법으로 여러 가지 기능을 제공할 수 있다. 첫 번째로 항상 false만을 반환하여 제한된 타입에 대해서만 로그를 출력할 수 있다. try { data = MakeWebRequest(); } catch (Exception e) when (ConsoleLogException(e)) { } catch (TimeoutException e) when (failures++ < 10) { WriteLine("Timeout error: trying again"); } public static bool ConsoleLogException(Exception e) { var oldColor = Console.ForegroundColor; Con..
Item 49 : catch 후 예외를 다시 발생시키는 것보다 예외 필터가 낫다. 예외가 발생한 이후 catch 구문에서 어떠한 조건을 넣으려고 할 때 되도록 if 구문보다 아예 catch에서 when 키워드를 통해 조건을 거는 것이 좋다. var retryCount = 0; var dataString = default(String); while (dataString == null) { try { dataString = MakeWebRequest(); } catch (TimeoutException e) when (retryCount++ < 3) { WriteLine("Operation timed out. Trying again"); Task.Delay(1000 * retryCount); } } 만약 ca..
Item 48: 강력한 예외 보증을 준수하는 것이 좋다. 해당 항목에서 총 3가지의 예외 보증을 소개한다. 각각 기본 보증, 강력한 보증, 예외 없음 보증이다. 첫 번째로 기본 보증은 특정 함수 내에서 발생한 예외가 이 함수를 빠져나오더라도 어떤 리소스도 누수되지 않으며, 모든 객체의 상태가 유요한 상태를 유지하는 것을 뜻한다. NET CLR은 이 기본 보증을 준수하며 모든 기본 보증은 강력한 보증을 준수함으로써 해결이 가능하다. 두 번째로 강력한 보증이란 정의를 내리자면 다음과 같다. 방어적인 프로그램을 위해 수정할 데이터에 대한 복사본을 마련한다. 복사해둔 데이터를 수정한다. 수정 과정에서 예외가 발생할 수 있다. 수정된 복사본과 원본 데이터를 교환한다. 이 교환 작업은 예외를 일으켜서는 안 된다. ..