C#
기초에서 활용까지! 기본기를 탄탄하게 다지는 C# 입문서
C#의 쓰임새와 기초 문법부터 컬렉션, 제네릭, LINQ, 개체 지향, 동적 형식, 비동기 프로그래밍과 같은 활용과 확장 기능까지 입문자에게 필요한 모든 것을 설명합니다.
오탈자 또는 개선사항이 발생하면 이곳에 지속적으로 업데이트 하도록 하겠습니다.
참고로, 이 페이지의 정오표는 제 사이트를 통해서 접수된 자료만 기록이 됩니다.
추가적인 정보는 출판사
도서 소개 사이트를 참고하세요.
많은 시간 여러 번의 검토를 거쳤지만, 아래와 같은 오탈자가 발생하였습니다.
책 보시는데, 불편을 드려 대단히 죄송합니다.
Main을 Main으로 바꾸고 writeline을 Writeline으로 바꾸어서 컴파일합니다.
-에서-
main을 Main으로 바꾸고 writeline을 Writeline으로 바꾸어서 컴파일합니다.
-으로-
파스칼 표기법: 접두사와 단어를 언더스코어(_)로 구분합니다.
int my_num = 0;
-에서-
파스칼 표기법: 단어를 대문자로 구분합니다.
int MyNum = 0;
-으로-
이 부분은 사실, 표기법이 문법이 아닌 스타일이라서, 큰 차이는 없지만, 아직 소문자로 시작하는 변수만을 표기하기 위해서
nynum을 구분짓기 위해서 언더스코어를 사용했지만, 좀 더 명확한 내용은 MyNum 형태로 문자와 문자를 대문자로 구분짓는게
더 좋은 표현이라고 생각하여 변경하도록 하겠습니다.
1비트
-에서-
1바이트
-으로-
bool 데이터 형식은 일반적으로 1바이트의 저장 공간을 차지합니다. 이는 8비트에 해당합니다. 그러나 CLR(Common Language Runtime)은 bool 형식의 크기를 정의하지 않으며, 각 구현체마다 다를 수 있습니다. 하지만, 일반적인 .NET 구현에서는 bool 형식이 1바이트를 차지합니다.
// 상수: j는 20으로 고정
-에서-
// 상수: age는 20으로 고정
-으로-
Convert 클래스의 Int32() 메서드로 묶어 줍니다.
-에서-
Convert 클래스의 ToInt32() 메서드로 묶어 줍니다.
-으로-
//정수로 변환
-에서-
//실수로 변환
-으로-
ConsoleKeyInfo 열거형을 사용했는데요. 열거형에 대한 내용은 뒤에서 자세히 다루겠지만,
-에서-
ConsoleKeyInfo 구조체와 ConsoleKey 열거형을 사용했는데요. 구조체와 열거형에 대한 내용은 뒤에서 자세히 다루겠지만,
-으로-
문자열 연결 연산자(addition operator)의 기본 사용 예는 다음과 같습니다.
-에서-
문자열 연결 연산자(concatenation operator)의 기본 사용 예는 다음과 같습니다.
-으로-
정수 2의 이진수인 0010을 왼쪽으로 2칸 이동하면 1000이 되어 정수 8이 됩니다. 정수 32의 이진수인 0101000을 오른쪽으로 2칸 이동하면 0001010이 되어 정수 10이 됩니다.
-에서-
정수 2의 이진수인 0010을 왼쪽으로 2칸 이동하면 1000이 되어 정수 8이 됩니다. 정수 40의 이진수인 0101000을 오른쪽으로 2칸 이동하면 0001010이 되어 정수 10이 됩니다.
-으로-
주석문에 &, |, ^로 변경했습니다.
조건문
-에서-
조건식
-으로-
기본 데이터 형식이 저장됩니다.
-에서-
데이터 형식의 기본값이 저장됩니다.
-으로-
안쪽 `for` 문을 반복하면서 열을 반복하여 2부터 9까지를 먼저 반복하면서 `i`의 값인 1을 곱해서 2*1부터 9*1을 먼저 출력한 후 그 다음 행에서 3*2부터 9*2가 출력되는 형태로 구구단을 만들어 볼 수 있습니다.
-에서-
이 프로그램은 중첩된 `for` 문을 활용하여, 첫 번째 열에서는 2부터 9까지의 수를 곱하는 단을 반복하고, 각 행에서는 1부터 9까지 곱하는 값을 순차적으로 증가시키며 구구단을 가로로 출력합니다. 결과적으로, 첫 행에는 각 단의 1을 곱한 값이, 두 번째 행에는 2를 곱한 값이 출력되는 식으로, 전체 구구단이 가독성 좋게 가로로 표현됩니다.
-으로-
다음 샘플 코드는 학생 3명의 총점을 구합니다. 이러한 방식이라면 학생이 30명일 때는 변수를 30개 선언해야 하는데, 변수는 하나면 충분합니다. 그래서 배열이 필요한 것입니다.
-에서-
다음 예제 코드에서는 3명의 학생의 국어 점수 총합을 계산합니다. 이 방식을 활용하면, 학생 수가 30명으로 늘어날 경우 30개의 변수가 필요하게 됩니다. 이처럼 많은 변수를 관리하기 위해서는 배열의 사용이 필수적입니다
-으로-
using System;
class DigitSeparator
{
static void Main()
{
//int[] numbers = { 1, 1000, 10000, 1000000 };
int[] numbers = { 1, 1_000, 10_000, 1_000_000 };
foreach (int number in numbers) // 배열에 데이터가 있는만큼 반복
{
Console.WriteLine(number);
}
}
}
전자책에는 실행 결과가 띄어쓰기가 잘못되어 출판되었습니다.
전자책에는 예 문자가 깨져서 보입니다.
"또는" 대신 "또한"이 문맥상 더 적절해 보입니다.
주석의 내용을 수정하였습니다.
using System;
class ArrayWithVarKeyword
{
static void Main()
{
// 정수 형식으로 자동적으로 형식이 설정됨
var i = 5; // int i = 5;
Console.WriteLine("i : {0}, 타입 : {1}", i, i.GetType());
// 문자열 형식으로 형식화됨
var s = "Hello";
Console.WriteLine("s : {0}, 타입 : {1}", s, s.GetType());
// 배열 형식
var numbers = new int[] { 1, 2, 3 };
// 여기서 var item은 numbers 배열의 요소의 형식, 즉 int 형식임
foreach (var item in numbers)
{
Console.WriteLine("item : {0}, 타입 : {1}", item, item.GetType());
}
}
}
전자책에는 Sum이 sum으로 소문자로 잘못 표기되었습니다.
제 원고에는 "또만나요"로 되어 있는데, 편집 과정에서 띄어쓰기가 적용되었습니다.
제곱근
-에서-
거듭제곱
-으로-
데이터형식변수1
-에서-
데이터형식 변수1
-으로-
StructParameter.cs 파일에 대한 설명문을 다음으로 변경합니다.
이 예제는 두 가지 방식을 통해 `Print` 함수에 데이터를 전달합니다. 첫 번째는 일반적인 변수를 사용하는 방식이고, 두 번째는 구조체를 활용하는 방식입니다. 매개변수가 많을 경우, 구조체를 사용하여 데이터를 효율적으로 묶어 전달할 수 있으며, 이는 코드의 복잡성을 줄이고 가독성을 높이는 데 도움이 됩니다.
향후 클래스에 대해 배우면서, 여러 값을 전달할 때 주로 클래스 인스턴스를 사용하는 방법에 대해서도 알아볼 것입니다.
xmax
-에서-
xmas
-으로-
1 ~ 10
-에서-
1 ~ 9
-으로-
실행 결과의 공백이 전자책에서는 제대로 표현되지 않았습니다.
문자열 비교하는 2가지 방법 정리에 대한 시작 설명문을 다음으로 변경합니다.
C#에서 문자열을 비교할 때, `==` 연산자는 기본적으로 대소문자를 구분합니다. 대소문자를 구분하지 않고 문자열을 비교하려면 `String.Equals()` 메서드와 `StringComparison` 열거형의 `OrdinalIgnoreCase` (또는 `InvariantCultureIgnoreCase`) 값을 활용할 수 있습니다.
(5)번 문장을 다음으로 변경합니다.
(5) 문자열은 문자의 배열을 의미합니다. `str[5]` 형태로 5번째 인덱스의 문자 하나를 구할 수 있습니다.
전자책에는 \r 만 표시되었습니다.
컬렉션 설명 불릿 기호 문장을 다음으로 변경합니다.
* 컬렉션은 형식 안정성(Type Safety)을 유지하면서 데이터를 동적으로 관리할 수 있는 구조를 제공합니다. 즉, 크기가 동적으로 변경될 수 있어, 요소를 추가하거나 제거하는 것이 용이합니다.
* 또한, 컬렉션은 데이터를 조회, 정렬, 중복 제거하는 기능뿐만 아니라, 키(Key)와 값(Value)을 쌍으로 관리하는 기능 등 다양한 유용한 기능들을 제공합니다.
전자책에는 화살표 부분에 불필요한 공백이 추가되었습니다.
내림차순
-에서-
오름차순
-으로-
전자책에는 ClassOne과 ClassTwo가 classOne과 classsTwo로 소문자로 잘못 표기되었습니다.
예제 제목에서 "같은 이름의 클래스로 구분" -> "같은 이름의 클래스를 구분"
Name 속성
-에서-
Color 속성
-으로-
"오리처럼 꽥꽥 되면" -> "오리처럼 꽥꽥 대면"
, num 제거해도 됩니다.
원고와 GitHub 소스에는 "Class와 같은 레벨로" 되어 있습니다.
전자책에는 StringLength 메서드 전달 부분이 stringLength 소문자로 표현되었습니다.
생성자의
-에서-
메서드의
-으로-
World
-에서-
Word
-으로-
sealed 클래스가
-에서-
sealed 키워드가
-으로-
"리플렉션으로 특성 어셈블리와~" -> "리플렉션으로 특정 어셈블리와"
메서드 부분에서 "이름이 같은 메서드를 여러 개 만들었고" -> "이름이 같은 메서드를 여러 개 만들고"
### 47.2.7. 메서드(Method; 함수; Function/Sub Procedure)
메서드는 클래스에서 가장 자주 사용되는 구성 요소로, 클래스의 기능과 동작을 정의합니다. 자동차에서 전진(), 후진(), 좌회전()과 같은 동작이 메서드에 해당합니다. 코드에서는 메서드 오버로드를 통해 하나의 클래스 내에 동일한 이름의 메서드를 여러 개 생성할 수 있으며, 메서드 오버라이드를 통해 부모 클래스의 메서드를 새롭게 재정의할 수 있습니다.
또한, 메서드의 매개변수 전달 방식에는 값 전달이 기본이며, `ref`, `out`, `in`, `params` 등의 키워드를 활용하여 다양하게 매개변수를 전달할 수 있습니다.
개발 패턴들을 정리해 나갔습니다.
-에서-
개발 패턴들을 정리해 나가겠습니다.
-으로-
1번 순서 앞에 다음 그림의 0번 순서(다음 4줄)를 먼저 실행해야 합니다.
> public interface IKs { }
> public class GoodCar { }
> public class BadCar { public BadCar(string message) { } }
> public class OfficeCamper : GoodCar, IKs { }
"①처럼 Cut 형태로" -> "①처럼 Cup 형태로"
"같은 범위(scope)를 같은 네임스페이스에서" -> "같은 범위(scope)를 갖는 네임스페이스에서"
특별한 목적의 Assert 클래스를 만들어 보았습니다.
-에서-
특별한 목적의 Assert 클래스를 사용해 보았습니다.
-으로-
예제에서 "IExplorer.exe" -> "C:\\Program Files(x86)\\Microsoft\\Edge\\Application\\msedge.exe"
3번에서, btnWachingTV -> btnWatchingTV
github 예제 소스기준으로 볼 때, 13번째 줄의 주석에서 20자만 가져오기로 되어 있으나 실제로 각 13, 16, 27번째 줄에 있는 Substring(0, 10) 메서드의 인수는 10자까지로 되어 있습니다.
20글자만 가져오기 -> 처음 10자만 출력