목차
프로토타입 패턴이란?
복사 연산 이용하기
직렬화
팩토리 패턴과의 결합
정리하며
참고자료
프로토타입 패턴이란?
복사 연산 이용하기
직렬화
팩토리 패턴과의 결합
정리하며
참고자료
1. 프로토타입 패턴이란?
객체를 생성할 때 종종 다른 객체의 값을 복사하여 사용할 때가 있다. 특히, 객체의 멤버 중 공통된 부분이 있다면 이것을 일일이 초기화 하기 보다는 어떤 객체를 잘 설정해놓고 복사하는 편이 효율적이다. 프로토타입 패턴(prototype pattern)은 그 이름에서 유추할 수 있듯 어떤 객체에 대한 프로토타입을 만들어 놓고 그것을 복사하는 패턴이다. C++로 프로토타입을 구현하는 방법에는 2가지가 있다. 하나는 복사 연산을 이용하는 것이고, 다른 하나는 직렬화를 사용하는 것이다.
2. 복사 연산 이용하기
복사 연산을 이용한 프로토타입 패턴 구현은 아래와 같이 될 것이다.
복사 연산을 이용한 구현
공통된 멤버를 초기화 한 프로토타입 객체를 만들고, 그 객체를 복사해 새로운 객체를 만든 다음 공통되지 않는 멤버를 수정하는 것이다.
하지만 이 방법은 단점이 있는데 복사 연산을 구현해본 분들은 아시겠지만, 올바르게 복사 연산을 구현하는 것이 여간 까다롭다. 작성하는 데 손이 많이 갈 뿐더러 객체의 얕은 복사가 일어나지 않도록 주의해야 한다. 다시 말해 멤버 중 포인터, 레퍼런스, 스마트 포인터 등이 있다면 적절히 코드를 작성해줘야 한다. 또, 수정이 필요한 데이터를 수정하지 않는 오류를 범할 수도 있다.
복잡도를 낮추려면 복사 대입 연산자나 복사 생성자 중 하나만 제공하거나, ICloneable 인터페이스를 둘 수 있다.
ICloneable
3. 직렬화
직렬화(serialization)는 데이터를 파일에 저장하거나, 다른 프로세스에 전달하기 위해 데이터를 바이트 스트림(byte stream)으로 변환하는 프로세스를 말한다. 특히 데이터 복원이 쉬워 네트워크로 전송할 때 많이 사용된다. 이러한 특징으로 어떤 객체에 직렬화 기능을 제공하면 객체 복사를 쉽게 할 수 있다. 바이트 스트림을 데이터로 복원하는 작업은 역직렬화(deserialization)라고 한다.
하지만 아쉽게도 C#, Java 등과 다르게 C++은 언어 차원에서 직렬화를 지원하지 않는다. 필요하다면 Boost.Serialization 라이브러리를 사용할 수 있다.
4. 팩토리 패턴과의 결합
여러 개의 프로토타입이 필요하다면 팩토리 패턴과 같이 활용할 수 있다. 팩토리 패턴과 결합하면 미완성된 객체 복사본의 존재를 원천적으로 막을 수 있다.
팩토리 패턴과 결합한 프로토타입 패턴
5. 정리하며
프로토타입 패턴을 사용하면 공통된 멤버에 관한 값을 쉽게 전달할 수 있다. 객체의 깊은 복사를 하기 때문에 원본 객체에 대한 걱정은 하지 않아도 된다. C++에서는 복사 연산을 올바르게 수행하거나 직렬화를 이용하여 구현할 수 있다.
6. 참고자료
'Outdated > Column' 카테고리의 다른 글
[Design Pattern] 브릿지 패턴(bridge pattern) (0) | 2020.04.11 |
---|---|
[Design Pattern] 팩토리 패턴(factory pattern) (0) | 2020.03.24 |
[OOP] 객체 간 관계, 클래스 간 관계 (0) | 2020.02.27 |
[OOP] 객체지향 설계 원칙 - SOLID (0) | 2020.02.27 |
[Computer Column] 위상정렬(topological sort) (0) | 2019.06.21 |