본문 바로가기
반응형

분류 전체보기625

Effective C# Item 22 : 공변성과 반공변성을 지원하라 공변성(Convariance)과 반공변성(Contravariance)을 지원하라 타입의 가변성(Variance), 즉 공변(Covariance)과 반공변(Contravariance)은 특정 타입의 객체를 다른 타입의 객체로 변환할 수 있는 성격을 일컫는다. 이러한 변환을 지원하려면 제네릭 인터페이스나 델리게이트의 정의 부분에 제네릭 공변/반공변을 지원한다는 의미의 데코레이터(decorator)를 추가해야 한다. 공변/반공변을 지원하면 우리가 개발하는 API를 더 다양하고 안전하게 사용할 수 있다. 가변성의 반대는 불변성(Invariance)이라고 한다. 타입의 공변성은 많은 개발자가 접하는 문제지만 이를 정확히 이해하는 사람은 많지 않다. 공변과 반공변이란 타입 매개변수로 주어지는 타입들이 상호 호환 가.. 2023. 6. 22.
세 발 달린 미니 마법사, '트랜지스터' 회로를 구성하는 주요 부품들은 모두 '다리'를 가지고 있다. 회로에 흐르는 전기를 받는 부분과 내보내는 부분이 있기 때문에 기본적으로 두 개의 다리를 가진다. 대표적으로 '저항'과 '축전기'는 다리가 두 개씩 있는데 저항의 다리는 양쪽으로 뻗어 있고, 축전기는 같은 방향으로 두 개의 다리를 뻗고 있다. 오늘 다룰 트랜지스터는 이와 달리 세 개의 다리를 가지고 있어 다른 부품과 구별이 매우 쉽다. 트랜지스터는 미국 벨 연구소에서 근무하던 쇼클리, 바딘, 브래튼이 1948년 발명한 것으로 전기 전자회로에서 없어서는 안 될 매우 중요한 부품이다. 트랜지스터를 발명한 당시에는 이 부품에 특별히 정해진 이름이 없었는데 벨 연구소 내에서 이름 공모를 위한 투표를 실시해 6개의 이름 후보 중 압도적 선호로 선정됐다... 2023. 6. 22.
집적회로, 소자 미세화 시대로 나아가다 소자 미세화 시대 집적회로 탄생의 진정한 의미는 소자 미세화 시대를 열었다는 점에 있다. 소자 미세화 이야기에 앞서, 집적 공정에 관해 조금 더 알아보자. 반도체 집적 공정은 평면 공정, 조각, 인쇄 공정, 융단 폭격 등으로 특징지어 이야기할 수 있다. 이해를 돕기 위해 아파트 단지 짓는 것을 예로 들어보자. 반도체 집적 공정으로 아파트 단지를 짓는다면 이렇게 할 것이다. 우선 전체 단지 땅을 평평하게 만든다. 그 위에 시멘트를 일정한 두께로 전체 단지를 완전히 덮는다. 시멘트가 남아 있어야 할 부분(벽이 될 부분)과 없애야 할 부분(집 내, 외부 공간이 될 부분)을 인쇄하여 표시하고 벽이 될 부분을 보호할 수 있는 것으로 덮는다. 이후 단지를 융단 폭격하여 보호가 안 되어 있는 시멘트 부분을 모두 날려.. 2023. 6. 21.
C# Linq - Enumerable.OrderBy() OrderBy()로 정렬하기 OrderBy()를 호출하면 해당하는 데이터를 기준으로 오름차순(Ascending) 정렬한다. 내림차순으로 정렬이 필요한 경우 내림차순(OrderByDescending)으로 메서드를 호출한다. ThenBy()를 추가해서 세부정렬하기 2023. 6. 20.
C# 익명 타입 (Anonymous Type) 익명 타입(Anonymous Type)이란? C#에서 어떤 클래스를 사용하기 위해서는 일반적으로 먼저 클래스를 정의한 후 사용한다. 하지만 C# 3.0부터 클래스를 미리 정의하지 않고 사용할 수 있게 하는 익명 타입(Anonymous Type)을 지원하게 되었다. 익명 타입은 new { ... }와 같은 형식을 사용하며, new 블록 안에 속성 = 값 할당을 하고, 각 속성/값은 콤마로 분리한다. 익명 타입은 읽기 전용이므로 속성값을 갱신할 수 없다. C# 키워드 var는 컴파일러가 타입을 추론해서 찾아내도록 할 때 사용되는데, 익명 타입 객체를 변수에 할당할 때는 특별히 타입명이 없으므로 var를 사용한다. 컴파일러는 익명 타입에 대해 내부적으로 임의의 클래스를 생성하여 사용하게 된다. // 익명 타입.. 2023. 6. 19.
C# Select vs SelectMany Select() 메서드 객체에 담긴 여러 데이터 중에서 원하는 부분만 손쉽게 추출하여 새로운 형태의 컬렉션으로 생성한다. public class Program { public class Winner { public string name; public int[] years; } public static void Main() { List list = new() { new Winner() { name = "Boston", years = new [] { 1989, 1999 } }, new Winner() { name = "Yankees", years = new [] { 2000, 2012, 2013, 2018 } }, new Winner() { name = "Newyork", years = new [] { 19.. 2023. 6. 19.