A. Static (정적) 필드, Static (정적) 메소드
프로그램 전체에 걸쳐 공유해야 하는 변수, 메소드가 있다면 정적 필드, 정적 메소드를 사용하면된다.
class Global
{
public static int Count = 0;
}
class ClassA
{
public ClassA()
{
Global.Count++;
}
}
class ClassB
{
public ClassB()
{
Global.Count++;
}
}
B. 객체 복사하기
1. 얕은 복사 (Shallow Copy)
MyClass source = new MyClass();
source.MyField1 = 10;
source.MyField2 = 20;
MyClass target = source;
target.MyField2 = 30;
Console.WriteLine($"{source.MyField1},{source.MyField2}");// 10 30 출력
Console.WriteLine($"{target.MyField1},{target.MyField2}");// 10 30 출력
위 코드에서 알수있듯, 클래스는 태생이 참조형식이다.
따라서 위 소스에서 source를 복사해서받은 target은 힙의 객체가아닌 스택에있는 참조를 복사해서 받아오고, source와 target이 같은곳을 바라본다.
이렇게 객체를 복사할 때 참조만 살짝 복사하는 것을 얕은 복사라고 한다.
2. 깊은 복사 (Deep Copy)
class MyClass
{
public int MyField1;
public int MyField2;
public MyClass DeepCopy()
{
MyClass newCopy = new MyClass();
newCopy.MyField1 = this.MyField1;
newCopy.MyField2 = this.MyField2;
return newCopy;
}
}
target이 힙에 있는 내용을 source로 부터 복사받아 별도의 힙공간에 객체를 보관하는것을 깊은복사라 한다.
※ ICloneable.Clone() 메소드
.NET 프레임워크의 System 네임스페이스에는 ICloneable이라는 인터페이스가 있으며 "깊은 복사" 기능을 가질 클래스가 .NET 프레임워크의 다른 유틸리티 클래스나 다른 프로그래머가 작성한 코드와 호환되도록 하고 싶다면 ICloneable을 상속하는것이 좋다. ICloneable인터페이스는 Clone() 메소드 하나만 갖고있음.
class MyClass : ICloneable
{
public int MyField1;
public int MyField2;
public MyClass Clone()
{
MyClass newCopy = new MyClass();
newCopy.MyField1 = this.MyField1;
newCopy.MyField2 = this.MyField2;
}
}
'C# 공부 > C# 기본 문법' 카테고리의 다른 글
클래스 - 3 (다형성, 오버라이딩, 메소드 숨기기, 오버라이딩 봉인) (0) | 2020.07.24 |
---|---|
클래스 - 2 (this(), 접근한정자, 상속, base키워드, is/as, 기반/파생 클래스간 형변환) (0) | 2020.07.24 |
메소드(Method) - 2 (오버로딩, 가변길이 매개변수, 명명된 매개변수, 선택적 매개변수, 로컬함수) (0) | 2020.07.23 |
메소드(Method) - 1 (참조에의한 매개변수 전달, 결과를 참조로 반환, 출력전용 매개변수) (0) | 2020.07.23 |
코드의 흐름 제어 (do while, for each, 점프문) (0) | 2020.07.22 |