목록C# (122)
방프리

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 연산자를 사용..
Item 2: const보다는 readonly가 좋다. C#에서의 상수 표현은 컴파일 타임 상수와 런타임 상수 두 가지로 나뉜다고 한다. const는 컴파일 타임의 상수, readonly는 런타임의 상수로 각각 작동하는 방식이 조금씩 다르다고 한다. 쓰는 목적이 다른데 작가는 const보다는 readonly를 좀 더 사용하는 것을 추천했다. 이유인 즉, 런타임 상수는 어떠한 타입과도 함께 사용할 수 있는 (런타임때에 초기화 되는 값을 보고 타입을 판단함) 반면 컴파일 타임의 상수는 여러 타입에 대한 대응이 불가능하다. 내장된 숫자형, enum, 문자열, null에 대해서만 컴파일 상수는 값을 가질 수 있다. 또한 런타임 상수는 인스턴스별로 서로 다른 값을 가질 수 있다. 특히 런타임 상수는 값에 대한 대..
Item 1: 지역변수를 선언할 때는 var를 사용하는 것이 낫다. var 키워드!!! 정말 많은 곳에서 쓰인다. Swift 혹은 Java 특히 프론트엔드 개발자들에겐 굉장히 친숙한 키워드다. 이 키워드를 볼 때마다 항상 명시적으로 선언해줘야 했던 옛날 컴파일러에서 코딩을 했던 전 회사가 너무 생각이 났다. 이 주제는 이 책의 서론에서 작가가 사소한 논쟁이 있었다라고 할 정도로 말이 많은 키워드다. C++11의 auto처럼 자동으로 타입을 맞춰준다면 굳이 개발자들은 타입을 고려하지 않고 편하게 코딩할 수 있고, 유지보수할 때 표현범위 때문에 수정할 일도 없으니깐 말이다. 하지만, 뭐든지 편하면 조그만한 독이 있는 법!! C#의 var는 런타임때 타입을 정하는 것이 아닌 컴파일러 타임과 메서드의 원형을 기..

[연습문제] 1. 속성을 사용하는 이유는 무엇인가? 클래스의 내부에 존재하는 정보를 접근해서 값을 가져오거나 혹은 새로 값을 부여할 때 사용한다. 2. 속성과 인덱서의 같은 점과 다른 점을 각각 설명하시오. 실제로 동작할 때는 메소드로 동작하고, get, set 접근자에 의해 표현된다. 하지만 인덱서의 경우 반드시 this를 사용한다. 3. 다음 예제의 결과를 논하시오. set 접근자 호출\nProperty Value Input 4. 다음은 인덱서를 사용해서 Color 배열에 원하는 색을 입력하기 위한 인덱서 예제의 일부다. 밑줄이 있을 곳에 위치할 소스는 몇 번 소스인가? ① 5. 네임스페이스를 사용할 때의 장점을 말하시오. 여러 사람들이 동시에 분할해서 작업할 때 각자 개발한 클래스명이 중복될 경우를..