오랜만에 기본기에 대해 생각을 해보게 되었습니다.
값 복사 형식과 참조 형식.. (잊고 있던 포인터..)
코드에 대부분 클래스를 사용하다보니 잊고 있었는데 복습할 겸 글을 남겨봅니다.
가독성을 위해 foreach 를 사용하려고 하는데 구조체에 대해서는 메모리 낭비가 발생 되고,
foreach 내부에서 원본의 값을 수정할 수 없다는 단점이 있더군요..!
추가로 배열 사이즈 변경도 남겨봅니다.
using System;
using System.Collections.Generic;
namespace ConsoleApp2
{
class Program
{
struct ValueType
{
public int a;
public int b;
}
class ReferenceType
{
public int a;
public int b;
}
static void Main(string[] args)
{
ValueType valueType; //new ValueType() 없이 사용 가능.
valueType.a = 1;
valueType.b = 2;
ValueType valueType2 = valueType; //값 복사됨.
valueType2.a = 3;
valueType2.b = 4;
ReferenceType referenceType = new ReferenceType(); //반드시 메모리 할당 필요
referenceType.a = 1;
referenceType.b = 2;
ReferenceType referenceType2 = referenceType; //같은 메모리 바라봄
referenceType2.a = 3;
referenceType2.b = 4;
Console.WriteLine("valueType : {0} {1}", valueType.a, valueType.b);
Console.WriteLine("valueType2 : {0} {1}", valueType2.a, valueType2.b);
Console.WriteLine("referenceType : {0} {1}", referenceType.a, referenceType.b);
Console.WriteLine("referenceType2 : {0} {1}", referenceType2.a, referenceType2.b);
List<ValueType> valueTypeList = new List<ValueType>();
List<ReferenceType> referenceTypeList = new List<ReferenceType>();
//ValueType은 foreach에서 값 변경이 불가능하다, 또한 메모리 낭비가 발생 될 수 있다.
foreach (ValueType sub in valueTypeList)
{
Console.WriteLine("{0} {1}", sub.a, sub.b);
//sub.a = 40; //구조체는 오류 발생. 복사 값이므로 원본을 바꿀 수 없어 컴파일 오류.
}
foreach (ReferenceType sub in referenceTypeList) //foreach 도 참조형태 - 원본 값 바뀜
{
Console.WriteLine("{0} {1}", sub.a, sub.b);
sub.a = 40; //원본 값 변경 됨.
}
ValueType[] valueTypeArray = null;
Array.Resize(ref valueTypeArray, 5); //new ValueType[5]
for (int i = 0; i < valueTypeArray.Length; ++i)
{
Console.WriteLine("배열 개수 : {0}", i + 1);
}
Console.ReadLine();
}
}
}
'C# > Console' 카테고리의 다른 글
[C#] Stopwatch 경과 시간 확인하기 (tick, milliseconds, timespan) (0) | 2025.09.29 |
---|---|
[C#] Xml 읽어오기 (System.Xml) (0) | 2025.05.23 |
[C# Console] Base64 직접 만들어보기 (Convert.ToBase64String, Convert.FromBase64String) (0) | 2025.04.11 |
[C# Console] AES256 사용 (+ 자바) (0) | 2025.04.02 |
[C#] 프로세스 실행 및 대기 (Process.Start , Process.WaitForExit) (0) | 2024.01.30 |