C#은 단순하고 현대적인 언어처럼 보일 수 있지만, 그 내부에는 깊이 있는 개념들이 숨어 있다. 그중에서도 '타입 시스템'은 모든 C# 프로그램의 기반이자, 좋은 설계를 위한 핵심 도구이다. 《모던 C# - 타입 시스템 마스터하기》는 값 타입과 참조 타입의 차이를 단순한 문법 설명에 그치지 않고, 코드 설계와 성능, 의미 전달까지 연결해 설명하는 해설서다. 이 책은 특히 ‘왜 값을 값 타입으로 만들어야 하는가’라는 질문에 명확한 답을 제시한다. 값 타입은 단순히 성능 향상을 위한 수단이 아니라, 코드에 의도를 명확히 담아내는 방법이다. 예를 들어 int 대신 Meter, Temperature와 같은 도메인에 특화된 타입을 사용함으로써, 해당 값이 어떤 용도로 쓰이는지를 코드 레벨에서 바로 이해할 수 있게 만든다. 이는 곧 코드의 안전성과 가독성을 높이고, 협업과 유지보수의 효율성까지 향상시키는 결과로 이어진다.
『모던 C#』은 복사와 참조의 작동 방식, 값 타입의 설계 기준, 메모리 구조와 성능 측정, 도메인 모델링에서의 타입 활용 등, 타입 시스템의 본질을 다양한 각도에서 조망했다. C#의 최신 문법을 나열하는 대신, 앞으로도 변하지 않을 '핵심'을 중심에 두고 설명하며, 실무에서 적용 가능한 통찰을 제공한다.
Contents
감사의 말
들어가며
1장 타입 시스템 활용하기
좋은 이름의 가치
타입을 이용해 명확하게 하기
이름 있는 인수
커스텀 타입
캡슐화
불변성
값 검증
테스팅
리팩터링
매직 넘버를 이름 있는 상수로 대체하기
속성과 값을 단순화하기
산술 연산자 오버로딩
새로운 타입에 대한 필요를 결정하기
단위 인코딩하기
열거형을 사용해 단위를 아이템화하기
정적 생성 메서드
설계의 대칭성
단위를 명시적으로 만들기
가장 자연스러운 사용 방법 선택하기
단위의 의미를 사용해 타입 반환하기
완전한 형태의 캡슐화된 값
타입 추상화 위치 결정하기
정리
2장 값 타입과 참조 타입
사용자 정의 타입
구조체와 클래스
레코드와 레코드 구조체
상속
타입 인스턴스의 수명
변수
변수 vs 값
결정적 할당
인스턴스와 스토리지
내장된 값
박스된 값
시맨틱과 타입
공통 타입 시스템
복사 시맨틱
레코드, 구조체, 값 시맨틱
생성과 초기화
기본 초기화
인스턴스 생성자
필드 초기자
객체 초기자
비파괴 변형
null 값과 기본값
제네릭과 null
제네릭과 기본값
nullable 값 타입
nullable 참조 타입
null-forgiving 연산자
정리
3장 참조 매개변수와 값 매개변수
메서드 매개변수와 인수
참조 타입 vs 참조로 전달되는 매개변수
값 타입과 매개변수
참조의 값
참조 변수와 앨리어싱
변경할 수 있는 참조로 전달하는 매개변수
참조로 참조 전달하기
참조로 값 전달하기
출력 매개변수 다루기
참조 전달 매개변수의 한계
속성값
참조 전달 매개변수에 대한 오버로딩
필드 사용하기
확장 메서드
사이드 이펙트와 다이렉트 이펙트
변경 vs 생성
선언적 코드와 성능
읽기 전용 참조 및 참조로 반환하기
참조로 값 반환하기
데이터 수정 방지하기
범위 안에서 참조 전달 변수 유지하기
성능 vs 단순함 고려하기
변경할 수 있는 참조 전달 매개변수 정리
정리
4장 암묵적 복사하기와 명시적 복사하기
단순한 할당으로 복사하기
값 복사 동작
읽기 전용 속성 vs 불변 타입
새 객체 만들기
값 덮어쓰기
값 타입 생성하기
레코드를 값 타입처럼 복사하기
불필요한 박스하기 식별하기
인터페이스로 박스하기
메서드 호출 안
메서드 매개변수와 인수
값으로 전달하기와 반환하기
속성에 접근하기
연산자와 함께 표현식 사용하기
반환 타입 인스턴스 수정하기
참조 타입 속성
인스턴스 메서드와 가변성
읽기 전용 매개변수를 위한 인수로서의 속성
방어적 복사본
변경할 수 있는 값 타입과 in 매개변수
자동 속성 vs 비자동 속성
읽기 전용 참조 변수
읽기 전용 필드
변경 방어하기
읽기 전용 접근자와 메서드
읽기 전용 타입
정리
5장 등치 타입
내장 등치
정수
부동소수점값
참조 등치
문자열 등치 및 값 등치
클래스에 대한 커스텀 등치
등치 연산자 정의하기
null과의 비교 다루기
타입 안전한 비교 만들기
해시 코드 다루기
구조체와 등치
구조체에 대한 Equals 오버라이드하기
값 박스하기 및 신원 비교하기
제네릭 변수 비교하기
제네릭 코드와 Equals 메서드
IEquatable〈T〉 인터페이스
컴파일러에 의해 생성된 등치
레코드 및 레코드 구조체
nullable 값에 대한 등치
값 튜플과 등치
정리
6장 값의 특성
값 vs 참조 시맨틱
복사 및 등치 비교 동작
가변성
기계적 문법(메커니즘) vs 의미적 문법(시맨틱)
객체 관계
객체의 종류
객체 특성
객체 역할 모델링을 위한 설계 개선
추상과 용어
중복 제거하기
클래스 불변량 구축하기
대칭성을 사용해 명확하게 만들기
캡슐화와 public 인터페이스
인터페이스 확장하기
내부 인터페이스 줄이기
추상화 조합하기
값 시맨틱과 참조 시맨틱 선택하기
기본 변수의 함정 회피하기
커스텀 동작 vs 생성된 동작 구현하기
생성된 메서드 오버라이드하기
순서 비교
동등 vs 등치
비교를 위한 계약
다른 유형의 순서
균일성과 일관성의 위험성
산술 타입과 비산술 타입
비표준적 연산자의 동작
정리
7장 값 타입과 다형성
값 타입이 봉인돼 있는 이유
구현 상속
클래스에 대한 값 기반 등치
파생된 클래스에서의 등치 동작
등치 비교와 타입 대체
포함 다형성과 서브타이핑
가상 메서드의 Input과 Output 타입 다루기
타입의 계약 유지하기
레코드 타입 상속하기
구현 상속 피하기
타입을 상속하지 않고 포함하기
제네릭을 사용한 매개변수를 갖는 다형성
제네릭 제약 사항과 프로토콜 인터페이스
제네릭 메서드 매개변수와 타입 추론
매개변수화 된 타입
오버로딩을 통한 애드혹 다형성
오버로드된 연산자를 갖는 심볼릭 다형성
다형성을 위한 제네릭 델리게이트
변환을 사용한 다형성 강제
확대 변환 vs 축소 변환
표현에 대해
목적에 대해
정리
8장 성능과 효율
성능 측정하기 및 최적화하기
JIT 컴파일러
성능 벤치마크
프로파일러
Equals를 사용해 기본 성능 측정하기
단순함에 숨겨진 비용
ValueType.Equals 메서드
ValueType.GetHashCode 메서드
HashCode.Combine 메서드
등치 최적화하기
IEquatable의 영향
속성 접근
등치 연산자
타입이 성능에 미치는 영향
복사 비용 측정하기
큰 인스턴스 복사하기
객체 생성 비용 측정하기
컴파일러가 생성한 Equals 메서드 측정하기
공통적인 이디엄과 프랙티스가 성능에 미치는 영향
루핑과 이터레이션
패턴 매칭과 셀렉션
정리
마치며
부록: 더 읽어보기
Author
스티브 러브,김모세
C#을 사용해 20여년 이상 개발을 계속한 전문 개발자이다. 물류, 공공 서비스, 회계 부문 등 다양한 업계에서 C#을 사용했다. C Vu, the members’ journal of the ACCU(https://accu.org)의 편집자인 동시에 다양한 콘퍼런스에서 연사로 활동하고 있다.
C#을 사용해 20여년 이상 개발을 계속한 전문 개발자이다. 물류, 공공 서비스, 회계 부문 등 다양한 업계에서 C#을 사용했다. C Vu, the members’ journal of the ACCU(https://accu.org)의 편집자인 동시에 다양한 콘퍼런스에서 연사로 활동하고 있다.