* 데이터와 관련 기능을 캡슐화할 수 있는 참조 형식 (구조체는 값형식임)
* 객체지향 프로그래밍에 객체를 만들기 위한 설계도
* 클래스는 객체를 만들기 위한 설계도이며, 만들어진 객체는 인스턴스라 함
* 참조 : 원본을 가리키고 있음 == 원본의 주소를 가지고 있음 (값은 주소에 있는 값자체를 갖고있음)
/****************************************************************
* 값형식, 참조형식
*
* 값형식 (Value type) :
* 스택영역에 저장, 정적으로 메모리에 할당
* 복사할 때 실제값이 복사됨, 블록이 끝날때 소멸
* 구조체는 값형식
*
* 참조형식 (Reference type) :
* 힙영역에 저장, 동적으로 메모리에 할당
* 복사할 때 원본주소가 복사됨, 사용하지 않을때 가비지 컬렉터에 의해 소멸
* 클래스는 참조형식
****************************************************************/
<값형식과 참조형식의 차이>
// 값형식 : 데이터가 중요한 경우 사용, 값이 복사됨
// 참조형식 : 원본이 중요한 경우 사용, 원본 주소가 복사됨
<값에 의한 호출, 참조에 의한 호출>
// 값에 의한 호출 (Call by value) :
// 값형식의 데이터가 전달되며 데이터가 복사되어 전달됨
// 함수의 매개변수로 전달하는 경우 복사한 값이 전달되며 원본은 유지됨
static void Swap(ValueType left, ValueType right)
{
int temp = left.value;
left.value = right.value;
right.value = temp;
}
// 참조에 의한 호출 (Call by reference) :
// 참조형식의 데이터가 전달되며 주소가 복사되어 전달됨
// 함수의 매개변수로 전달하는 경우 주소가 전달되며 주소를 통해 접근하기 떄문에 원본을 전달하는 효과
static void Swap(RefType left, RefType right)
{
int temp = left.value;
left.value = right.value;
right.value = temp;
}
static void Main4()
{
ValueType leftValue = new ValueType() { value = 10 };
ValueType rightValue = new ValueType() { value = 20 };
Swap(leftValue, rightValue); // 데이터의 복사본이 함수로 들어가기 때문에 원본이 바뀌지 않음
RefType leftRef = new RefType() { value = 10 };
RefType rightRef = new RefType() { value = 20 };
Swap(leftRef, rightRef); // 원본의 주소가 함수로 들어가기 때문에 원본이 바뀜
}
<박싱, 언박싱>
// 박싱 : 값형식을 참조형식으로 변환
// 언박싱 : 참조형식을 값형식으로 변환
// 값형식의 경우 원본을 전달하는 방법으로 박싱을 진행하며 object 자료형을 사용
static void Main5()
{
int i = 10;
object o = i; // 박싱
int j = (int)o; // 언박싱
}
<복사생성자와 얕은복사, 깊은복사>
// 복사생성자 : 복사할 인스턴스 매개변수를 가지는 생성자
// 얕은복사 (Shallow copy) : 객체를 복사할 때 주소값만을 복사하여 같은 참조를 가리키게 함
// 깊은복사 (Deep copy) : 객체를 복사할 때 주소값의 원본을 복사하여 다른 참조를 가리키게 함 (같은값을 갖는 다른객체만들때 쓰임)
class Monster
{
public RefType shallow;
public RefType deep;
public Monster(Monster other)
{
// 얕은복사
this.shallow = other.shallow;
// 깊은 복사
this.deep = new RefType();
this.deep.value = other.deep.value;
}
}
'개발관련공부자료' 카테고리의 다른 글
객체지향 프로그래밍 (0) | 2023.09.22 |
---|---|
메모리 구조 (0) | 2023.09.22 |
함수(Function) (0) | 2023.09.22 |
연산자 (0) | 2023.09.22 |
자료형(Data Type) (0) | 2023.09.22 |