[C++][OOP] Class 심화 - Shallow copy vs deep copy, inline/static/const/friend

 

클래스 인스턴스 복사와 멤버 함수 추가 기능

클래스 인스턴스 복사 문제

객체 지향 프로그래밍에서 객체 복사는 중요한 개념이다. 기본적으로 제공되는 복사 생성자는 Shallow Copy를 수행한다. Shallow Copy는 객체의 메모리 주소만 복사하기 때문에, 원본 객체와 복사본 객체가 동일한 메모리 공간을 공유하게 된다. 이는 원본 객체를 변경하면 복사본 객체도 변경되는 문제를 야기한다.

Issue on shallow copy

예를 들어, Student 클래스의 객체 s1을 생성하고, s1을 복사하여 s2를 생성한다고 가정하자. s1s2는 동일한 메모리 공간을 공유하기 때문에, 위 코드에서 s1을 삭제하면 s2도 삭제되기 때문에, dangling pointer 문제를 야기할 수 있다.

복사 생성자: Deep Copy

Deep Copy는 객체의 메모리 공간을 새롭게 할당하여 복사하는 방법이다. 이를 통해 원본 객체와 복사본 객체는 서로 다른 메모리 공간을 갖게 되며, 원본 객체를 변경해도 복사본 객체는 영향을 받지 않는다.

깊은 복사를 수행하기 위해 복사 생성자를 명시적으로 정의할 수 있다. 복사 생성자는 객체를 인자로 받아, 해당 객체의 멤버 변수 값을 새로운 메모리 공간에 복사하여 새로운 객체를 생성한다.

C++
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;
}

복사 생성자 실행 시점

복사 생성자는 다음과 같은 경우에 호출된다.

  1. 클래스의 객체가 값으로 반환될 때
  2. 클래스의 객체가 인자로 전달될 때(call by value)
  3. 객체가 동일한 클래스의 다른 객체를 기반으로 생성될 때
  4. 컴파일러가 임시 객체를 생성할 때
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)


hyeon_B

안녕하세요! AI 기술을 이용해 더 나은 세상을 만들어 나가고 싶은 과기원생 Hyeon이라고 합니다. 저는 앞으로 인공지능 시대에는 지식을 '활용'하는 능력이 중요해질 것이라고 생각합니다. 대부분의 일들은 인공지능이 뛰어난 모습을 보이지만, 인공지능은 데이터로 부터 연관관계를 학습하기 때문에 지식들을 새로 통합해서 활용하는 능력이 부족합니다. 인공지능이 뉴턴 전에 만들어졌다면 사과가 떨어지는 이유에 대답하지 못했을 것이고, 아인슈타인 전에 만들어졌다면 중력이 어떻게 생기는지 설명하지 못했을 것입니다. 따라서 앞으로 우리는 '본질'을 탐구하고 그 본질로부터 다른 곳에 적용하며 인공지능을 현명하게 활용해야 할 것입니다. 함께 인공지능 시대를 준비합시다!

댓글 쓰기

다음 이전

POST ADS1

POST ADS 2