목록전체 글 (247)
방프리
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은 이 기본 보증을 준수하며 모든 기본 보증은 강력한 보증을 준수함으로써 해결이 가능하다. 두 번째로 강력한 보증이란 정의를 내리자면 다음과 같다. 방어적인 프로그램을 위해 수정할 데이터에 대한 복사본을 마련한다. 복사해둔 데이터를 수정한다. 수정 과정에서 예외가 발생할 수 있다. 수정된 복사본과 원본 데이터를 교환한다. 이 교환 작업은 예외를 일으켜서는 안 된다. ..
Item 47 : 사용자 지정 예외 클래스를 완벽하게 작성하라 예외처리는 프로그래머라면 반드시 해주어야 하는 필수항목이다. 예외를 처리할 때 Exception 클래스를 통해 통합적인 예외처리를 하는 방법과 NullReferenceException 같은 특수 Exception 클래스를 인자로 예외처리 하는 두 가지 방식으로 나뉜다. 이 항목에서 저자는 전자가 아닌 후자로 처리하되 자신이 만든 클래스 타입에서 예외 처리를 해야한다면 반드시 그 클래스에 맞는 예외 클래스도 만들어주어야 한다고 강조한다. //모든 예외를 처리할 수 있지만 정확한 원인 파악이 어려움 try { DoWork(); } catch (Exception e) { CatchException(); } finally { LastWork(); }..
Item 46 : 리소스 정리를 위해 using과 try/finally를 활용하라 C에는 malloc과 free, C++에 new, delete가 있다면 C#에는 new, Dispose()가 있다. C#에서는 가비지 컬렉터에서 어느 정도 리소스를 자동으로 해제해주기 때문에 큰 리소스를 관리하지 않는 이상 Dispose()를 사용할 일이 크게 없다. 만약 사용하게 된다면 반드시 IDisposable 인터페이스를 구현해주어야 한다. 하지만 많은 사람들은 직접 Dispose() 하는 것을 그렇게 추천하지 않는다. 아무래도 자동으로 메모리를 해제하는 동작에 최대한 간섭을 주지 않게 하기 위해서인 것 같다. 만약 사용하게 된다면 일일히 delete처럼 Dispose()를 사용해주어야 하는데, 이를 좀 더 간편하게..