전체적으로 보면 C, C++, C# 같은 언어를 살펴보면 다음과 같은 차이점을 발견할 수 있습니다.
- C 프로그램은 함수와 자료형의 집합으로 구성됨
- C++ 프로그램은 함수와 클래스의 집합으로 구성됨
- 반면 C# 프로그램의 본질은 형식 선언들의 묶음입니다
C# 실행 파일(EXE) 혹은 동적 연결 라이브러리(DLL)의 소스 코드는 한 줄 이상의 형식 선언으로 이루어집니다.
DLL에는 Main 프로그램 진입점이 없고, 실행 파일(EXE)은 코드 안에 최소 하나의 클래스를 선언해야 하며 해당 클래스 안에 Main이라는 메서드(프로그램 시작점)를 포함해야 합니다.
대형 소프트웨어는 소스 코드 안에 수천 가지의 형식(클래스 등)을 포함할 수 있습니다. 규모가 큰 프로젝트는 여러 개발자가 각자 모듈을 나눠 개발하기 때문에 동일한 이름의 형식 충돌이 피하기 어렵습니다. 이름 충돌을 해결하는 방법은 앞서 설명한 ‘네임스페이스’를 활용하는 것입니다.
네임스페이스(namespace)는 연관된 여러 형식 선언을 그룹화하고 해당 그룹에 통일된 이름을 부여하는 기능입니다. 프로그램 자체가 서로 연관된 형식 선언의 집합이므로 개발자는 보통 사용자 정의 네임스페이스를 만들고 모든 프로그램 형식을 그 안에 선언합니다.
쉽게 풀어서 설명하면 네임스페이스는 여러 클래스에 그룹 이름을 붙이는 방식입니다. 다른 영역에서 이 클래스에 접근하려면 그룹 이름을 함께 적어줘야 합니다.
같은 반에 이름이 똑같은 학생 두 명이 있다고 가정해보세요. 선생님과 학생들은 이름만으로 구분할 수 없기 때문에 A조의 TOM, B조의 TOM처럼 조 이름을 붙여 구분합니다. 여기서 A, B 조가 네임스페이스의 역할과 같습니다.
아래 코드는 세 가지 형식 선언이 담긴 프로그램 예시로, 모든 형식은 MyProgram이라는 네임스페이스 내에 정의되어 있습니다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HelloDemo // 네임스페이스 선언
{
class A // 형식A (클래스) 선언
{
void Fun1() //함수
{
// 프로그램 로직
}
}
class B // 형식B (클래스) 선언
{
void Fun1() //함수
{
// 프로그램 로직
}
}
class C // 형식C (클래스) 선언
{
static void Main(string[] args) //Main 프로그램 진입점
{
double pi = 3.14;
string webSite = "foxdevelop.com";
Console.WriteLine($"The Pi is {pi} and the website is {webSite}.");
}
}
}
Code language: PHP (php)
네임스페이스에 대한 자세한 설명은 이후 강의에서 다루겠습니다.
형식은 템플릿
C# 프로그램이 본질적으로 형식 선언의 집합이므로 C# 학습의 핵심은 형식을 생성하고 활용하는 법을 익히는 것입니다. 먼저 알아야 할 개념은 다음과 같습니다.
형식(Type)이란 무엇인가
형식은 자료 구조를 생성하기 위한 템플릿으로 이해할 수 있습니다. 형식 자체는 실제 자료 구조가 아니지만 이 템플릿으로 만들어진 객체가 가질 속성을 정의합니다.
형식은 단순한 ‘설계도’이므로 자체적으로 메모리를 차지하지 않고, 인스턴스화해야만 메모리가 할당되고 데이터가 저장됩니다.
형식은 실제 객체를 만들기 위한 설계도입니다. 집 설계도 하나로 여러 채의 집을 지을 수 있는 것처럼 하나의 형식으로 여러 실체 객체를 생성할 수 있습니다.
하나의 형식은 아래 세 가지 요소로 정의됩니다.
- 이름
- 멤버 데이터를 저장하는 구조
- 동작 및 제약 조건
C#에서는 모든 것이 형식이며 내장 기본 자료형도 마찬가지입니다.
대표적인 내장 형식 두 가지는 short와 int입니다.
해당 구조는 다음과 같습니다.
| short 형식 | int 형식 |
|---|---|
| 이름:short | 이름:int |
| 구조:2바이트 점유 | 구조:4바이트 점유 |
| 동작:16비트 정수 | 동작:32비트 정수 |
- 이름:형식 식별자 (
int/string/사용자 정의 클래스명) - 저장 구조:메모리 크기와 필드 배치 규칙 정의 (예:
short는 고정 2바이트) - 동작 제약:지원 연산, 값 범위, 내장 메서드 규정 (예:
int는 사칙연산 지원, 값 범위-2^31 ~ 2^31-1)
인스턴스화(Instantiate)
형식 템플릿에 new 키워드를 사용해 실제 사용 가능한 데이터 객체를 생성하는 행위
객체(object) = 인스턴스(instance)
위에서 설명한 int, short를 예시로 이 형식들로 인스턴스를 만들 수 있습니다. 아래 예시의 pi, age, nums는 각각 double, int, short 형식으로 생성된 인스턴스입니다.
namespace HelloDemo
{
class Program
{
static void Main(string[] args)
{
double pi = 3.14;
int age = 12;
short nums = 23;
}
}
}Code language: JavaScript (javascript)
C#의 프로그램 내 모든 변수와 데이터는 예외 없이 특정 형식의 인스턴스이며, 형식 없는 데이터는 존재하지 않습니다.
위 예시 코드를 참고하세요
예시의 class C는 프로그램 진입점 클래스로 실행 파일의 요구사항을 모두 만족합니다.
MyProgram네임스페이스 내에 정의된 사용자 정의 형식- 반환값 없는 정적
Main메서드를 포함하며 앱 시작 진입점 역할 수행
C#에는 class 외 다양한 형식이 존재
C#에서 선언 가능한 모든 형식:클래스(class), 구조체(struct), 인터페이스(interface), 열거형(enum), 델리게이트(delegate), 레코드(record)
BCL(Base Class Library):.NET 기본 제공 표준 클래스 라이브러리로 int, short, string, List<T> 등 시스템 기본 형식을 제공하며 개발자가 직접 인스턴스화해 사용할 수 있습니다.
형식 선언