-
24년 6월 11일 TIL공부 기록 2024. 6. 11. 22:51
값형과 참조형에 대해서
값형과 참조형은 코드를 작업 하면서 많이 헷갈리는 부분이고, 면접에서도 자주 나오는 유형이라고 한다.
먼저 값형은 데이터를 직접 저장하는 변수 유형이라고 할 수 있다. 값형 변수는 Stack이라는 곳에 저장이 되며, 변수에 값을 할당 하면 그 값이 직접 복사가 된다. 대표적인 값형에는 Struct가 있다. (int,float,char,bool등이 Strut다)
참조형은 데이터가 저장 된 메모리 주소를 저장 하는 변수 유형이라고 할 수 있다. 참조형 변수는 heap에 저장된 실제 데이터를 가리키는 주소를 스택에 저장한다. 변수에 값을 할당하면 실제 데이터가 아닌 데이터의 주소가 복사된다. 대표적인 참조형에는 클래스, 배열, 문자열, 델리게이트 등이 있다.
여기서 Stack과 Heap에 대해서 알아야 할 것 같다.
Stack이란 LIFO (Last In, First Out) 구조로 작동하는 메모리 영역이라고 한다. 주로 함수 호출 시 지역 변수와 매개 변수를 저장하는 데 사용 된다. 스택 메모리는 자동으로 할당되고 해제되며, 접근 속도가 매우 빠르다.
Heap이란 동적으로 할당되는 메모리 영역으로, 주로 객체와 배열과 같은 참조형 데이터를 저장하는 데 사용된다고 한다. 힙 메모리는 개발자가 명시적으로 관리해야 하며, 스택보다 접근 속도가 느리다. 하지만 크기가 상대적으로 크고, 다양한 크기의 데이터 할당이 가능하다. 여기서 동적 할당이란 클래스는 객체가 생성 되어야 참조가 가능한데 이거와 비슷한 경우?라고 볼 수가 있다. 그러니까 필드에 선언과 동시에 사용을 할 수 있는 것과 선언을 해도 객체를 만들거나 해야 하는 건 참조형이라고 볼 수 있다. Struct는 선언과 동시에 사용이 가능 하다.
이부분이 왜 자꾸 헷갈리는 지에 대한 궁금증이 생길 것이다.
매개변수를 사용 하거나, 접근을 할 경우가 있을 것이다. 이 때 값형들은 자신의 값을 복사해서 넘겨준다. 그러니까 또 다른 데이터를 만들어서 넘겨주게 되는 것인데, 예를 들어 매개변수를 통해서 필드에 선언 되어 있는 코드를 바꾸게 만들고 싶어도 값을 복사해서 넘겨주는 것이기 때문에 필드에 선언 돼있는 변수가 값이 안 바뀌고 복사 된 것이 바뀐다.
이처럼 내가 원하고자 하는 기능을 구현 하기 위해서는 값형과 참조형에 대해서 이해를 하고 있어야 좋다.
그 외에도 알면 좋은 것들이 많을 것이다.
그래서 얕은 복사와 깊은 복사라는 것이 있다.
먼저 깊은 복사는
===
어렵다.
깊은 복사는 완전히 다른 객체를 새로 생성 한다. 데이터를 공유하지 않고 독립적인 객체를 생성 해낸다.
얕은 복사는 객체를 생성 하지만 같은 데이터를 공유 할 수 있게 된다.
복사 할 때 참조형들을 같은 참조를 복사 하게 되면서 객체는 생성이 되지만 생성 된 객체들이 같은 데이터 주소를 참조하게 된다.
이 두가지의 사용경우는 이렇게 나눌 수 있다고 본다.
깊은 복사는 객체들이 완전히 독립적이어야 할 때 사용 해야 할 것이고, 얕은 복사는 객체들이 같은 데이터를 참조 해야 할 경우에 사용하면 된다. 라는 것까지만 하고 오늘은 물러간다. .
오늘로써 나의 몇 번째지.., 3번째 프로젝트가 끝이 났다. 캠프 중간에 힘든 일이 생겨서 많이 힘들었지만 그래도 내가 열심히 하면 다시 따라갈 순 있을 것 같다. 빨리 밀렸던 것들 복구 하고,, 다음 프로젝트도 잘 해야겠다. 힘내자
'공부 기록' 카테고리의 다른 글
24년 6월 13일 TIL (0) 2024.06.13 24년 6월 12 TIL (0) 2024.06.12 24년 6월 10일 TIL (0) 2024.06.10 24년 6월 9일 (0) 2024.06.09 24년 6월 7일 TIL (0) 2024.06.08