C# 교과서
기초부터 활용까지, C# 기본기를 탄탄하게 다진다!
20년 경력 전문가가 선별한 「핵심 내용」과 「학습 순서」로 구성!
Visual Studio 2019 + C# 8.0, 최신 버전으로 배우자.
『C# 교과서』는 생애 첫 프로그래밍 언어로 C#을 시작하는 독자를 대상으로 한다. 특히 응용 프로그래머를 위한 C# 입문서로, C#을 사용하여 게임(유니티), 웹, 모바일, IoT 등을 개발할 때 필요한 C# 기초 문법을 익히고 기본기를 탄탄하게 다지는 것이 목적이다. Microsoft MVP이자 20년 경력의 개발/강의 전문가인 저자가 선별한 ‘핵심 내용’과 ‘학습 순서’로 설명한다. 또한, 600개가 넘는 코드 조각과 실습 예제를 직접 실행하며 실력을 향상시킬 수 있다. C#을 접한 적이 있는 독자라도 알고 있는 내용을 한 번 더 정리할 기회가 될 것이다. 출간 이후 저자 블로그(dotnetkorea.com)에서 제공하는 실시간 온라인 강의(유튜브로 진행, 저자 블로그 공지) 등도 놓치지 말자.
전자책 구입
목차
- 1부 C# 준비
- 01 C# 프로그래밍 언어 이해하기
- 1.1 프로그래밍 언어 알아보기
- 1.2 C# 소개하기
- 1.3 닷넷 생태계
- 1.4 책에서 다루는 범위
- 02 C# 개발 환경 구축하기: 비주얼 스튜디오 설치
- 2.1 비주얼 스튜디오 2019 커뮤니티
- 2.2 비주얼 스튜디오 2019 커뮤니티 설치하기
- 03 첫 C# 프로그램 작성하기
- 3.1 Hello World 프로그램
- 3.2 C#의 기본 코드 구조
- 04 C# 기본 문법 이해하기
- 4.1 출력문
- 4.2 주석문(코드 설명문)
- 4.3 들여쓰기
- 4.4 공백 처리
- 4.5 이스케이프 시퀀스
- 4.6 자리 표시자
- 2부 C# 기초
- 05 변수 만들기
- 5.1 변수
- 5.2 리터럴 사용하기
- 5.3 변수를 만들어 값 저장 후 사용하기
- 5.4 변수 선언과 동시에 초기화하기
- 5.5 형식이 같은 변수 여러 개를 한 번에 선언하기
- 5.6 상수 사용하기
- 06 숫자 데이터 형식 사용하기
- 6.1 숫자 데이터 형식
- 6.2 정수 데이터 형식
- 6.3 부호 있는 정수 데이터 형식
- 6.4 부호 없는 정수 데이터 형식
- 6.5 실수 데이터 형식
- 6.6 숫자 형식의 리터럴 값에 접미사 붙이기
- 07 숫자 이외의 데이터 형식 사용하기
- 7.1 문자 데이터 형식: char
- 7.2 문자열 데이터 형식: string
- 7.3 논리 데이터 형식: bool
- 7.4 변하지 않는 값: 상수
- 7.5 닷넷 데이터 형식
- 7.6 래퍼 형식
- 08 사용자한테 얻은 정보를 변수에 저장하기
- 8.1 문자열 입력 관련 메서드
- 8.2 형식 변환
- 8.3 이진수 다루기
- 8.4 var 키워드로 암시적으로 형식화된 로컬 변수 만들기
- 8.5 변수의 기본값을 default 키워드로 설정하기
- 09 연산자 개요 및 단항·산술 연산자 사용하기
- 9.1 연산자
- 9.2 단항 연산자
- 9.3 변환 연산자: ( ) 기호로 데이터 형식 변환하기
- 9.4 산술 연산자
- 9.5 문자열 연결 연산자
- 10 할당 연산자와 증감 연산자 사용하기
- 10.1 할당 연산자
- 10.2 증감 연산자
- 11 관계형 연산자와 논리 연산자 사용하기
- 11.1 관계형 연산자
- 11.2 논리 연산자
- 12 비트 연산자와 시프트 연산자로 비트 단위 연산하기
- 12.1 비트 연산자
- 12.2 시프트 연산자
- 12.3 기타 연산자
- 12.4 연산자 우선순위
- 13 제어문 소개 및 if/else 문
- 13.1 제어문
- 13.2 순차문: 순서대로 실행하기
- 13.3 조건문: if 문과 가지치기
- 13.4 else 문
- 13.5 else if 문(다중 if 문, 조건식 여러 개 처리)
- 13.6 조건문(if 문)을 사용한 조건 처리 전체 정리
- 14 조건문: switch 문으로 다양한 조건 처리하기
- 14.1 switch 문 소개
- 14.2 switch 문 사용하기
- 15 반복문(for 문)을 사용하여 구간 반복하기
- 15.1 for 문으로 반복하기
- 15.2 무한 루프
- 15.3 for 문으로 1부터 4까지 팩토리얼 값을 출력하는 프로그램
- 15.4 구구단을 가로로 출력하기
- 16 while 문과 do 문, foreach 문으로 반복 처리하기
- 16.1 while 문
- 16.2 피보나치 수열을 while 문으로 표현하기
- 16.3 do while 반복문으로 최소 한 번은 실행하기
- 16.4 foreach 문으로 배열 반복하기
- 17 break, continue, goto로 반복문 제어하기
- 17.1 break 문
- 17.2 continue 문으로 코드 건너뛰기
- 17.3 goto로 프로그램 흐름을 원하는 대로 바꾸기
- 18 배열 사용하기
- 18.1 컬렉션
- 18.2 배열
- 18.3 배열 선언하기
- 18.4 1차원 배열
- 18.5 다차원 배열
- 18.6 가변 배열
- 18.7 var 키워드로 배열 선언하기
- 19 함수 사용하기
- 19.1 함수
- 19.2 함수 정의하고 사용하기
- 19.3 매개변수와 반환값
- 19.4 매개변수가 있는 함수
- 19.5 반환값이 있는 함수
- 19.6 함수를 사용하여 큰 값과 작은 값, 절댓값 구하기
- 19.7 XML 문서 주석을 사용하여 함수 설명 작성하기
- 19.8 기본 매개변수
- 19.9 명명된 매개변수
- 19.10 함수 오버로드: 다중 정의
- 19.11 재귀 함수
- 19.12 함수 범위: 전역 변수와 지역 변수
- 19.13 화살표 함수: =>
- 19.14 식 본문 메서드
- 19.15 로컬 함수
- 19.16 Main 메서드의 명령줄 인수
- 20 C# 인터렉티브로 출력문부터 함수까지 내용 복습하기
- 20.1 C# 인터렉티브
- 3부 C# 활용
- 21 닷넷 API
- 21.1 닷넷 API 탐색기와 Docs
- 21.2 클래스, 구조체, 열거형, 네임스페이스
- 21.3 Math 클래스 사용하기
- 21.4 클래스 또는 메서드 이름을 문자열로 가져오기: nameof 연산자
- 22 구조체 사용하기
- 22.1 구조체란?
- 22.2 구조체 만들기
- 22.3 구조체 선언 및 사용하기
- 22.4 구조체 배열
- 22.5 구조체 매개변수: 함수의 매개변수에 구조체 사용하기
- 22.6 내장형 구조체
- 23 열거형 형식 사용하기
- 23.1 열거형 형식 사용하기
- 23.2 열거형 만들기
- 23.3 열거형 항목에 상수 값 주기
- 23.4 열거형 관련 클래스 사용하기
- 24 클래스 사용하기
- 24.1 클래스 소개하기
- 24.2 클래스 만들기
- 24.3 클래스 여러 개 만들기
- 24.4 클래스 시그니처
- 24.5 자주 사용하는 내장 클래스
- 24.6 Environment 클래스로 프로그램 강제 종료하기
- 24.7 환경 변수 사용하기
- 24.8 EXE 파일 실행하기
- 24.9 Random 클래스
- 24.10 프로그램 실행 시간 구하기
- 24.11 정규식
- 24.12 닷넷에 있는 엄청난 양의 API
- 24.13 값 형식과 참조 형식
- 24.14 박싱과 언박싱
- 24.15 is 연산자로 형식 비교하기
- 24.16 as 연산자로 형식 변환하기
- 24.17 패턴 매칭: if 문과 is 연산자 사용하기
- 25 문자열 다루기
- 25.1 문자열 다루기
- 25.2 문자열 처리 관련 주요 API 살펴보기
- 25.3 StringBuilder 클래스를 사용하여 문자열 연결하기
- 25.4 String과 StringBuilder 클래스의 성능 차이 비교하기
- 26 예외 처리하기
- 26.1 예외와 예외 처리
- 26.2 try~catch~finally 구문
- 26.3 Exception 클래스로 예외 처리하기
- 26.4 예외 처리 연습하기
- 26.5 throw 구문으로 직접 예외 발생시키기
- 27 컬렉션 사용하기
- 27.1 배열과 컬렉션
- 27.2 리스트 출력 구문
- 27.3 Array 클래스
- 27.4 컬렉션 클래스
- 27.5 Stack 클래스
- 27.6 Queue 클래스
- 27.7 ArrayList 클래스
- 27.8 Hashtable 클래스
- 28 제네릭 사용하기
- 28.1 Cup of T
- 28.2 Stack 제네릭 클래스 사용하기
- 28.3 List
제네릭 클래스 사용하기 - 28.4 Enumerable 클래스로 컬렉션 만들기
- 28.5 Dictionary
제네릭 클래스 사용하기 - 29 널(null) 다루기
- 29.1 null 값
- 29.2 null 가능 형식: Nullable
형식 - 29.3 null 값을 다루는 연산자 소개하기
- 30 LINQ
- 30.1 LINQ 개요
- 30.2 확장 메서드 사용하기
- 30.3 화살표 연산자와 람다 식으로 조건 처리
- 30.4 데이터 정렬과 검색
- 30.5 메서드 구문과 쿼리 구문
- 30.6 Select( ) 확장 메서드를 사용하여 새로운 형태로 가공하기
- 30.7 ForEach( ) 메서드로 반복 출력하기
- 31 알고리즘과 절차 지향 프로그래밍
- 31.1 알고리즘
- 31.2 합계 구하기: SUM 알고리즘
- 31.3 개수 구하기: COUNT 알고리즘
- 31.4 평균 구하기: AVERAGE 알고리즘
- 31.5 최댓값 구하기: MAX 알고리즘
- 31.6 최솟값 구하기: MIN 알고리즘
- 31.7 근삿값 구하기: NEAR 알고리즘
- 31.8 순위 구하기: RANK 알고리즘
- 31.9 순서대로 나열하기: SORT 알고리즘
- 31.10 특정 값 검색하기: SEARCH 알고리즘
- 31.11 배열을 하나로 합치기: MERGE 알고리즘
- 31.12 최빈값 구하기: MODE 알고리즘
- 31.13 그룹화하기: GROUP 알고리즘
- 32 개체 만들기
- 32.1 클래스와 개체
- 32.2 개체와 인스턴스
- 32.3 인스턴스 메서드
- 32.4 익명 형식
- 32.5 정적 멤버와 인스턴스 멤버
- 32.6 프로젝트에 클래스를 여러 개 사용하기
- 32.7 ToString( ) 메서드 오버라이드
- 32.8 클래스 배열
- 32.9 var 키워드를 사용하여 클래스의 인스턴스 생성하기
- 33 네임스페이스
- 33.1 네임스페이스
- 33.2 네임스페이스 만들기
- 33.3 using 지시문
- 34 필드 만들기
- 34.1 필드
- 34.2 액세스 한정자
- 34.3 여러 가지 형태의 필드 선언, 초기화, 참조 구현하기
- 35 생성자
- 35.1 생성자
- 35.2 매개변수가 있는 생성자 만들기
- 35.3 클래스에 생성자 여러 개 만들기
- 35.4 정적 생성자와 인스턴스 생성자
- 35.5 this( ) 생성자로 다른 생성자 호출하기
- 35.6 생성자를 사용하여 읽기 전용 필드 초기화
- 35.7 식 본문 생성자
- 36 소멸자
- 36.1 종료자
- 36.2 가비지 수집기
- 36.3 생성자, 메서드, 소멸자 실행 시점 살펴보기
- 36.4 소멸자를 사용한 클래스 역할 마무리하기
- 36.5 생성자, 메서드, 소멸자 함께 사용하기
- 37 메서드와 매개변수
- 37.1 메서드
- 37.2 메서드의 매개변수 전달 방식
- 37.3 가변 길이 매개변수
- 37.4 메서드 본문을 줄여 표현하기
- 37.5 선택적 매개변수
- 38 속성 사용하기
- 38.1 속성
- 38.2 접근자와 전체 속성
- 38.3 자동으로 구현된 속성
- 38.4 자동 속성 이니셜라이저
- 38.5 읽기 전용 속성과 쓰기 전용 속성
- 38.6 속성의 여러 가지 유형 살펴보기
- 38.7 속성을 사용한 클래스의 멤버 설정 및 참조하기
- 38.8 화살표 연산자로 속성과 메서드를 줄여서 표현하기
- 38.9 개체 이니셜라이저
- 38.10 자동 속성을 사용하여 레코드 클래스 구현하기
- 38.11 nameof 연산자
- 38.12 익명 형식
- 38.13 익명 형식과 덕 타이핑
- 38.14 생성자로 속성에 대한 유효성 검사 구현하기
- 38.15 메서드로 속성 값 초기화하기
- 38.16 속성에서 ?.와 ?? 연산자를 함께 사용하기
- 39 인덱서와 반복기
- 39.1 인덱서
- 39.2 인덱서를 사용하여 배열 형식의 개체 만들기
- 39.3 문자열 매개변수를 받는 인덱서 사용하기
- 39.4 반복기와 yield 키워드
- 40 대리자
- 40.1 대리자(위임/델리게이트)
- 40.2 대리자를 사용하여 메서드 대신 호출하기
- 40.3 대리자를 사용하여 메서드 여러 개를 다중 호출하기
- 40.4 무명 메서드
- 40.5 메서드의 매개변수에 대리자 형식 사용하기
- 40.6 Action, Func, Predicate 대리자
- 40.7 메서드의 매개변수로 메서드 전달하기
- 41 이벤트
- 41.1 이벤트
- 41.2 이벤트와 대리자를 사용하여 메서드 등록 및 호출하기
- 42 클래스 기타
- 42.1 부분 클래스
- 42.2 정적 클래스
- 42.3 필드에 public을 붙여 외부 클래스에 공개하기
- 42.4 함수형 프로그래밍 스타일: 메서드 체이닝
- 42.5 불변 형식
- 43 상속으로 클래스 확장하기
- 43.1 클래스 상속하기
- 43.2 부모 클래스와 자식 클래스
- 43.3 Base 클래스와 Sub 클래스
- 43.4 Object 클래스 상속
- 43.5 부모 클래스 형식 변수에 자식 클래스의 개체 할당하기
- 43.6 상속은 영어로 is a(is an) 관계를 표현
- 43.7 this와 this( ) 그리고 base와 base( )
- 43.8 봉인 클래스
- 43.9 추상 클래스
- 43.10 자식 클래스에만 멤버 상속하기
- 43.11 기본 클래스의 멤버 숨기기
- 44 메서드 오버라이드
- 44.1 메서드 오버라이드: 재정의
- 44.2 상속 관계에서 메서드 오버라이드
- 44.3 메서드 오버로드와 오버라이드
- 44.4 메서드 오버라이드 봉인
- 44.5 ToString( ) 메서드 오버라이드
- 44.6 메서드 오버라이드로 메서드 재사용하기
- 45 인터페이스
- 45.1 인터페이스
- 45.2 인터페이스 형식 개체에 인스턴스 담기
- 45.3 생성자의 매개변수에 인터페이스 사용하기
- 45.4 인터페이스를 사용한 다중 상속 구현하기
- 45.5 명시적인 인터페이스 구현하기
- 45.6 인터페이스와 추상 클래스 비교하기
- 45.7 IEnumerator 인터페이스 사용하기
- 45.8 IDisposable 인터페이스 사용하기
- 45.9 인터페이스를 사용하여 멤버 이름 강제로 적용하기
- 46 특성과 리플렉션
- 46.1 특성
- 46.2 Obsolete 특성 사용하기
- 46.3 특성의 매개변수
- 46.4 [Conditional] 특성 사용하기
- 46.5 특성을 사용하여 메서드 호출 정보 얻기
- 46.6 사용자 지정 특성 만들기
- 46.7 리플렉션
- 46.8 Type과 Assembly 클래스
- 46.9 특정 클래스의 메서드와 속성을 동적으로 호출하기
- 46.10 Type 클래스로 클래스의 멤버 호출하기
- 46.11 특정 속성에 적용된 특성 읽어 오기
- 46.12 Type과 Activator 클래스로 개체의 인스턴스를 동적 생성하기
- 47 개체와 개체 지향 프로그래밍
- 47.1 개체 지향 프로그래밍 소개하기
- 47.2 현실 세계의 자동차 설계도 및 자동차 개체 흉내 내기
- 47.3 개체 지향 프로그래밍의 네 가지 큰 개념
- 47.4 캡슐화를 사용하여 좀 더 세련된 프로그램 만들기
- 47.5 다형성 기법을 사용하여 프로그램 융통성 높이기
- 47.6 클래스의 멤버 종합 연습: 자동차 클래스 구현하기
- 4부 C# 확장 기능
- 48 제네릭 클래스 만들기
- 48.1 사용자 정의 클래스를 매개변수로 사용하는 제네릭 클래스
- 48.2 사전 제네릭 클래스 소개
- 48.3 제네릭 인터페이스
- 48.4 제네릭 클래스 만들기
- 49 확장 메서드 만들기
- 49.1 확장 메서드
- 49.2 확장 메서드로 문자열 기능 확장하기
- 49.3 확장 메서드로 기존 형식에 새로운 메서드 추가하기
- 49.4 확장 메서드를 사용하여 형식에 메서드 추가하기
- 50 동적 형식
- 50.1 dynamic 키워드
- 50.2 dynamic 변수로 런타임할 때 데이터 형식 결정하기
- 50.3 동적 바인딩
- 50.4 확장 메서드와 dynamic
- 51 튜플
- 51.1 튜플
- 52 클래스 라이브러리와 닷넷 스탠다드
- 52.1 클래스 라이브러리 프로젝트
- 52.2 어셈블리
- 52.3 닷넷 스탠다드 프로젝트로 자신만의 라이브러리 만들기
- 53 테스트 프로젝트와 단위 테스트
- 53.1 자동 테스트
- 53.2 테스트 프로젝트 생성 및 Assert 클래스 사용하기
- 53.3 Dul 프로젝트를 테스트하는 테스트 코드 작성 및 실행하기
- 54 NuGet 패키지
- 54.1 패키지 관리자와 NuGet
- 54.2 자신만의 NuGet 패키지 만들기
- 54.3 내가 만든 NuGet 패키지 사용하기
- 55 스레드
- 55.1 스레드
- 55.2 스레드 생성 및 호출하기
- 55.3 다중 스레드를 사용한 메서드 함께 호출하기
- 55.4 스레드 동기화
- 55.5 병렬 프로그래밍
- 56 비동기 프로그래밍
- 56.1 동기 프로그래밍
- 56.2 비동기 프로그래밍
- 56.3 비동기 Main( ) 메서드
- 56.4 간단한 async와 await 키워드 사용 예제
- 56.5 Task.Run( ) 메서드로 비동기 메서드 호출하기
- 56.6 Task.FromResult( )를 사용하여 비동기로 반환값 전달하기
- 56.7 async와 await를 사용한 C# 비동기 프로그래밍하기
- 57 인메모리 데이터베이스 프로그래밍 맛보기
- 57.1 인메모리 데이터베이스
- 57.2 CRUD 작업하기
- 57.3 리포지토리 패턴
- 57.4 인메모리 데이터베이스를 만들고 CRUD 작업 수행하기
- 58 스트림과 파일 입출력 맛보기
- 58.1 System.IO 네임스페이스
- 58.2 문자열에서 파일 이름 추출하기
- 58.3 Path 클래스로 파일 이름 및 확장자, 폴더 정보 얻기
- 58.4 파일과 디렉터리 관련 클래스
- 58.5 텍스트 데이터를 컬렉션 데이터로 가져오기
- 59 XML과 JSON 맛보기
- 59.1 XElement 클래스를 사용하여 XML 요소를 생성하거나 가공하기
- 59.2 JSON 데이터 직렬화 및 역직렬화하기
- 60 네트워크 프로그래밍 맛보기
- 60.1 HttpClient 클래스로 웹 데이터 가져오기
- 61 함수와 함수형 프로그래밍 소개하기
- 61.1 함수형 프로그래밍
- 61.2 문과 식
- 61.3 고차 함수
- 61.4 LINQ로 함수형 프로그래밍 스타일 구현하기
- 62 모던 C#
- 62.1 C#의 새로운 기능
- 62.2 패턴 매칭하기
- 62.3 C# 8.0 버전의 기능을 테스트 프로젝트에서 실행하기
- 62.4 C# 8.0 버전의 새로운 기능 열 가지 소개하기
- 부록
- A 디버거 사용하기
- A.1 버그
- A.2 디버거 사용하기
- A.3 중단점 사용하기
- A.4 한 단계씩 코드 실행하기
- A.5 비주얼 스튜디오의 디버깅 도구 사용하기
- B 팁과 트릭
- B.1 인텔리센스와 코드 조각
- B.2 자리 표시자 주요 서식
- B.3 checked와 unchecked
- B.4 전처리기 지시문과 조건부 컴파일
- B.5 암호화 연습: 초간단 문자열 인코딩 및 디코딩
- B.6 C#에서 이메일 보내기
- 마무리하며