20231204_값 타입, 참조 타입, Class

2023. 12. 4. 21:20IT/TIL

오늘의 TIL은 스탠다드반 특강에서 배웠던 내용으로 가장 큰 주제는

값 타입과 참조 타입

이다.

 

 

값 타입과 참조 타입의 가장 큰 차이점은

Stack에 저장하는 데이터의 종류

인데, 이름에서도 알 수 있듯이

 

값 타입은 데이터를 값 형식(Raw Data)으로

참조 타입은 데이터의 참조(Reference)로 저장하는 것이다.

 

즉, Stack으로 데이터를 가지러 가는 경우에 (해당 변수의 데이터를 찾는 경우에)

값 타입은 바로 해당 데이터가 나오지만,

참조 타입은 해당 데이터가 있는 '위치'가 나오고 Heap에 그 위치 정보로 실제 데이터를 찾으러 가야한다.

 

값 타입은 int, float, double, bool, vector2, vector3 등이,

참조 타입은 클래스와 인터페이스 등이 있다.

 

참조 타입이지만 참조 타입이 아닌 string

더보기

C#에서의 String은 참조 타입이지만 다른 참조 타입과는 다른 독특한 특징이 있는데,

'String의 Heap 데이터는 불변' 이라는 특징이다.

String은 Stack에는 reference가 존재하고 그 reference를 통해서 Heap에 있는 데이터를 가져오는 구조인데

만약 String의 데이터가 변경되는 경우,

Heap에 있는 데이터를 변경하는 것이 아니고,

Heap에 새로운 String 데이터를 만든 후에, reference를 새로운 String 데이터에 연결시켜주는 것이다.

 

 

그림으로 보면 위와 같은데,

text = "Hi"; 라고 선언하고 text2 = "Hello"; 라고 선언한 경우,

Stack에는 text와 text2의 ref가 생성되고, Heap에 "Hi"와 "Hello" 데이터가 생성된다.

그 후에 text의 데이터를 "Hello"라고 변경하면,

Heap에 있는 "Hi"가 "Hello"로 변하는 것이 아닌, 새로운 데이터 "Hello"를 만들어서 이를 바라보게한다.

또, text2의 데이터인 "Hello"를 바라보게 하는 것이 아닌 것도 중요하다.

이 때, 기존에 있던 "Hi" 데이터는 가비지 데이터가 되어버린다.

즉, String 사용하는 경우에는 값을 자주 변환하면

가비지 데이터가 많이 생겨서 메모리 누수가 발생하니 주의해야한다.

 

두 번째 주제는 Class로

Class란 객체지향 프로그래밍에서 데이터와 메소드를 정의하는 일종의 틀로

1. 다양한 데이터를 저장하는 복합자료형 (메소드, 필드, 프로퍼티 등을 가질 수 있다)

2. 데이터를 참조형식으로 저장함

이라는 특징을 가지고 있다.

 

Class의 얕은 복사

 

class를 사용하는데 있어서 가장 주의해야되는 부분은 얕은 복사라는 개념인데,

위의 사진에서 class1 obj1 = obj; 라고 정의한 부분에서 문제가 발생하는데,

obj1을 새롭게 class로 정의하지 않고(class1 obj1 = new class1();으로 하지 않고)

obj;으로 하였기 때문에, 값이 아닌 참조 타입인 class obj1은 obj과 같은 데이터를 바라보는 상태가 되는 것이다.

따라서 obj나 obj1의 데이터 중 하나만 수정하더라도 다른 한 쪽에 영향을 미치게 된다.

따라서 이러한 얕은 복사 문제를 해결하기 위해서 class1 obj1을 새롭게 만드려면

class1 obj1 = new class1();
obj1.i = 20;

 

이라고 코드를 수정해야한다.

'IT > TIL' 카테고리의 다른 글

20231206_StringBuilder  (2) 2023.12.06
20231205_유니티 애니메이션  (2) 2023.12.05
20231201_Button UI  (0) 2023.12.01
20231130_팀 프로젝트  (0) 2023.11.30
20231129_유니티 개인과제  (0) 2023.11.29