안녕하세요. 우당탕탕 개발일지입니다. 2학년 1학기 데이터 구조론을 듣게 되었습니다. 수업 중 배운 내용을 복습하는 용도입니다. 우당탕탕 파이팅!
- reference 변수
- call by-
- The Big 5
- shallow copy, Deep copy
1. reference 변수
reference변수 =주소를 참조하는 변수
참조 기호 : &
- 공간을 공유한다. 복사할 필요가 없다.=> 값이 같이 변함
- ⭐reference는 포인터가 아니다.
- 매개변수 넘겨줄때 or 지역 변수로 사용한다.
- &를 쓰려면 오른쪽 값도 l-value 이어야 한다.
//x,y가 같은 공간을 공유한다.= 값이 같이 변한다.
#include <iostream>
using namespace std;
int main()
{
int x=3;
int &y=x;
//l-value reference
cout<<y<<endl;//3
y=10;
cout<<x<<endl;//10
}
2. call by
2-1. call by reference
- 함수가 원본 인수의 값을 변경해야 할 때 사용됩니다.
→ &기호 사용
2-2. call by value
- 전달되는 매개변수의 값을 복사합니다.
- 호출된 함수는 매개변수를 수정할 수 있지만, 원본 변수를 변경할 수 없습니다.
→ 단점) 용량을 많이 차지함
2-3. call by constant reference
- 매개변수가 큰 객체일 때 or 함수에 의해 변경되어서는 안 되는 경우, 용량은 큰데 변경할 필요가 없을 때 사용하면 좋다.
- call by value를 사용하면 공간 낭비 크게 발생하는 경우에 사용한다.
- ⚠️const를 붙이는 순간 rvalue도 들어올 수 있다. const이기 때문에 값을 바꾸는 경우가 없기 때문이다.
2-4 call by rvalue referenece
=an expression can be implemented by a move instead of a copy,
- &&사용하면 r-value값을 참조할 수 있다.
- copy대신 move 사용.
- 어딘가 있는 r-value에 참조한 이름을 붙인 것이다.
int &x=3;
// 이건 안됨.
//&가 하나만 있으면 l-value
//3은 r-value 임.
int &x=y
//가능
int &&y=4;
//&& 하면은 r-value
//call by rvalue reference
//y를 위해서 메모리 공간을 만들지 않고 어딘가 있는 4에 y라는 이름을 붙여준 것이다. ⭐⭐⭐⭐
2-5. call by address
- 메모리 주소를 사용하여 함수에 인수를 전달하는 것
- 포인터 사용 (*)
3. The Big Five
=> 호출하지 않아도 자동으로 생성됨
⭐⭐⭐예제를 잘봐주세요! 예제로 이해하자!
vector<int>v1=v2
//copy Constructor
v1=v2;
//copy Assignment
v1=vector<int>{1,3,5}에서는
//move Constructor
v1={3,5,7}은
//move Assignment
3-1. Destructor (소멸자)
● delete
:객체가 소멸될 때 호출되는 함수로, 동적으로 할당된 메모리나 자원을 해제하는 역할.
→함수에서 정의되면은 함수가 끝날 때 사라진다.(stack)
→(heap)에 만들어지면은 지울 때 delete를 해줘야 한다. ⇒ ex) new로 만들 때
intcell*p= new intcell(n);
delete p;
3-2. Copy Constructor(복사 생성자)→ l-value
:● Deep Copy
:다른 객체로부터 현재 객체를 복사할 때 호출되는 함수
3-3.Move Constructor(이동 생성자)→ r-value(&&)
:다른 객체로부터 현재 객체를 이동할 때 호출되는 함수
3-4.Copy Assignment operator= (복사 할당 연산자)→ l-value
:다른 객체의 내용을 현재 객체에 복사할 때 호출되는 함수
3-5. Move Assignment operator= (이동 할당 연산자)→ r-value(&&)
:다른 객체의 자원을 현재 객체로 이동할 때 호출되는 함수
m4=m //copy Assignment
/*인 경우는 생성자는 필요 없는데 =이라는 걸 operator 함수를 정의해 주어야 한다.
"m4 = m"은 "m4.operator=(m)"와 동일한 동작을 수행하기 때문이다.*/
IntCell&Intcell:: operator=(const Intcell &rhs) {
if (this != &rhs) { // 자기 자신에게 대입되는 경우 방지
value = rhs.value;
}
return *this;
}
/*return *this;: 대입 연산자 함수의 반환 값으로 현재 객체의 참조를 반환합니다.
이를 통해 연쇄적인 대입(a = b = c)이 가능해집니다.*/
x=y=z //copy assignment
/*x=y=z는 y.opertator=(z)가 호출된다.
"y=z"가 먼저 실행되고, 그 후에 "x=y"가 실행됩니다.*/
m4=move(m)//move assignment
/*m4=move(m)해주면
l-value-> r-value가 된다. move()의 특징. */
4. shallow copy, deep copy 차이
◆ shallow copy는 포인터의 값만 복사되어 두 객체가 같은 메모리를 가리키는 방식입니다. 이는 두 객체가 같은 데이터를 공유하게 됩니다.(복사생성자_reference와 유사)
◆ deep copy는 객체의 모든 내용이 복제되어 새로운 객체가 생성되는 방식입니다. 새로운 객체는 원본 객체와 완전히 독립적인 메모리를 가지게 됩니다.(call by value와 유사)
728x90
'[전공 CS] > 자료구조' 카테고리의 다른 글
[자료구조] C++ 기초(1)_const,explict,#ifndef, #endif (0) | 2024.05.16 |
---|