전체 소스 코드를 한 번에 번역해서 기계어(실행 파일)로 변경하는 프로그램
소스코드(.cs) -> 컴파일 -> 실행파일(.exe) -> 실행
소스 코드를 한 줄씩 읽고 해석해 바로 실행하는 프로그램
소스코드 -> 실시간 기계어로 해석(실행파일 X)
C# 프로그램 개발을 위한 기본 단위
비주얼 스튜디오에서 복수의 소스파일과 기타 부속 정보를 함께 묶어 관리하기 위한 개념
비주얼 스튜디오에서 관련 프로젝트 여러 개를 함께 관리할 수 있는 단위
using 키워드만 사용하면 네임스페이스 전체 사용
ex) using System;
데이터 형식(예: 클래스)의 정적 멤버를 데이터 형식의 이름을 명시하지 않고 참조하겠다 선언하는 기능으로 코드를 보다 간결하고 직관적으로 만들 수 있다
ex) using static System.Math;
global using을 한 번 선언하면 프로젝트 내 어디서든 해당 namespace를 참조한다.
ex) global using System.Math;
메모리 - 한 번만 생성되어 공유 (프로그램이 시작 될 때 메모리의 데이터 영역에 올라가며, 프로그램이 종료될 때까지 유지된다.)
메모리 - 객체마다 따로 생성됨 (힙 영역에 객체 정보와 함께 올라간다.)
class MyClass
{
public static int staticCnt = 0; // 정적 멤버
public int instanceCnt = 0; // 비정적 멤버
public MyClass()
{
staticCnt++;
instanceCnt++;
}
}
class Program
{
static void Main()
{
MyClass obj1 = new MyClass();
MyClass obj2 = new MyClass();
Console.WriteLine(MyClass.staticCnt); // 2 -- 정적 멤버 모든 객체가 같은 staticCnt를 공유
Console.WriteLine(obj1.instanceCnt); // 1 -- 비정적 멤버 - 객체별 따로 존재
Console.WriteLine(obj2.instanceCnt); // 1 -- 비정적 멤버
}
}
네임스페이스는 성격이나 하는 일이 비슷한 클래스, 구조체, 인터페이스, 대리자, 열거 형식등을 하나의 이름 아래 묶는 일을 한다.
⚔ 네임스페이스를 만들 때
namespace 네임스페이스 이름
{
// 클래스
// 구조체
// 인터페이스 등..
}
namespace Hello
{
class HelloClass
{
}
}
using Hello; 문장을 이용해서 네임스페이스를 참조하거나, Hello.HelloClass 처럼 클래스가 소속되어 있는 네임스페이스와 클래스의 이름을 붙여줘야한다.
한 개의 C# 소스 파일(.cs)는 여러 개의 네임스페이스를 가질 수 있다.
⚔ 한 개의 C# 소스 파일에 namespace가 여러 개 일 때
namespace Devices
{
//...
}
namespace Softwares
{
//...
}
하지만 대부분의 경우 파일 하나에 네임스페이스 하나씩만 선언해서 파일 범위 네임스페이스(File Scoped Namespace) 등장
파일 범위 네임스페이스는 namespace 선언 뒤에
{}없이 세미콜론;를 붙이면 그 파일의 모든 코드는 해당 네임스페이스 소속으로 들어가게 만든다.
namespace Devices;
이 메소드는 프로그램의 진입점(Entry Point)로서 프로그램을 시작하면 실행되고 이 메소드가 종료되면 프로그램도 역시 종료된다.
따라서 모든 프로그램은 반드시 Main이라는 이름을 가진 메소드를 하나 가지고 있어야 한다.
유니티의 Entry Point는 유니티 엔진 내부에서 관리를 한다.
유니티의 Entry Point 참고: https://discussions.unity.com/t/where-is-the-entry-point-for-a-c-application/46541