분류 전체보기(301)
-
[Effective C#] Ch5. 예외 처리
오류는 항상 발생한다. 예외가 발생했을 때 이를 어떻게 처리해야 할지 정확히 이해하는 것은 C# 개발자의 핵심 역량 중 하나다. 우리가 작성하는 코드에서 예외를 직접 발생시켜야 하는 경우도 있다. .NET Framework의 설계 지침에 따르면 요청된 작업을 올바르게 수행할 수 없다면 예외를 발생시키라고 가이드한다. 이 경우 실패의 근본 원인을 진단하고 가능하다면 오류 상황을 수정하는 데 필요한 모든 정보를 제공해야 한다. 또한 응용 프로그램이 복구 가능한 상태인지를 명확히 알려줘야 한다. ⭐메서드가 실패했음을 알리기 위해서 예외를 이용하라 메서드가 요청된 작업을 제대로 수행할 수 없는 경우 예외를 발생시켜 실패가 발생했음을 알려야 한다. 하지만 일반적인 실행 흐름을 제어하는 매커니즘으로 예외를 사용해서..
2022.04.15 -
[Effective C#] Ch4. LINQ 활용
도입 목적 지연된 쿼리를 지원하고 다양한 데이터 저장소에 대해 쿼리를 수행할 수 있는 통합 구문을 제공하기 위함 목표 데이터 소스의 유형과 상관없이 동일한 작업을 수행하는 코드를 손쉽게 작성하는 것 하지만 동일한 구문으로 서로 다른 데이터 소스에 대해서 작업을 수행하는 수준을 넘어서 쿼리와 실제 데이터 소스를 연결해주는 쿼리 제공자를 자유롭게 구현할 수 있는 기능도 함께 제공한다. ⭐컬렉션을 반환하기 보다 이터레이터를 반환하는 것이 낫다. 일련의 시퀀스를 반환하는 메서드를 작성해야 한다면 컬렉션을 반환하기 보다는 이터레이터를 반환하는 것이 좋다. 이터레이터를 반환하면 이를 이용하여 다양한 작업을 좀 더 수월하게 수행할 수 있다. - 이터레이터 메서드 호출자가 요청한 시퀀스를 생성하기 위해서 yield r..
2022.04.14 -
[Effective C#] Ch3. 제네릭 활용
제네릭이 컬렉션과 함께 사용될 때만 유용한 것처럼 말하곤 하지만 컬렉션 외에도 인터페이스, 이벤트 핸들러, 공통 알고리즘 구현 등 매우 다양한 분야에서 유용하게 활용될 수 있다. 제네릭을 사용하기 위해 C# 컴파일러, JIT 컴파일러, CLR 컴파일러는 모두 수정되어야 했다. ✨ C# 컴파일러 제너릭 타입으로 작성한 코드를 적절한 MSIL(Microsoft Intermediate Language)(플랫폼에 무관한 중간 언어)로 생성하기 위해 수정 ✨ JIT 컴파일러 정의 - MSIL은 사용 이전에 반드시 컴파일 되어야만 하는데, 이 때 컴파일하는 역할 수행 - MSIL 명령어 집합을 컴파일해서 기계 코드로 바꾸어주면, 이를 메모리 상의 캐쉬에 저장 - 이를 통해 특정 함수를 호출 시에 재컴파일할 필요없도..
2022.04.13 -
[Effective C#] Ch2. .NET 리소스 관리
.NET 프로그램은 관리 환경에서 수행되기 때문에 C# 프로그램의 설계에 적지 않은 영향을 미친다. 관리 환경의 장점을 온전히 활용하려면 다른 수행 환경에서 익숙해진 생각의 틀을 .NET 공용 언어 런타임(CLR)에 맞게 근본적으로 변경해야 한다. 객체의 생명주기를 이해하려면 .NET의 가비지 컬렉션의 동작 방식을 잘 알아야하고, 비관리 리소스를 어떻게 다룰지에 대해서도 정확히 이해해야 한다. ✅ .NET 리소스 관리에 대한 이해 훌륭한 .NET 개발자가 되기 위해서는 무엇보다 관리 환경에서 메모리와 주요 리소스들이 어떻게 관리되는지를 올바르게 이해해야 한다. GC는 관리되는 메모리를 관장하며 네이티브 환경과는 다르게 메모리 누수, 댕글링 포인터, 초기화되지 않는 포인터, 여타의 메모리 관리 문제를 개발..
2022.04.11 -
[Effective C#] Ch1. C# 언어 요소
✅ 지역변수를 선언할 때는 var를 사용하는 것이 낫다. - C# 언어가 익명 타입을 지원하기 위해서 타입을 암시적으로 선언할 수 있는 손쉬운 방법을 제공한다. - 정확한 반환 타입을 알지 못한 채 올바르지 않은 타입을 명시적으로 지정하게 되면 득보다 실 ex) 일부 쿼리 구문의 경우 IEnumerable컬렉션이 아니라 IQueryable를 반환하기도 함 만약 여기서 강제 형변환을 하면 IQueryProvider가 제공하는 장점을 모두 잃게 된다. - var로 선언하면 더 잘 읽힌다. 변수 타입 같은 변수의 지엽적인 부분보다는 변수의 의미 파악에 집중하게 한다. 하지만 간혹 사용자가 var를 사용하여 컴파일러에게 타입 추론을 위임한 경우, 컴파일러는 할당문 오른쪽의 내용을 기반으로 타입을 결정하기 때문에..
2022.04.10 -
안전한 패스워드 저장
이는 제 글이 아니라 학습을 위해 Naver D2의 글을 필사한 내용입니다. 이글 에서는 보안 시스템의 여러 부분 중 패스워드를 저장할 때 사용되는 해시 함수의 개념을 설명하고 대부분의 웹 사이트에서 사용하고 있는 암호화 알고리즘의 안정성을 검토하겠습니다. 그리고 어떤 암호화 알고리즘을 선택해야 안전한지 설명하겠씁니다. 단방향 해시 함수 보통 프로그래머는 아래의 두 가지 중 한 가지로 사용자의 패스워드를 저장한다. 단순 텍스트 단방향 해시 함수의 다이제스트 단순 텍스트로 패스워드를 저장하는 것은 범죄를 저지르는 것이나 다름없다. 단방향 해시 함수는 수학적인 연산으로 통해 원본 메시지를 변환하여 암호화된 메시지인 다이제스트를 생성한다. 원본 메시지를 알면 암호화된 메시지를 구하기는 쉽지만 암호화된 메시지로..
2022.04.03