값 형식과 참조 형식 분류
미리 정의된 내장 형식
| 분류 | 포함 형식 |
|---|---|
| 값 형식(기본 숫자 / 불리언 / 문자) | 부호 있는 정수: sbyte、short、int、long부호 없는 정수: byte、ushort、uint、ulong부동 소수점 / 고정밀: float、double、decimal불리언: bool문자: char |
| 참조 형식(내장 참조) | object(모든 형식의 기본 클래스), string, dynamic |
사용자 정의 형식
| 분류 | 형식 |
|---|---|
| 값 형식 | struct(구조체), enum(열거형) |
| 참조 형식 | class, interface, delegate, array(배열) |
지난 수업에서 언급했듯 참조 형식 데이터는 반드시 힙에 저장됩니다. 하지만 값 형식 데이터는 힙에 저장될 수도 있고 스택에 저장될 수도 있습니다.
참조 형식의 참조 정보 자체는 힙 또는 스택 어느 곳에나 저장될 수 있습니다.
값 형식 변수와 참조 형식의 참조 부분이 힙과 스택 중 어디에 저장될지는 해당 변수가 타입의 멤버인지, 함수 내 지역 변수인지에 따라 달라집니다.
네 가지 변수 종류
| 변수 종류 | 정의 및 역할 |
|---|---|
| 지역 변수 Local variable | 메서드 내 임시 데이터로 타입 멤버가 아님; 스택에 저장 자동 초기화되지 않음 |
| 필드 Field | 클래스 / 구조체에 속한 데이터로 타입 멤버; 클래스 필드는 힙에 저장 구조체 필드는 구조체의 저장 위치를 따름; 자동 초기화됨 |
| 매개변수 Parameter | 메서드 전달용 임시 변수로 타입 멤버가 아님; 스택에 저장 자동 초기화되지 않음 |
| 배열 요소 Array element | 배열 안 개별 데이터; 전부 힙에 할당 자동 초기화됨 |
자동 초기화란 개발자가 변수에 초깃값을 할당하지 않아도 컴파일러가 자동으로 기본값을 채워주는 것을 의미합니다.
간단하게 정리하면 다음과 같습니다
| 변수 종류 | 저장 위치 | 자동 초기화 여부 |
|---|---|---|
| 지역 변수 | 스택 / 스택 + 힙 | 아니오 |
| 클래스 필드 | 힙 | 예 |
| 구조체 필드 | 스택 / 힙 | 예 |
| 메서드 매개변수 | 스택 | 아니오 |
| 배열 요소 | 힙 | 예 |

변수 선언
형식:타입 변수명;
int var2;Code language: C# (cs)
위 코드는 변수를 선언하며 주요 두 가지 작업을 수행합니다:
- 컴파일러에 var2가 int 타입 변수임을 알립니다.
- 컴파일러가 메모리 공간을 할당합니다. 힙 또는 스택 중 어느 곳에 할당할지는 해당 변수가 지역 변수인지, 매개변수인지, 필드인지 등 상황에 따라 달라집니다.

변수 초기화자(Initializer)
문법:타입 변수명 = 초깃값;
예시:int var2 = 17;
초기화자는 컴파일러에서 제공하는 기능으로 변수 초기화를 돕습니다. 일부 변수는 개발자가 코드에서 직접 초기화해야 하고, 일부 변수는 초기화자에 맡겨 자동으로 초기화할 수 있습니다.
초기화되지 않은 지역 변수는 값이 미정의되어 컴파일 오류가 발생하며 직접 사용할 수 없습니다;
필드, 배열 요소 등 자동 초기화 대상 변수에는 기본값이 부여됩니다. 숫자 타입은 0, 참조 타입은 null입니다.
예시 코드를 살펴보겠습니다:
class Program
{
static void Main(string[] args)
{
int times = 100;
Person person = new Person();
}
}
class Person
{
public int age;
}
Code language: C# (cs)
이 간단한 예시에서 Main 함수 안에 값 형식 변수 times와 참조 형식 변수 person을 선언했습니다. 참조 형식 내부에는 필드 age가 존재합니다.
age에는 초깃값을 설정하지 않았고, times에는 개발자가 직접 초깃값을 할당했습니다.
이 경우 코드는 정상적으로 컴파일됩니다.

만약 times 변수에서 초깃값 100을 제거하고 아래처럼 작성하면

변수 아래 빨간 물결선이 표시되고 컴파일 자체가 불가능해집니다.
억지로 컴파일을 시도하면 오류 메시지가 출력됩니다

오류 목록 창에 상세 오류 내용이 표시됩니다

주의:코드 안에서 times 변수를 사용하는 경우에만 오류가 발생합니다. 변수를 전혀 호출하지 않으면 오류가 생기지 않고 컴파일이 가능합니다.
class Program
{
static void Main(string[] args)
{
int times;
Person person = new Person();
}
}
Code language: C# (cs)
하지만 클래스 내부 필드, 아래 예시의 Person 안 age처럼 초깃값을 설정하지 않아도 컴파일 및 실행이 정상적으로 진행됩니다.
class Program
{
static void Main(string[] args)
{
int times = 100;
Console.WriteLine(times);
Person person = new Person();
Console.WriteLine(person.age);
}
}
class Person
{
public int age;
}
Code language: C# (cs)

실행 결과로 0이 출력되는 것을 확인할 수 있습니다. age는 클래스 멤버 필드이므로 별도 초기화를 하지 않아도 초기화자가 기본값을 할당합니다. int 타입 기본값은 0이며, 타입마다 기본값은 다릅니다.
한 줄에 여러 변수 선언
- 한 줄에는 동일한 타입 변수만 선언할 수 있습니다;
- 변수명은 쉼표로 구분하며 초기화된 변수와 초기화되지 않은 변수를 함께 적을 수 있습니다;
- 한 줄에 여러 가지 데이터 타입을 혼합하는 것은 금지됩니다.
// 정상 코드
int var3 = 7, var4, var5 = 3;
double var6, var7 = 6.52;
// 오류! int 와 float 혼합
int var8, float var9;
Code language: JavaScript (javascript)
변수 값 사용하기
변수명을 직접 적는 것만으로 메모리에 저장된 값을 읽어올 수 있습니다:
Console.WriteLine("{0}", var2);Code language: JavaScript (javascript)

변수