클래스 인스턴스 복사와 멤버 함수 추가 기능
클래스 인스턴스 복사 문제
객체 지향 프로그래밍에서 객체 복사는 중요한 개념이다. 기본적으로 제공되는 복사 생성자는 Shallow Copy를 수행한다. Shallow Copy는 객체의 메모리 주소만 복사하기 때문에, 원본 객체와 복사본 객체가 동일한 메모리 공간을 공유하게 된다. 이는 원본 객체를 변경하면 복사본 객체도 변경되는 문제를 야기한다.
![]() |
Issue on shallow copy |
예를 들어, Student
클래스의 객체 s1
을 생성하고, s1
을 복사하여 s2
를 생성한다고 가정하자. s1
과 s2
는 동일한 메모리 공간을 공유하기 때문에, 위 코드에서 s1
을 삭제하면 s2
도 삭제되기 때문에, dangling pointer 문제를 야기할 수 있다.
복사 생성자: Deep Copy
Deep Copy는 객체의 메모리 공간을 새롭게 할당하여 복사하는 방법이다. 이를 통해 원본 객체와 복사본 객체는 서로 다른 메모리 공간을 갖게 되며, 원본 객체를 변경해도 복사본 객체는 영향을 받지 않는다.
깊은 복사를 수행하기 위해 복사 생성자를 명시적으로 정의할 수 있다. 복사 생성자는 객체를 인자로 받아, 해당 객체의 멤버 변수 값을 새로운 메모리 공간에 복사하여 새로운 객체를 생성한다.
class Student {
private:
int* m_pID;
string m_name;
public:
Student(const Student& rhs); // 복사 생성자
};
Student::Student(const Student& rhs) {
this->m_pID = new int(*rhs.m_pID); // deep copy
this->m_name = rhs.m_name;
}
복사 생성자 실행 시점
복사 생성자는 다음과 같은 경우에 호출된다.
- 클래스의 객체가 값으로 반환될 때
- 클래스의 객체가 인자로 전달될 때(call by value)
- 객체가 동일한 클래스의 다른 객체를 기반으로 생성될 때
- 컴파일러가 임시 객체를 생성할 때
![]() |
call by value -> implemented |
inline 함수
인라인 함수는 컴파일러가 함수 호출 코드를 함수 본문으로 대체하는 함수이다. 함수 호출 오버헤드를 줄여 성능을 향상시키는 데 사용된다. (일반 inline 함수와 동일)
static 멤버
정적 멤버는 클래스의 모든 객체에서 공유되는 멤버 변수 또는 멤버 함수이다. 객체를 생성하지 않고도 클래스 이름을 사용하여 접근할 수 있다.
![]() |
static member in class |
const 멤버
상수 멤버 함수는 객체의 상태를 변경하지 못하는 함수이다. 멤버 변수 값을 수정하거나 비상수 멤버 함수를 호출할 수 없다.
![]() |
const member in class |
friend 함수
friend 함수는 다른 클래스의 private 멤버에 접근할 수 있는 함수이다. 클래스 외부에서 클래스의 private 멤버에 접근해야 하는 경우 유용하게 사용된다.
![]() |
friend function |
ㄴ
마치며
이번 포스팅에서는 클래스 인스턴스 복사, 복사 생성자, 인라인 함수, 정적 멤버, 상수 멤버, 프렌드 함수에 대해 알아보았다. 이러한 개념들은 객체 지향 프로그래밍에서 중요한 역할을 하며, 코드의 효율성과 유지보수성을 향상시키는 데 도움을 준다.
추천글:
[C++][OOP] Function - reusable, readable
(https://hyeondev.blogspot.com/2024/09/coop-function-reusable-readable.html)
[C++][OOP] Class - definition, struct, constructor, destructor
(https://hyeonb.blogspot.com/2024/10/coop-class-definition-struct.html)
[C++][OOP] Class - UML diagram, relationship
(https://hyeondev.blogspot.com/2024/10/coop-class-uml-diagram-relationship.html)