값 형식과 참조 형식 비교
각 형식이 저장되고 복사되는 방식을 살펴봅니다.
값 형식과 참조 형식 비교은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
두 가지 형식 계열
C# 형식은 값 형식(int, double, 불리언, 구조체)과 참조 형식(클래스, 문자열, 배열)으로 나뉩니다. 두 형식은 저장되고 복사되는 방식이 다릅니다.
using System;
class Program
{
static void Main()
{
int valueType = 5; // value type
int[] referenceType = { 1, 2, 3 }; // reference type
Console.WriteLine(valueType + ", length " + referenceType.Length);
}
}값 형식은 데이터를 담습니다
값 형식 변수는 자신의 데이터를 직접 포함합니다. 일반적으로 이러한 데이터는 스택에 저장되거나 이를 포함하는 객체 내부에 직접 저장됩니다.
using System;
class Program
{
static void Main()
{
int a = 10;
double b = 3.14;
bool c = true;
Console.WriteLine(a + ", " + b + ", " + c);
}
}참조 형식은 주소를 담습니다
참조 형식 변수는 힙에 저장된 데이터를 가리키는 참조(주소)를 담습니다. 변수와 객체는 서로 별개입니다.
using System;
class Box { public int Value; }
class Program
{
static void Main()
{
Box b = new Box(); // b refers to a heap object
b.Value = 42;
Console.WriteLine(b.Value);
}
}복사 의미론: 값 형식
값 형식을 할당하면 데이터가 복사됩니다. 복사본을 변경해도 원본에는 절대 영향을 주지 않습니다.
using System;
class Program
{
static void Main()
{
int a = 1;
int b = a; // copy
b = 99;
Console.WriteLine("a=" + a + ", b=" + b);
}
}복사 의미론: 참조 형식
참조 형식을 할당하면 객체가 아니라 참조가 복사됩니다. 그러면 두 변수는 같은 객체를 가리킵니다.
using System;
class Box { public int Value; }
class Program
{
static void Main()
{
Box a = new Box { Value = 1 };
Box b = a; // same object
b.Value = 99;
Console.WriteLine("a.Value=" + a.Value + ", b.Value=" + b.Value);
}
}구조체는 값 형식입니다
직접 정의한 struct는 값 형식이므로 int처럼 할당할 때 복사됩니다.
using System;
struct Point { public int X, Y; }
class Program
{
static void Main()
{
Point p1 = new Point { X = 1, Y = 2 };
Point p2 = p1; // full copy
p2.X = 99;
Console.WriteLine("p1.X=" + p1.X + ", p2.X=" + p2.X);
}
}메서드에 전달하기
기본적으로 값 형식은 복사되어 전달되고, 참조 형식은 참조의 복사본을 전달합니다. 따라서 메서드는 호출자가 볼 수 있는 클래스 객체를 변경할 수 있지만, 일반적인 int 값은 변경할 수 없습니다.
using System;
class Counter { public int N; }
class Program
{
static void BumpInt(int x) { x++; }
static void BumpObj(Counter c) { c.N++; }
static void Main()
{
int i = 0;
BumpInt(i);
var c = new Counter();
BumpObj(c);
Console.WriteLine("i=" + i + ", c.N=" + c.N);
}
}널과 참조 형식
참조 형식만 null이 될 수 있습니다(객체가 없음을 의미합니다). 값 형식은 ?를 사용해 널 허용 형식으로 선언하지 않는 한 항상 값을 가집니다.
using System;
class Program
{
static void Main()
{
string text = null; // reference type can be null
int? maybe = null; // nullable value type
Console.WriteLine((text == null) + ", " + (maybe == null));
}
}같음 비교의 차이
값 형식에서는 ==가 데이터를 비교합니다. 참조 형식에서는 재정의되지 않은 경우 ==가 일반적으로 동일성(같은 객체인지 여부)을 비교합니다.
using System;
class Program
{
static void Main()
{
int a = 5, b = 5;
Console.WriteLine("ints: " + (a == b)); // True - same value
object o1 = new object();
object o2 = new object();
Console.WriteLine("objects: " + (o1 == o2)); // False - different identity
}
}기본값
값 형식에는 0과 비슷한 기본값(0, false)이 있고, 참조 형식의 기본값은 null입니다.
using System;
class Program
{
static void Main()
{
int defaultInt = default;
bool defaultBool = default;
string defaultString = default;
Console.WriteLine(defaultInt + ", " + defaultBool + ", null? " + (defaultString == null));
}
}종합하기
형식이 값 형식인지 참조 형식인지 알면 복사 동작, 널 허용 여부, 메서드가 해당 값을 어떻게 변경할 수 있는지 예측할 수 있습니다. 이는 올바르고 버그 없는 코드를 작성하는 데 중요한 기준이 됩니다.
using System;
struct Money { public decimal Amount; }
class Wallet { public decimal Amount; }
class Program
{
static void Main()
{
Money m1 = new Money { Amount = 10 };
Money m2 = m1; m2.Amount = 99;
Wallet w1 = new Wallet { Amount = 10 };
Wallet w2 = w1; w2.Amount = 99;
Console.WriteLine("Money copy: " + m1.Amount + " (independent)");
Console.WriteLine("Wallet ref: " + w1.Amount + " (shared)");
}
}빠른 확인
값 형식과 참조 형식에 대한 이해도를 확인해 보십시오.
복습
값 형식(int, 배정밀도 실수 형식, 부울 형식, 구조체)은 데이터를 직접 저장하고 할당할 때 복사합니다. 참조 형식(클래스, 문자열, 배열)은 힙 객체에 대한 참조를 저장하고 그 참조를 복사합니다. 기본적으로 널을 허용하는 것은 참조 형식뿐이며, 할당 동작과 같음 비교 방식도 두 형식군에서 서로 다릅니다.
using System;
struct V { public int N; }
class R { public int N; }
class Program
{
static void Main()
{
V v1 = new V { N = 1 }; V v2 = v1; v2.N = 9;
R r1 = new R { N = 1 }; R r2 = r1; r2.N = 9;
Console.WriteLine(v1.N + " vs " + r1.N);
}
}자주 묻는 질문
“값 형식과 참조 형식 비교” 강의는 무료인가요?
네 — “값 형식과 참조 형식 비교” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“값 형식과 참조 형식 비교”에서 뭘 배우나요?
각 형식이 저장되고 복사되는 방식을 살펴봅니다. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C# Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“값 형식과 참조 형식 비교” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 값 형식과 참조 형식 비교
- 박싱과 언박싱
- 암시적 및 명시적 변환
- Convert 클래스와 구문 분석