Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 테더
- #csharp #var키워드 #타입추론 #암묵적형식지정 #익명형식 #linq #지역변수 #csharp세미나
- #csharp #연산자우선순위 #결합성 #operatorprecedence #연산자결합 #오른쪽결합 #왼쪽결합 #csharp세미나
- #csharp #수치형식 #numerictypes #리터럴 #형식추론 #접미사 #decimal #float #double #프로그래미링기조 #그래피포뷰
- #csharp #double #decimal #실수형 #정밀도 #부동소수점 #고정소수점 #금융계산 #과학계산 #csharp세미나 #닷넷기초
- #csharp #수치변환 #형식변환 #자동변환 #명시변환 #convert #parse #tryparse #csharp세미나
- 무노동수입
- 파이썬
- c#string
- #csharp #스택과힙 #메모리구조 #값형식 #참조형식 #박싱 #가비지컬렉션 #힙메모리 #메서드스택 #csharp세미나
- #csharp #널연산자 #nulloperator #널조건부연산자 #널접합연산자 #nullcheck #csharp세미나 #nullsafe #코드안정성
- #csharp #기본값 #definiteassignment #default키워드 #초기화규칙 #구조체초기화 #null값 #csharp세미나
- #csharp #매개변수 #ref #out #params #명명된인수 #선택적매개변수 #메서드전달 #csharp세미나
- #csharp #문자열 #문자 #string #char #문자열보간 #문자열연결 #문자열비교 #형식지정자 #문자변환 #csharp세미나
- 빗썸api
- c#
- #csharp #조건연산자 #삼항연산자 #논리연산자 #단락평가 #ifelse축약 #조건문 #프로그래밍기초 #csharp세미나
- #csharp #비트연산자 #bitwiseoperators #flagsenum #masking #시프트연산 #비트연산 #성능최적화 #csharp세미나 #하드웨어제어
- #csharp #부동소수점 #반올림오차 #실수계산 #float #double #decimal #mathround #정확도비교 #csharp세미나
- #csharp #관계연산자 #상등연산자 #equals #비교연산 #null비교 #float비교 #csharp기초 #csharp세미나 #문자열비교
- #csharp #산술연산자 #arithmeticoperators #기초프로그래밍 #csharp기초 #연산자우선순위 #정수연산 #실수연산 #math클래스 #나눗셈예외 #csharp세미나 #닷넷개발 #프로그래밍입문
- 빛썸
- #csharp #부동소수점 #nan #infinity #특수값 #ieee754 #수치계산 #double #float #decimal #csharp세미나
- #csharp #배열 #다차원배열 #가변배열 #배열초기화 #indexrange #span #배열비교 #csharp기초 #배열세미나
- #csharp #표현식 #배정표현식 #void표현식 #연산자 #산술연산자 #조건연산자 #표현식기초 #csharp세미나
- 자동매매
- #csharp #산술오버플로우 #checked #unchecked #overflowexception #정수연산 #오버플로우처리 #csharp세미나 #디버깅 #성능최적화
- #csharp #bool #boolean #논리연산자 #부울연산자 #단락평가 #조건문 #csharp기초 #삼항연산자 #csharp세미나
- c#bool
- USDT
Archives
- Today
- Total
맛있는 개발노트 (맛과 개발을 함께)
C# 세미나 자료: 값 형식과 참조 형식 본문
1. 개요
C#에서 **값 형식(Value Type)**과 **참조 형식(Reference Type)**은 메모리 처리 방식과 동작에 있어 중요한 차이를 보입니다. 본 세미나에서는 두 형식의 차이점, 사용 방법, 메모리 구조, 복사 방식 및 실무 활용법 등을 초급~고급 단계로 나누어 설명합니다.
2. 기본 이론
2.1 값 형식 (Value Type)
- 스택(Stack) 메모리에 저장
- 데이터를 직접 담음
- 복사 시 값 자체가 복사됨
- 기본 예시: int, float, bool, char, struct, enum
2.2 참조 형식 (Reference Type)
- 힙(Heap) 메모리에 저장
- 데이터의 참조(주소)를 저장
- 복사 시 참조(주소)가 복사됨
- 기본 예시: string, class, object, interface, delegate
3. 단계별 설명
3.1 초급: 기본 개념 이해
예시 코드
int a = 10;
int b = a; // b는 a의 값을 복사
b = 20;
Console.WriteLine(a); // 출력: 10
class Person {
public string Name;
}
Person p1 = new Person();
p1.Name = "홍길동";
Person p2 = p1;
p2.Name = "이영희";
Console.WriteLine(p1.Name); // 출력: 이영희
주의사항
- 값 형식은 복사된 값이 서로 독립적으로 존재
- 참조 형식은 같은 객체를 가리키므로 한 쪽을 수정하면 다른 쪽도 영향 받음
3.2 중급: 구조체와 클래스 차이, 메서드 전달
구조체 vs 클래스 비교
항목구조체 (struct)클래스 (class)
저장 위치 | 스택 | 힙 |
상속 | 불가능 | 가능 |
기본 상속 | System.ValueType | System.Object |
기본 용도 | 가벼운 데이터 구조 | 복잡한 객체 |
메서드 전달 예시
void ModifyValue(int x)
{
x += 10;
}
void ModifyRef(Person p)
{
p.Name = "수정됨";
}
int num = 5;
ModifyValue(num);
Console.WriteLine(num); // 출력: 5
Person p = new Person { Name = "초기값" };
ModifyRef(p);
Console.WriteLine(p.Name); // 출력: 수정됨
팁
- 값 형식은 out/ref로 전달하지 않으면 복사본 처리
- 참조 형식은 항상 참조로 전달되며, 내부 값 변경 가능
3.3 고급: boxing/unboxing, nullable, 복사 전략
Boxing / Unboxing
- Boxing: 값 형식을 참조 형식으로 변환 (object에 할당)
- Unboxing: 참조 형식을 다시 값 형식으로 변환
int i = 123;
object o = i; // Boxing
int j = (int)o; // Unboxing
Nullable 값 형식
- 값 형식은 기본적으로 null 불가 → ?를 사용하면 null 허용
int? age = null;
if (age.HasValue)
Console.WriteLine(age.Value);
깊은 복사와 얕은 복사
- 참조 형식을 복사할 때 복제 방식 결정 필요
Person original = new Person { Name = "원본" };
Person shallow = original; // 얕은 복사
Person deep = new Person { Name = original.Name }; // 깊은 복사
4. 결론
- 값 형식과 참조 형식은 메모리 구조, 복사 방식, 데이터 전달 방식에서 차이가 있음
- 구조체와 클래스의 사용 목적을 명확히 해야 성능과 안정성 향상
- Boxing/Unboxing은 성능 이슈가 있으므로 자주 사용은 피해야 함
- 실무에서는 깊은 복사/얕은 복사 여부에 따라 버그가 발생할 수 있으므로 주의
5. Q&A
- Q: string은 값 형식인가요 참조 형식인가요? A: 참조 형식이지만 불변(immutable) 특성을 가지므로 값 형식처럼 사용됨
- Q: 구조체에 메서드나 속성을 정의할 수 있나요? A: 가능합니다. 클래스처럼 멤버를 정의할 수 있습니다.
- Q: 참조 형식을 복사할 때 안전하게 복사하려면? A: 깊은 복사(Deep Copy)를 수동 구현하거나, ICloneable 인터페이스를 활용합니다.
감사합니다!
'C# 학습 > C# 언어의 기초' 카테고리의 다른 글
C# 세미나 자료: 수치 형식 (Numeric Types) (0) | 2025.04.07 |
---|---|
C# 세미나 자료: 미리 정의된 형식의 분류 (0) | 2025.04.07 |
C# 세미나 자료: 생성자와 인스턴스화 (0) | 2025.04.07 |
C# 세미나 자료: 형식의 기초 (Basics of Types) (0) | 2025.04.07 |
C# 세미나 자료: 주석 (Comments) (0) | 2025.04.07 |