C#의 기본문법은 앞서 살펴봤듯이 타 언어와 비슷한 부분이 매우 많기 때문에 내가 완전히 알고 있지는 못한, C#에서 더 알게 된 부분들을 위주로 간단하게만 정리를 해보았다.
C#은 기본적으로 컴파일 언어이므로 소스코드를 모두 작성한 뒤에 컴파일이 진행된다.
가장 먼저, 기본적인 코드를 작성해보도록 하자
실행은 앞서 말했듯이, VSCode에서 실행을 해볼건데
처음이니까 첫 세팅부터 다시 적어보겠다.
가장 먼저 바탕화면이든 어디든 마음에 드는 위치에 폴더를 하나 생성한다.
그 다음 터미널을 열어서 해당 위치로 이동한다.
📎 `cd 파일명` : 해당 파일 위치로 이동 (하위폴더로 이동) `..cd` : 상위 폴더로 이동 (이전위치로 이동) `mkdir` : 폴더 생성 `ls` : 현재 폴더에 있는 모든 파일 확인원하는 위치에 도달하고 나면 아래의 명령어를 작성해본다.
dotnet new console
이렇게 실행하고나면 파일 구조가 생성되며

vsCode에는 아래와 같은 파일 구조가 만들어지게 된다.
우리는 이제 Program.cs에 코드를 작성하면 된다.
using System;
using static System.Console;
namespace myFirstCode
{
class MainApp
{
static void Main(string[] args)
{
if (args.Length == 0)
{
Console.WriteLine("Hello World!");
return;
}
}
}
}
한번 실행을 시켜보자. 터미널을 열어서 아래의 명령어를 입력하면 프로그램이 실행되며,
dotnet run
결과는 ‘Hello World!’가 나오게 될 것이다!
이제 저 위의 코드를 하나하나 뜯어보도록 하자.
using System;
using static System.Console;
namespace myFirstCode
{
class MainApp
{
static void Main(string[] args)
{
if (args.Length == 0)
{
Console.WriteLine("Hello World!");
return;
}
}
}
}
using : 네임스페이스 전체를 이용하겠다는 의미.
using static : 어떤 데이터 형식 (ex. class)의 정적 멤버를 데이터 형식의 이름을 명시하지 않고 참조하겠다고 선언하는 기능.
namespace : 성격이나 하는 일이 비슷한 클래스, 구조체, 인터페이스, 대리자, 열거 형식 등을 하나의 이름 아래 묶는 것.
C#의 주석은 C 계열과 마찬가지로 //
static void Main(string[] args){}
: Common Language Runtime
→ java 가상머신과 비슷한 역할 / C#뿐 아니라 다른 언어도 지원하도록 설계됨. ⇒ 서로다른 언어가 만나는 지점이 IL!!
⇒ 플랫폼에 최적화된 코드를 만들어 냄 !!!!!!!
: .NET 라이브러리와 함꼐 OS 위에 설치됨.
⇒ C# 컴파일러가 C# 소스코드를 컴파일해서 IL(intermediate language)이라는 중간 언어로 작성된 실행 파일을 만들어내면, 사용자가 이 파일을 실행시키면 CLR이 중간 코드를 읽어들여 다시 하드웨어가 이해할 수 있는 네이티브 코드로 컴파일후 실행함 == JIT (just in time) 컴파일 {실행에 필요한 코드를 실행할 때마다 실시간으로 컴파일해서 실행함}
데이터 형식

스택은 “{”괄호가 시작된 후 값을 스택에 쌓은 후 괄호 “}”를 만나면 스택에 있는 데이터들이 LIFO 순서대로 걷혀나감. ⇒ 코드블록 안에서 생성된 모든 값 형식의 변수들은 프로그램 실행이 중괄호를 만나면 메모리에서 제거됨.
힙 : CLR의 가비지 컬렉터로 저장된 데이터를 제거함.
참조 형식 : 힙 영역에는 데이터를 저장하고 스택 영역에는 데이터가 저장된 힙 메모리의 주소를 저장함. ⇒ 데이터를 직접 저장하는 대신 실제 데이터가 저장된 메모리의 주소를 “참조”한다고 해서 참조 형식!
데이터 오버플로 (Overflow) / 언더플로 (Underflow)
표현할 수 있는 값보다 많이 표현하거나 적게 표현할 수 없다.
박싱과 언박싱
object a = 20;
int b = (int)a;
enum 열거 형식명 : 기반 자료형 {상수1, 상수2, 상수3, ...} // => 0, 1, 2, ... 값을 갖게 됨
0이 아닌 비어있는 변수, 즉 null 상태인 변수는 변수에게 할당된 메모리 공간을 비워둘 수 있는 Nullable 형식을 용하면 됨.
데이터 형식**?** 변수이름;
C#은 변수나 상수에 대해 깐깐하게 형식 검사를 하는 강력한 형식의 언어(Strong Type Language)인데, 강력한 형식 검사는 프로그래머의 실수를 줄여주고 의도치 않은 형식의 데이터를 읽거나 할당하는 일을 막아준다. 그러나 약한 형식 검사도 단점만 있는 것은 아니다. 코드를 작성하는 단계에서는 약한 형식 검사가 더 편리하다. 일단 변수를 선언해서 데이터를 할당하면, 컴파일러나 인터프리터가 해당 변수에 담는 데이터를 보고 자동으로 형식을 지정해준다.
C#은 var 이라는 키워드를 통해 약한 형식 검사를 하는 언어의 편리함도 지원한다.
단, 이것은 지역변수로만 사용할 수 있다 !!
?. : 객체의 멤버에 접근하기 전에 해당 객체가 null인지 검사하여 그 결과가 참이면 그 결과로 null을 반환하고, 그렇지 않은 경우에는 . 뒤의 지정된 멤버를 반환함.
switch (조건식)
{
case 상수1:
break
case 상수2: // when f >= 0 : d와 같이 if문과 유사하게 when을 붙여 조건을 함께 작성 가능..ㅋ
break
....
default:
break;
}
foreach(데이터형식 변수명 in 배열_또는_컬렉션){}
참조에 의한 전달
: ref
static void Swap(ref int a, ref int b)
{
int temp = b;
b = a;
a = temp;
{
반환값을 참조하는 경우?
class SomeClass
{
int SomeValue = 10;
public ref int SomeMethod()
{
return ref SomeValue;
}
}
출력 전용 매개변수
void Divide(int a, int b, out int quotient, out int remainder)
{
quotient = a/b;
remainder = a%b;
}
int a=20;
int b=3;
int c;
int d;
Divide(a,b,out c, out d);
Console.WriteLine("Quotient : {0}, Remainder {1}", c, d);
int Sum (params int[] args)
{
int sum = 0;
for (int i=0; i<args.Length; i++)
{
sum+=args[i];
}
return sum;
}
메소드 안에서 선언되고, 선언된 메소드 안에서만 사용되는 특별한 함수.
클래스의 멤버가 아니기 때문에 메소드가 아니라 함수라고 부름!!