C#은 C++를 계승한다는 의미로 붙여진 이름으로 마이크로소프트Microsoft의 앤더스 헤일스버그Anders Hejlsberg가 만들었다. C++에서 +를 하나 더 붙여서 C#이라는 이름을 붙였다고 한다.
1990년 대, Microsoft에서는 .NET이라는 비전을 발표하면서 인터넷 서비스는 모든 기기에서 사용할 수 있어야하며, 이를 위한 플랫폼으로 .NET(닷넷)을 만들어 냈다.
C#은 이 닷넷을 기반으로 작동하는 프로그래밍 언어이며, 다양한 플랫폼에서 닷넷만 지원하면 사용이 가능하다.
using System; //system 네임스페이스 사용을 컴파일러에게 알림
namespace Hello{ //현재 네임스페이스의 정의
class Main{ //클래스 선언
static MainApp(String[] _args){//클래스 내의 메소드(함수) 선언및 정의
Console.WriteLine("Hello, World!!");
}
}
}
Namespace는 성격이나 하는 일이 비슷한 클래스, 구조체, 인터페이스, 대리자, 열거 형식등을 하나의 이름 아래 묶는 일을 합니다. 각종 클래스들과 구조체 등을 포함하여 다른 네임스페이스에서 사용할 때 using 키워드를 사용하여 클래스를 호출하거나 상속해서 원하는 작업을 진행할 수 있습니다.
클래스는 객체지향 프로그래밍Object Oriented Programming의 기본으로 코드 내의 모든 것을 표현하르는 프로그래밍 패러다임을 뜻한다. 속성을 데이터로 기능을 메소드로 표현하며 추상적으로 나타낸는 것을 객체지향 프로그래밍이라고 한다. 클래스는 객체가 가지게 될 속성과 기능을 정의하지만 실체를 가지지 않고 클래스를 이용해서 객체가 실체를 가지는 것처럼 구현 할 수 있다.
클래스는 메소드method와 각각의 변수들을 포함한 집합체이며, 여기서 메소드는 c언어의 함수와 동일하다. C++ 역시 객체지향 언어로 클래스 개념이 포함되어 있다.
C#의 변수 유형은 C와 거의 동일하다.
| 이름 | 설명 | 크기(byte) | 범위 |
|---|---|---|---|
| byte | 부호 없는 정수 | 1 | 0 ~ 255 |
| sbyte | signed byte 정수 | 1 | -128 ~ 127 |
| short | 정수 | 2 | -32,768 ~ 32,767 |
| ushort | unsigned short 부호없는 정수 | 2 | 0 ~ 65,535 |
| int | 정수 | 4 | -2,147,483,648 ~ 2,147,483,647 |
| uint | unsigned int 부호없는 정수 | 4 | 0 ~ 4,294,967,295 |
| long | 정수 | 8 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,808 |
| ulong | unsigned long 부호없는 정수 | 8 | 0 ~ 18,446,744,073,709,551,615 |
| char | 유니코드 문자 | 2 |
부동소수점 형식(실수)도 C와 동일하다.
| 이름 | 설명 | 크기(바이트) | 범위 |
|---|---|---|---|
| float | 단일 정밀도 부동 소수점 형식(소숫점 7자리) | 4 | -3.402823e38 ~ 3.402823e38 |
| double | 복수 정밀도 부동 소수점 형식(15 ~ 16개의 자릿수를 다룰 수 있음) | 8 | -1.79769313486232e308 ~ 1.79769313486232e308 |
| 이름 | 설명 | 크기(바이트) | 범위 |
|---|---|---|---|
| decimal | 29자리 데이터를 표현할 수 잇는 소수형식 | 16 | +- 1.0 10e-28 ~ +-7.910e28 |
| 이름 | 설명 | 크기(바이트) | 범위 |
|---|---|---|---|
| bool | 논리형식 | 1 | true, false |
object는 객체라는 뜻을 지니며 어떤 데이터든지 다룰 수 있는 데이터 형식을 의미한다.
object 형은 다른 모든 자료형으로부터 형식을 상속 받아 모든 자료형을 담을 수 있다.
상속의 의미는 다음에 다룰 것이다.
object 형은 참조 형식으로 데이터를 힙heap 영역에 할당한다.
값 형식의 데이터를 할당하기 위해 '박싱Boxing' 기능을 사용하여 값을 할당한다.
그리고 박싱된 값을 꺼내 값 형식 변수에 저장하는 과정을 일컬어서 '언박식Unboxing'이라고 한다.
C#에는 문자열을 저장하기위한 String이라는 클래스가 존재한다. 이는 자료형처럼 보이지만 실제로는 클래스내부의 문자열을 다루기 위한 메소드들이 들어있어 문자열에 대한 접근, 수정이 가능하다. 그리고 C#에는 이러한 문자열을 숫자로 변형할 수 있다.
int a = int.Parse("12345");
float b = float.Parse("123.45");
Parse() 메소드로 진행할 수도 있고
int c = 12345;
string d = c.ToString();
float e = 123.45f;
string f = e.ToString();
각 자료형은 object 형으로부터 상속받은 ToString()이라는 메소드로 문자열로 변환할 수 있다.
문자열도 ToInt()같은 메소드로 가능하다.
C#은 변수나 상수에 대해 깐깐하게 검사를 하는 강력한 형식의 언어Strong Typed Language이다. var 키워드는 사용자가 일일히 형식을 외워 변수에 할당할 귀찮음을 줄이는 편리함을 주는 자료형이다. 선언하면 컴파일러가 자동으로 해당 변수의 형식을 유추해서 지정해준다. 다만, 사용할려면 선언과 동시에 초기화를 해줘야 한다.
다만 좀 더 정확하게 값에 대한 연산이 필요하다면 var형 보단 다른 자료형을 선언해주는게 좋을 것 같다.
C#6.0에서 새로 도입된 기능으로, 기존의 출력문 System.Console.WriteLine()에 '$'를 붙여서 사용한다.
int a = 10;
System.Console.WriteLine($"a = {a}");
// a = 10
string b = "Hello, World!";
System.Console.WriteLine($"{b}");
// Hello, World!
문자열을 생성할 때 3가지 방법이 있는데
static string valueStr1 = "Value " + "is " + value.ToString();
static string valueStr2 = string.Format("Value is {0}",value);
static string valueStr3 = $"Value is {value}";
위 방법중에는 보간법이 제일 빠르지만 StringBuilder의 Append 메소드를 사용한 방법이 제일 빠르다고 한다.
StringBuilder sb = new StringBuilder();
sb.Append("Value");
sb.Append(" is ");
sb.Append(value);
Console.WriteLine(sb.ToString());