C# 프로그래밍 언어
"씨샵
"으로 발음하는 C#
은 프로그래밍 언어입니다. 이 책은 C#
이름을 가진 프로그래밍 언어를 다룹니다. 자, 이제부터 오랜기간동안 많은 프로그래머에게 사랑받아 온 최고의 언어인 C#
을 배워보도록 하겠습니다.
C#
을 한 줄로 압축해서 정의하면 다음과 같습니다. 여러모로 많은 뜻을 담고 있습니다.
> // C#: 현재 전세계 시가총액 1위인 Microsoft에서 만들고 주력으로 사용하는 프로그래밍 언어
처음 이 글을 작성한 시점에는 Microsoft가 전세계 시가총액 1위였습니다. 지금은 바뀌었나요?
1.1. 컴퓨터와 프로그래밍 언어
1.1.1. 하드웨어와 소프트웨어
컴퓨터는 하드웨어(Hardware)와 소프트웨어(Software)로 이루어집니다. 하드웨어는 PC, 스마트폰과 같은 장치를 말하며 소프트웨어는 이러한 하드웨어에 설치된 운영체제, 앱 등을 말합니다.
NOTE
2005년 제가 개인사업자로 창업할 때 회사 이름을 정할 때 하드웨어와 소프트웨어를 사용하여 제품(Ware)을 만든다는 의미로 하와소(Hawaso)로 결정했습니다. 2023년 현재까지도 망하지 않고 잘 버티고 있습니다. 제 책과 강의를 봐주시는 여러분들 덕분입니다. 감사합니다.
(Hardware + Software) => Ware
1.1.2. 프로그래밍과 프로그래머
소프트웨어를 만드는 행위를 프로그래밍(Programming)이라고 합니다. 소프트웨어를 만드는 사람을 프로그래머(Programmer) 또는 개발자(Developer)로 부릅니다.
- 프로그래머(Programmer)
- 소프트웨어 개발자(Software Developer)
- 솔루션 개발자(Solution Developer)
- 애플리케이션 개발자(Application Developer)
1.1.3. 프로그래밍 언어
명령(Instruction)을 통해서 컴퓨터에게 무엇인가를 시킬 수 있는 프로그램을 만들 수 있는 또 다른 소프트웨어가 프로그래밍 언어입니다. 사람이 어휘와 문법을 통해서 대화하듯이 프로그래밍 언어는 예약어(키워드)와 문법으로 무언가를 만들 수 있습니다. 세상에는 C언어, C++, C#, Java, JavaScript, Python 등의 많은 프로그래밍 언어가 있습니다. 그 중에서 이 강의는 C# 프로그래밍 언어를 다룹니다.
1.1.3.1. 프로그래밍 언어 순위
C# 프로그래밍 언어는 굉장히 오랜 기간동안 프로그래밍 언어 순위 5위 안에 항상 들어와 있습니다. 프로그래머마다 좋아하는 언어 스타일이 다르기에 순위에는 항상 변동이 있을 수 있습니다. 하지만, 박용준 강사는 프로그래밍 언어 순위 10위 안에 드는 대부분의 언어를 사용해 봤지만, 가장 좋아하는 언어는 C#을 1순위로 들고 있습니다. 이것 또한 순전히 주관적인 생각이지만, 간결함과 명확한 문법, 그리고 프로그래밍 언어가 가질 수 있는 대부분의 편리한 기능을 다 가지고 있는게 C#이라고 생각합니다.
다음 그림은 전세계 개발자 커뮤니티로 유명한 스택오버플로(StackOverflow) 사이트의 2020년 설문 조사 결과입니다. C#은 항상 상위권에 위치하고 있습니다. 실제 프로그래밍 언어로만 보면 JavaScript, Java, Python, C# 순서로 상위 5개 언어에 포함됩니다.
그림: 스택오버플로 사이트의 가장 인기있는 기술 순위 설문조사 결과
1.1.4. 용어: 코드(Code)와 코딩(Coding)
- 텍스트로 되어 있는 소프트웨어를 만드는 명령들의 집합을 코드(Code) 또는 소스(Source)라고 합니다.
- 코딩(Coding)은 프로그래밍 언어의 코드로 프로그램을 만드는 과정입니다. 코딩은 컴퓨터 프로그래밍과 비슷한 개념입니다.
1.1.5. 용어: 컴파일(Compile)과 인터프리트(Interpret)
프로그램 소스 코드를 컴퓨터와 같은 하드웨어가 실행할 수 있는 기계 코드로 변환해주는 프로그램을 컴파일러(Compiler)라하고 변환하는 과정을 컴파일(Compile)이라고 합니다. 따로 컴파일의 과정을 거치지 않고 소스를 바로 해석해서 실행해주는 인터프리터(Interpreter) 언어도 있습니다. 우리가 배울 C#은 컴파일 언어이지만 컴파일과 인터프리터의 장점을 가지는 하이브리드 언어로도 표현합니다.
- 컴파일(Compile)
- 소스 코드를 기계 코드로 실행
- C, C++ 등
- 인터프리트(Interpret)
- 소스 코드를 인터프리터로 실행
- JavaScript, Python, PHP 등
- 하이브리드(물론, 둘 다 컴파일 언어임)
- C#, Java
1.2. C# 소개
C#은 Microsoft에서 만든 개체 지향 프로그래밍 언어입니다. C# 프로그래밍 언어를 사용하면 데스크톱, 웹, 모바일, 게임 프로그램 등 분야를 가리지 않고 프로그램을 작성할 수 있습니다. 수많은 프로그래밍 언어 중에서 전 세계 개발자들에게 오랜 기간동안 가장 많이 사용되는 언어 중 하나입니다.
C#은 C언어 프로그래밍 계열(Family)의 개체 지향 프로그래밍 언어입니다. C#은 2000년 7월에 Microsoft PDC(Professional Developers Conference) 행사에서 닷넷 프레임워크(.NET Framework)와 함께 소개되었습니다.
1.2.1. C# 프로그래밍 언어
C#은 소프트웨어 즉, 응용 프로그램을 만들기 위한 프로그래밍 언어입니다. 프로그래밍 언어는 C# 이외에도 C, C++, Java, Python, TypeScript 등 굉장히 많은 언어들이 있습니다. C#의 장점은 하나의 프로그래밍 언어를 배운 후 이를 가지고 데스크톱 프로그램 및 웹 프로그램 그리고 모바일과 게임 프로그램 등을 제작할 수 있다는 데 있습니다.
- C#은 마이크로소프트의 최고 엔지니어 개발자인 앤더스 헤일스버그(Anders Hejlsberg)에 의해서 디자인되었습니다.
- C#은 2000년 7월 MS PDC 행사에서 처음으로 소개되었습니다.
- C# 프로그래밍 언어는 5.0 버전까지는 버전마다 큰 변화가 있었습니다. 그 이후로 6.0 버전부터 11.0 버전까지는 작지만 개발자에게 도움을 주는 기능들을 다수 추가하는 방식으로 업데이트가 되고 있습니다.
- C#은 강력하고 재 사용 가능한 응용 프로그램을을 쉽게 만들 수 있습니다.
CAUTION
C#을 만든 사람의 이름은 앤더스 헤일스버그(Anders Hejlsberg)입니다. 본인이 직접 그 이름으로 소개합니다.
1.2.2. C#의 특징
C# 프로그래밍 언어의 특징은 다음과 같습니다. 대부분 처음보는 단어가 나오니 가볍게 한 번 읽어보세요. 자세한 내용들은 이어지는 강의들을 통해서 계속해서 학습할 예정입니다.
- C#은 .NET을 위한 많은 언어 중 하나입니다.
- C#은 Microsoft의 .NET 플랫폼 기반의 프로그래밍 언어입니다.
- 절차적 언어와 개체 지향적 언어의 특징 그리고 함수형 프로그래밍 스타일을 제공하는 다중 패러다임 프로그래밍 언어입니다.
- C#은 C, C++, Java, JavaScript와 기초 문법이 비슷한 프로그래밍 언어입니다.
- C#은 메모리 관리를 자동으로 합니다.
- C#은 컴파일 기반 언어입니다.
- C#은 C와 JavaScript와 달리 Global 함수 및 변수는 없이 모두 클래스 안에서 생성됩니다.
- C#은 강력한 형식(Strongly Typed)의 언어입니다.
- 제네릭과 LINQ의 편리한 기능을 제공합니다.
1.2.3. C# 영역
C#은 일반적인 프로그래밍 영역을 모두 다룹니다.
- 데스크톱 응용 프로그램
- 웹 응용 프로그램
- 모바일 응용 프로그램
- 데이터베이스 응용 프로그램
- 게임 프로그램
- 클라우드 프로그램
- IoT 프로그램
그림: C#과 .NET의 영역
1.2.4. C#의 역사와 버전
C#은 굉장히 오랜 기간 발전해 온 프로그래밍 언어입니다. 다음 이어지는 내용들은 간단히 읽고 넘어가면 됩니다.
1.2.4.1. C# 나오기 전의 프로그래밍 세계
C#이 세상에 나오기 전에는 Visual Basic, C, C++, Java 등의 프로그래밍 언어가 많이 사용되었습니다.
- Win32 API : C언어 기반의 Windows 응용 프로그램 제작 명령어들의 집합
- MFC : C++ 기반의 OOP 프로그래밍 환경
1.2.4.2. C# 버전
C#은 1.0 버전부터 11.0 버전까지 오랜기간 발전해 왔습니다. 이 강의 전체를 통해서 학생 개발자를 위한 C#의 거의 모든 기능을 학습합니다. 다음 표는 앞으로 배울 내용이니 참고용으로 보시면 됩니다.
버전 | 발표 | 특징 |
---|---|---|
1.0 | 2002년 2월 13일 | C#의 첫번째 버전 닷넷 프레임워크(.NET Framework) 1.0 간결하고 현대화된 언어 관리된 코드(Managed Code) 자동화된 가비지 컬렉션(Garbage Collection) |
1.1 | 2003년 | Visual Studio 도구 기능 향상 |
2.0 | 2005년 | 제네릭(Generics) 부분(Partial) 클래스 무명 메서드(Anonymous Method) 이터레이터(반복기, Iterator) 널 가능 형식(Nullable Types) Static 클래스 |
3.0 | 2006년 | 암시적으로 형식화된 변수(Implicitly Typed Local Variables) 개체 이니셜라이저(Object Initializer) 컬렉션 이니셜라이저(Collection Initializer) 무명 형식(Anonymous Types, 익명 형식) 확장 메서드(Extension methods) 람다 식(Lambda Expressions) 자동 구현 속성(Auto-Implemented Properties) 쿼리 식(Query Expressons) 익스프레션 트리(Expression Trees) |
3.5 | 2007년 | LINQ(Language Integrated Query) |
4.0 | 2010년 | 다이나믹 바인딩(Dynamic Binding) 명명된 또는 선택적 인수(Named & Optional Arguments) |
4.5 | 2012년 | |
5.0 | 2013년 | 비동기(async와 await) 비동기 메서드(Asynchronous Methods) |
6.0 | 2014년 | 문자열 보간법(String Interpolation) 정적 멤버를 위한 using static 구문 자동 속성 이니셜라이저(Auto-Property Initializers) 널 조건부 연산자(Null-Conditional Operator) 식 본문 멤버(Expression-Bodied Members) nameof 연산자 |
7.0 | 2016년 | 튜플(Tuples)과 튜플 해체(Deconstruction) 패턴 매칭(Pattern Matching) 숫자 구분자(Digit Separator)와 이진 리터럴(Binary Literals) 로컬 함수(Local Functions) 참조 반환(ref returns) out 키워드 기능 향상(out var) |
8.0 | 2019년 | nullable 참조 형식 비동기 스트림 |
9.0 | 2020년 | Top Level Statements |
10.0 | 2021년 | ... |
11.0 | 2022년 | ... |
아직 C#에 대해서 전혀 배우지 않은 상태에서 위 표를 제시하는 이유는 C#이 오랜 기간동안 꾸준히 프로그래밍 언어로서 발전을 해왔다는 사실을 보여주기 위함입니다.
버전 | 기능 및 주요 변경 사항 | |
---|---|---|
C# 1.0 | 2002 | 초기 버전, 기본 문법 및 기능 추가 |
C# 2.0 | 2005 | C# 1.0 대비 개선된 문법 및 기능 추가, Nullable 데이터 타입 등 |
C# 3.0 | 2007 | 람다식, 익명 타입, LINQ(Language-Integrated Query) 등 추가 |
C# 4.0 | 2010 | 선택적 매개변수, 동적(dynamic) 키워드, 콜렉션 초기화 등 추가 |
C# 5.0 | 2012 | async/await 키워드, Caller Information 특성, 제네릭 반변성 등 추가 |
C# 6.0 | 2015 | null 조건부 연산자, 문자열 보간, using static 키워드 등 추가 |
C# 7.0 | 2017 | 튜플(Tuple) 기능 추가, out 변수 지정, 패턴 매칭 등 추가 |
C# 7.1 | 2017 | async main 메서드, default 리터럴 표현식 등 추가 |
C# 7.2 | 2018 | private 보호 수준 프로퍼티 getter, ref readonly 지원 등 추가 |
C# 7.3 | 2018 | value Tuple 확장, ref readonly struct, enum 형식에 대한 고정 크기 buffer 추가 |
C# 8.0 | 2019 | nullable 참조형식, switch 식 패턴 매칭, 정적 로컬 함수 등 추가 |
C# 9.0 | 2020 | 레코드(Record) 타입, init accessors, pattern matching for property 등 추가 |
2022 | Global using, file-scoped namespaces, interpolated strings, lambda discard 등 추가 |
1.2.5. C#의 디자인 철학
C# 6.0 이후로는 디자인 철학이 큰 변화는 없지만 작은 기능들이 지속적으로 추가되고 깨끗한 코드가 만들어지도록 하는 노력들이 담기고 있습니다.
C#의 독특한 특징 중 하나는 100% 하위 호환성을 지키고 있습니다. C# 1.0 버전부터 11.0 버전까지 올라오면서 낮은 버전에서 지원하던 기능이 높은 버전으로 올라가면서 없어진게 단 하나도 없습니다.
1.2.6. 새로운 C# 그리고 닷넷(.NET)
처음 C#이 만들어질 당시에는 Windows 기반의 .NET Framework에서 실행되었지만, 지금은 크로스 플랫폼을 지원하는 .NET Core 기반으로 제공됩니다. 이제는 닷넷프레임워크와 닷넷코어는 합쳐서 그냥 닷넷으로 부릅니다.
- 크로스 플랫폼
- 오픈소스
- 원하는 모든 에디터 사용 개발
- Visual Studio Code
- Visual Studio
1.3. 닷넷(.NET) 생태계
1.3.1. .NET
.NET은 소프트웨어 프레임워크입니다. .NET은 응용 프로그램 개발 속도를 높이는 데 도움이되는 API(Application Programming Interface) 및 서비스 모음입니다. 2002년 2월 13일 처음으로 1.0 버전으로 세상에 공개되었고 동일하게 C#도 1.0 버전으로 출시가 되었습니다. .NET으로 시작되는 많은 용어는 모두 .NET 생태계에 포함됩니다. 예를 들어, .NET Framework, .NET Core, .NET Standard 등이 그것입니다. C#은 .NET 생태계의 모든 영역에서 사용할 수 있는 프로그래밍 언어입니다. 필자가 C#을 첫 번째 언어로 사용하고 있는 이유는 .NET의 모든 영역에서 사용할 수 있고 LINQ라는 기능을 통해서 쉽게 프로그래밍을 할 수 있기때문입니다.
그림: 닷넷 생태계
닷넷(.NET)은 다음과 같이 정리할 수 있습니다.
- 무료, 오픈 소스, 크로스 플랫폼 개발 환경
- 런타임 엔진(여러 명령어들의 집합)
- 여러 언어 제공: C#, Visual Basic, F#
- 웹, 데스크톱, 모바일, 게임, IoT, 클라우드 등 모든 영역의 개발 환경 제공
.NET은 내부적으로 CLR과 FCL로 구분할 수 있습니다. 다음은 간단히 읽고 넘어갑니다.
- CLR(Common Language Runtime): 런타임 엔진으로 닷넷의 모든 소프트웨어를 돌리는 엔진 역할을 합니다.
- CLR에는 Type System, Garbage Collector, Exception Handling 등의 기능들이 들어 있습니다.
- FCL(Framework Class Library): 라이브러리 모음으로 닷넷 개발에 필요한 필수 라이브러리 클래스들의 집합입니다. 참고로, Windows Terminal 또는 Windows의 명령 프롬프트에서 “dotnet --info” 명령어를 실행하면 설치되어 있는 .NET에 대한 상세 정보를 확인할 수 있습니다.
1.3.2. .NET Framework
.NET Framework는 Windows 기반 운영체제에 설치되고 ASP.NET, Windows Forms, WPF 등의 기술을 포함합니다. C#은 .NET Framework의 일부입니다. .NET Framework는 실행 환경입니다. 닷넷 프레임워크(.NET Framework)는 운영체제, 데이터베이스와 같이 프로그래밍을 위한 API의 집합체를 가리킵니다. 여기서 API(Application Programming Interface)는 프로그래밍을 위한 주요 명령어들의 모음을 뜻합니다. .NET Framework는 응용 프로그램을 만드는 또 다른 종류의 소프트웨어입니다. 운영 체제, 데이터베이스 및 .NET 프레임워크는 모두 하나의 큰 소프트웨어 프로그램입니다. 응용 프로그램을 작성하려면 프로그래밍 언어가 필요합니다. C#, Visual Basic 및 F#과 같은 프로그래밍 언어는 .NET Framework에 포함되어 있습니다.
1.3.3. .NET Core
.NET Core는 크로스 플랫폼을 지원하고 ASP.NET Core, Blazor, Windows Forms, WPF 등의 기술을 포함합니다. .NET Core는 많은 버전들이 하나의 머신에서 함께 실행될 수 있으며 .NET Framework 기반보다 성능향상에 중점을 두고 있습니다.
1.3.4. .NET MAUI와 자마린(Xamarin)
C# 프로그래밍 언어를 사용하여 모바일 응용 프로그램을 제작할 수 있습니다. 이 때 사용할 수 있는 기술이 마우이(MAUI) 및 자마린(Xamarin)입니다. 이 기술들을 사용하게 되면 iOS, Android 기반의 모바일 응용 프로그램을 C#과 XAML 기술로 만들어 낼 수 있습니다.
1.3.5. .NET Standard
.NET Framework, .NET Core, 모바일 개발 영역에서 공통적으로 사용할 코드를 모아 놓는 기능을 닷넷 표준(.NET Standard)로 볼 수 있습니다.
1.3.6. 유니티(Unity)
.NET 생태계에 직접적으로 포함되지 않지만, 게임 엔진 중 유명한 유니티에서 가장 많이 사용되는 언어 중 하나가 C#입니다. 게임을 제작할 때 게임 로직을 C# 프로그래밍 언어를 사용하여 제작합니다.
1.4. 이 강의의 범위
이 강의에서는 C#과 닷넷으로 할 수 있는 굉장히 많은 부분 중에서 다음 그림의 첫 번째에 해당하는 C#의 기초에 대해서 다룹니다.
그림: C#의 범위
1.5. 요약
프로그래밍을 학습할 때 처음으로 C#을 선택했다면 이는 탁월한 선택 중 하나입니다. C#은 가장 현대적인 프로그래밍 문법과 도구를 제공하고 모든 영역의 프로그래밍을 가능하게 해줍니다. 이 강의 전체를 통해서 C# 프로그래밍 언어를 사용하여 프로그램을 작성할 수 있는 기초를 완성해 나가도록 하겠습니다.