2023. 12. 4. 21:20ㆍIT/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 데이터에 연결시켜주는 것이다.
![](https://blog.kakaocdn.net/dn/W51ER/btsBkkoP00f/CYNLZFFmAvepQWdqbjhbtK/img.png)
그림으로 보면 위와 같은데,
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 |