목록C#/Effective C# (50)
방프리

Item 10: 베이스 클래스가 업그레이드된 경우에만 new 한정자를 사용하라 부모클래스에서 정의한 함수를 자식 클래스 객체를 통해서 사용된다면 똑같이 동작한다는 것을 상속 관계에 대해 공부할 때 배운다. 하지만 항상 예외가 존재하듯 부모클래스에 있는 함수라고 해서 상속 받는 모든 자식클래스들이 부모클래스에 있는 함수를 모두 사용하는 것은 아니다. 상황에 따라서는 사용할 수도, 사용하지 않을 수도 있고 전혀 다른 동작임에도 불구하고 함수명이 일치하는 경우도 존재한다. 다음과 같이 코드를 작성하면 둘 다 똑같은 동작을 할 것이라 개발자들은 생각한다. 하지만 다음과 같이 정의된다면 말이 달라진다. new 연산자를 통해 부모클래스에 있는 함수를 재정의 했기 때문이다. new 연산자는 내부적으로 비가상 메서드처..

Item 9: 박싱과 언박싱을 최소화하라 C++에서 C#으로 넘어와서 편하다고 생각한 것은 바로 데이터 타입이었다. C++은 데이터 타입에 관해 굉장히 엄격하다. 그래서 형변환에도 꽤나 힘든데 C#에서는 Object 개념을 통해 좀 더 유연하게 대처해준다. Object는 최상위 타입으로 모든 데이터 타입은 Object 하위에 있으며 Object 타입은 모든 데이터 타입을 커버할 수 있다 굉장히 편하지만 항상 편한 것들은 함정을 가지고 있다. Object는 상자 같은 개념으로 많이 표현하는데 데이터를 넣을 때 Object라는 큰 상자 안에 데이터를 넣고 Object 타입에서 다른 데이터 타입으로 가져올 땐 상자 안에 있는 데이터를 가져온다고 해서 언박싱, 데이터 타입을 Object 타입에 넣을 땐 상자 안..

Item 8: 이벤트 호출 시에는 null 조건 연산자를 사용하라 데이터를 바인딩할 때 항상 하는 조건문!! 바로 null인지 아닌지 체크하는 것이다. NullException은 어디에서든지 절대 빠져서는 안되는 조건문이다. 이벤트 호출하기 전에도 항상 null을 체크해주어야하는데 왜 해주어야 하는지? 그리고 어떻게 해야하는지 코드를 통해 알아보자 다음 코드는 아예 체크를 하지 않는 코드다. 이벤트에 아무것도 할당되지 않았음에도 그냥 바로 실행시킨다. 이 부분을 예외처리를 한다고 하면 보통 다음과 같이 처리한다. 나도 처음에 이렇게 처리면 끝나는줄 알았다. 하지만 멀티 쓰레드 환경이라면, 이 코드도 완벽하지 않다. 한 쓰레드에서 이벤트를 해제했는데 다른 쓰레드에서 이벤트를 실행하면 비어있는 이벤트를 실행..

Item 7: 델리게이트를 이용하여 콜백을 표현하라 우선은 델리게이트가 무엇이고, 콜백이 무엇일까? 콜백(CallBack)은 영어 뜻대로 다시 호출하는 것을 말한다. 특정 이벤트가 발생했을 때에만 호출한다는 것인데 주로 비동기적으로 처리하는 서버에서 많이 사용한다. 단일 쓰레드로 콜백으로만 호출하여 서버를 구축하는 방법도 있다고 한다. (현재 공부하고 있는 NodeJS도 콜백 형식으로 이루어진 언어라고 한다.) 각 언어마다 콜백을 표현하는 방법은 다르다. C#에서는 이 콜백을 델리게이트(delegate)라는 키워드를 통해 구현이 가능하다. (이 콜백도 디자인 패턴 중 옵저버 패턴 (Observer Pattern)으로 구현되어 있다.) 델리게이트를 사용함으로써 클래스 간의 결합도를 낮출 수 있다. 즉, 클..

Item 6: nameof() 연산자를 적극 활용하라 nameof 연산자는 Type이나 메서드, 속성 등의 이름을 반환하는 연산자로 주 목적은 하드코딩을 방지하기 위해 사용된다. 하지만 제네릭 타입을 사용할 경우 부분적 제약이 있어 모든 타입 매개변수를 지정한 닫힌 제네릭 타입에만 사용이 가능하다. nameof 연산자는 현대에 들어서 수많은 시스템에서 데이터가 오가는데 이 부분에서 데이터 타입에 의해 호환성이 망가지는 것을 어느정도 방지하기 위해 사용한다고 한다. 다음 코드는 INotifyPropertyChanged 인터페이스 구현부의 일부분이다. 속성의 이름을 변경할 경우 이벤트의 인자로 전달해야하는 문자열도 쉽게 변경이 가능하다. 예외처리 부분의 경우 매개변수로 문자열을 요구하는데 nameof() 연..

Item 5: 문화권별로 다른 문자열을 생성하려면 FormmatableString을 사용하라 다양한 언어권을 지원하는 부분은 무조건 생각을 하고 넘어가야 한다. 서비스가 항상 한국에서만 한다는 보장이 없기 때문이기도 하고 만약 해외에서 서비스를 진행하게 된다면 문자열 작업을 일일히 다 해줘야하기 때문에 초기단계부터 미리 준비해놓으면 좋기 때문이다. 작가는 C#에서 이 부분을 지원해주는 키워드가 있다고 하는데 바로 FormattableString이다. 이 FormattableString은 보간 문자열과 연관이 있는데 상황에 따라서 문자열이 일반 string이 될 수도 있지만 FormattableString 형태가 될 수도 있기 때문이다. 다음의 third라는 변수는 string 타입이 될 수도, Forma..

Item 4: string.Format()을 보간 문자열로 대체하라 기존의 C#에서 문자열을 생성할 때는 다음과 같은 코드를 통해 구현을 하였다. C#을 처음 배울 때 Hello, World를 출력한 다음 바로 배우는만큼 많은 사람들에게 굉장한 익숙한 코드다. 하지만 작가는 이렇게 동작하는 방식에서 많은 문제점을 야기하고 있다고 한다. 문자열 생성이 제대로 잘 수행하더라도 개발자가 읽기에 가독성이 너무나 떨어진다. 값을 대입할 때 {숫자} 이 형태는 실제로 동작하거나 제대로 분석하지 않는 이상 어떠한 값이 들어가는지 제대로 확인이 불가능하다. 특히나 변수의 길이가 길어져 해당 구문이 두줄 이상이 되어버리면 유지보수 하는 사람 입장에서도 짜증이 날 수 밖에 없다. 심한 경우엔 개발자 본인이 코드를 작성하면..

Item 3: 캐스트보다는 is, as가 좋다. C#에서는 형변환을 시도할 때 두 가지 방식이 있는데 as 연산자를 사용하거나 C++의 방식인 컴파일러의 캐스트 연산자 를 사용하는 방식이 있다. 작가는 무작정 캐스팅을 시도하는 것이 아닌 is 연산자를 통해 형변환의 가능여부를 확인 후 안전하게 캐스팅을 하는 것을 권장하고 있다. 특히 as 연산자를 통해 간단한 코드로 예외처리 할 수 있음을 강조했다. 그리고 가장 중요한 점을 말하면서 캐스팅의 단점을 설명하였는데 as 연산자를 사용하면 객체는 항상 지정된 타입, 혹은 지정한 타입을 상속한 타입어야 한다. 그렇지 않으면 그냥 실패를 반환하는 반면 캐스팅은 형변환 연산자가 개입할 수 있다. (즉, 데이터의 손실이 발생할 수도 있다.) 또한 as 연산자를 사용..