CSED232 – Programming Assignment # 4 (Solution)

$ 30.00
Category:

Description

– Template & STL –
주의 사항
● 클래슀 μ„ μ–Έ 및 μ •μ˜λ₯Ό main.cpp νŒŒμΌμ— μž‘μ„±ν•˜λŠ” 것을 κΈˆμ§€ν•©λ‹ˆλ‹€. κ·Έ 외에 μ„ μ–Έ 및 μ •μ˜μ˜ μœ„μΉ˜μ— λŒ€ν•œ μ œμ•½μ€ μ—†μŠ΅λ‹ˆλ‹€.
● STL 및 shared_ptr 을 μ œμ™Έν•œ λͺ¨λ“  C++ 문법이 μ‚¬μš© κ°€λŠ₯ν•©λ‹ˆλ‹€.
● λ¬Έμ œμ—μ„œ μ œκ³΅ν•œ ν˜•μ‹μ„ μ€€μˆ˜ν•˜κ³  각 λ¬Έμ œλ³„ 좔가적인 μ„ΈλΆ€ 쑰건을 λ§Œμ‘±ν•˜μ—¬μ•Ό ν•©λ‹ˆλ‹€.
● λ¬Έμ œμ— λͺ…μ‹œλ˜μ–΄ μžˆμ§€ μ•Šλ”λΌλ„ μ†Œλ©Έμž(Destructor)와 같은 λ©”λͺ¨λ¦¬ λˆ„μˆ˜ λ°©μ§€λ₯Ό μœ„ν•΄ ν•„μš”ν•œ λ©€λ²„ν•¨μˆ˜λŠ” ν•„μˆ˜μ μœΌλ‘œ κ΅¬ν˜„λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.
● 문제 쑰건이 λ³΅μž‘ν•©λ‹ˆλ‹€. λͺ¨λ“  문제의 μ„ΈλΆ€ 쑰건을 꼼꼼히 읽어 λ³΄μ‹œκΈ° λ°”λžλ‹ˆλ‹€.

감점
● 제좜 κΈ°ν•œμ—μ„œ ν•˜λ£¨(24 μ‹œκ°„) λŠ¦μ„ λ•Œλ§ˆλ‹€ 20%μ”© 감점
β—‹ 1 일(20%) , 2 일(40%), … 5 일(100%)
● 컴파일이 μ •μƒμ μœΌλ‘œ 이루어지지 μ•Šμ„ 경우 0 점

μ œμΆœλ°©μ‹

곡톡 채점 κΈ°μ€€

1. ν”„λ‘œκ·Έλž¨ κΈ°λŠ₯
● ν”„λ‘œκ·Έλž¨μ΄ μš”κ΅¬ 사항을 λͺ¨λ‘ λ§Œμ‘±ν•˜λ©΄μ„œ μ˜¬λ°”λ‘œ μ‹€ν–‰λ˜λŠ”κ°€?

2. ν”„λ‘œκ·Έλž¨ 섀계 및 κ΅¬ν˜„
● μš”κ΅¬ 사항을 λ§Œμ‘±ν•˜κΈ° μœ„ν•œ λ³€μˆ˜ 및 μ•Œκ³ λ¦¬μ¦˜ 섀계가 잘 λ˜μ—ˆλŠ”κ°€?
● λ¬Έμ œμ—μ„œ μ œμ‹œλœ μ„ΈλΆ€ 쑰건을 λͺ¨λ‘ λ§Œμ‘±ν•˜μ˜€λŠ”κ°€?
● μ„€κ³„λœ λ‚΄μš©μ΄ μš”κ΅¬λœ μ–Έμ–΄λ₯Ό μ΄μš©ν•˜μ—¬ 적절히 κ΅¬ν˜„λ˜μ—ˆλŠ”κ°€?

3. ν”„λ‘œκ·Έλž¨ 가독성
● ν”„λ‘œκ·Έλž¨μ΄ 읽기 쉽고 μ΄ν•΄ν•˜κΈ° μ‰½κ²Œ μž‘μ„±λ˜μ—ˆλŠ”κ°€?
● λ³€μˆ˜ λͺ…이 무엇을 μ˜λ―Έν•˜λŠ”μ§€ μ΄ν•΄ν•˜κΈ° μ‰¬μš΄κ°€?
● ν”„λ‘œκ·Έλž¨μ˜ μ†ŒμŠ€ μ½”λ“œλ₯Ό μ΄ν•΄ν•˜κΈ° 쉽도둝 주석을 잘 λΆ™μ˜€λŠ”κ°€?

4. λ³΄κ³ μ„œ ꡬ성 및 λ‚΄μš©, 양식
● λ³΄κ³ μ„œλŠ” μ μ ˆν•œ λ‚΄μš©μœΌλ‘œ μ΄ν•΄ν•˜κΈ° 쉽고 보기 μ’‹κ²Œ 잘 μž‘μ„±λ˜μ—ˆλŠ”κ°€?
● λ³΄κ³ μ„œμ˜ 양식을 잘 λ”°λžλŠ”κ°€?

λ‹€λ₯Έ μ‚¬λžŒμ˜ μ½”λ“œλ‚˜ 인터넷에 μžˆλŠ” ν”„λ‘œκ·Έλž¨μ„ 볡사(copy)ν•˜κ±°λ‚˜ κ°„λ‹¨νžˆ μˆ˜μ •ν•΄μ„œ μ œμΆœν•˜λ©΄ 무쑰건 β€˜F’ 학점이 λΆ€μ—¬λ©λ‹ˆλ‹€. μ΄λŸ¬ν•œ λΆ€μ •ν–‰μœ„κ°€ 발견되면 ν•™κ³Όμ—μ„œ μ •ν•œ 기쀀에 따라 좔가적인 뢈이읡이 μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

Shared Pointer & Image Library
Objective
λ³Έ κ³Όμ œμ—μ„œλŠ” Standard Template Library μ—μ„œ μ œκ³΅ν•˜λŠ” κΈ°λŠ₯ 쀑 ν•˜λ‚˜μΈ shared_ptr 을 직접 κ΅¬ν˜„ν•΄ 보고 이λ₯Ό μ΄μš©ν•œ μ˜μƒ 처리 클래슀λ₯Ό κ΅¬ν˜„ν•˜μ—¬ λ΄„μœΌλ‘œμ¨ template κ³Ό STL 에 λŒ€ν•œ 이해λ₯Ό 높인닀.

문제 1 – SharedPtr
1.1. κ°œμš”
λ³Έ 과제의 1 번 λ¬Έμ œλŠ” shared_ptr 의 κ°„μ†Œν™”λœ 버전인 SharedPtr ν…œν”Œλ¦Ώ 클래슀λ₯Ό κ΅¬ν˜„ν•΄ λ³Έλ‹€. 슀마트 포인터(smart pointer)λŠ” λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ‘œλΆ€ν„° ν”„λ‘œκ·Έλž¨μ„ λ³΄ν˜Έν•˜κΈ° μœ„ν•΄ C++의 Standard Template Library (STL)μ—μ„œ μ œκ³΅ν•˜λŠ” κΈ°λŠ₯이닀. 슀마트 ν¬μΈν„°λŠ” ν¬μΈν„°μ²˜λŸΌ λ™μž‘ν•˜λŠ” 클래슀 ν…œν”Œλ¦ΏμœΌλ‘œ μ‚¬μš©μ΄ λλ‚œ λ©”λͺ¨λ¦¬λ₯Ό μžλ™μœΌλ‘œ λ™μ ν•΄μ œν•΄ μ£ΌλŠ” 것이 νŠΉμ§•μ΄λ‹€. 일반적인 포인터λ₯Ό μ‚¬μš©ν•  λ•Œμ—λŠ” new μ—°μ‚°μžλ₯Ό 톡해 μ‹€μ œ λ©”λͺ¨λ¦¬λ₯Ό 가리킀도둝 μ„ μ–Έν•˜λ©° μ‚¬μš©μ΄ λλ‚œ 포인터에 λŒ€ν•΄μ„œλŠ” delete μ—°μ‚°μžλ₯Ό 톡해 λ©”λͺ¨λ¦¬λ₯Ό μˆ˜λ™μœΌλ‘œ ν•΄μ œν•΄μ•Ό ν•œλ‹€. μ΄λŸ¬ν•œ 방식은 λ©”λͺ¨λ¦¬ κ΄€λ¦¬μ˜ 어렀움을 μœ λ°œν•˜λ©° λ©”λͺ¨λ¦¬ λˆ„μˆ˜ ν˜„μƒμ΄λ‚˜ λ©”λͺ¨λ¦¬ 문제둜 μΈν•œ λŸ°νƒ€μž„ μ—λŸ¬λ₯Ό λΉˆλ²ˆν•˜κ²Œ λ°œμƒμ‹œν‚€κ²Œ λœλ‹€. 슀마트 ν¬μΈν„°λŠ” κ°œλ°œμžκ°€ 일일이 delete λ₯Ό ν•  ν•„μš” 없이 λ©”λͺ¨λ¦¬μ˜ μ‚¬μš©μ΄ λλ‚˜λ©΄ μžλ™μœΌλ‘œ ν•΄μ œν•˜λŠ” λ°©μ‹μœΌλ‘œ μ΄λŸ¬ν•œ 어렀움을 ν•΄κ²°ν•΄ μ€€λ‹€.
C++의 STL 은 μ—¬λŸ¬ μ’…λ₯˜μ˜ 슀마트 포인터λ₯Ό μ œκ³΅ν•˜λŠ”λ° κ·Έ 쀑 ν•˜λ‚˜κ°€ shared_ptr 이닀. shared_ptr 은 memory ν—€λ”νŒŒμΌμ„ include ν•˜λ©΄ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€. shared_ptr 은 동적 ν• λ‹Ήλœ λ©”λͺ¨λ¦¬ μ˜μ—­μ΄ ν˜„μž¬ 더 이상 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” μ˜μ—­μΈμ§€λ₯Ό νŒŒμ•…ν•˜κΈ° μœ„ν•΄ μ°Έμ‘° 카운트 (reference count) 방식을 μ‚¬μš©ν•œλ‹€. μ°Έμ‘° 카운트λ₯Ό μ΄μš©ν•œ 슀마트 포인터 λ™μž‘ 방법에 λŒ€ν•΄μ„œλŠ” κ°•μ˜ 자료 β€œ16. The string Class and the Standard Template Library (1)”과 λ³Έ λ¬Έμ„œμ˜ 뢀둝을 μ°Έκ³ ν•˜κΈ° λ°”λž€λ‹€.

1.2. 과제 μš”κ΅¬μ‚¬ν•­ λ³Έ κ³Όμ œμ—μ„œ κ΅¬ν˜„ν•΄μ•Ό ν•˜λŠ” SharedPtr 의 κΈ°λŠ₯은 λ‹€μŒκ³Ό κ°™λ‹€.
⚫ SharedPtr 생성
β—Ό SharedPtr 은 template class 둜 적어도 ν•˜λ‚˜ μ΄μƒμ˜ template parameter λ₯Ό λ°›λŠ”λ‹€. λ§Œμ•½
MyClass λΌλŠ” 클래슀의 객체λ₯Ό κ°€λ¦¬ν‚€λŠ” 포인터λ₯Ό 생성할 경우 λ‹€μŒκ³Ό 같은 μ½”λ“œλ₯Ό μ΄μš©ν•˜μ—¬ SharedPtr 객체λ₯Ό 생성할 수 μžˆμ–΄μ•Ό ν•œλ‹€.
β—† SharedPtr<MyClass> ptr;
β—Ό λ˜ν•œ μ•„λž˜μ˜ 예제 μ½”λ“œμ™€ 같이 SharedPtr 객체λ₯Ό 생성할 λ•Œ 동적 ν• λ‹Ήλœ λ©”λͺ¨λ¦¬ μ˜μ—­μ„ μ΄μš©ν•˜μ—¬ SharedPtr 객체λ₯Ό μ΄ˆκΈ°ν™”μ‹œν‚¬ 수 μžˆλ‹€.
β—† SharedPtr<MyClass> ptr(new MyClass());
β—Ό SharedPtr 객체λ₯Ό 같은 νƒ€μž…μ˜ 객체λ₯Ό κ°€λ¦¬ν‚€λŠ” λ‹€λ₯Έ SharedPtr 객체λ₯Ό μ΄μš©ν•˜μ—¬ μ΄ˆκΈ°ν™”μ‹œν‚¬ 수 μžˆλ‹€.
β—† SharedPtr<MyClass> ptr(new MyClass());
SharedPtr<MyClass> ptr2(ptr);
⚫ SharedPtr λŒ€μž… μ—°μ‚°
β—Ό SharedPtr 객체λ₯Ό λ‹€λ₯Έ SharedPtr 객체에 λŒ€μž…ν•  수 μžˆλ‹€. 이 경우 두 SharedPtr κ°μ²΄λŠ” κ³΅ν†΅λœ λ™μ ν• λ‹Ήλœ λ©”λͺ¨λ¦¬λ₯Ό κ°€λ¦¬ν‚€κ²Œ λœλ‹€.
β—† SharedPtr<MyClass> ptr(new MyClass()); SharedPtr<MyClass> ptr2; ptr2 = ptr;
β—Ό SharedPtr 객체에 μƒˆλ‘œμš΄ λ™μ ν• λ‹Ήλœ λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό λ°”λ‘œ λŒ€μž…ν•  μˆ˜λŠ” μ—†λ‹€. λ§Œμ•½ 이미 λ§Œλ“€μ–΄μ§„ SharedPtr 객체에 μƒˆλ‘­κ²Œ λ™μ ν• λ‹Ήλœ λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό λŒ€μž…ν•˜κΈ° μœ„ν•΄μ„œλŠ” SharedPtr 의 μƒμ„±μžλ₯Ό μ΄μš©ν•΄ 객체λ₯Ό μƒˆλ‘œ λ§Œλ“€κ³  λŒ€μž…ν•΄μ•Ό ν•œλ‹€.
β—† SharedPtr<MyClass> ptr; ptr = new MyClass(); // must raise a compile error!!
ptr = SharedPtr<MyClass>(ptr); // μ΄λ ‡κ²Œ ν•΄μ•Ό 함.
⚫ SharedPtr 객체의 이용
β—Ό SharedPtr κ°μ²΄λŠ” μžμ‹ μ΄ κ°€λ¦¬ν‚€λŠ” 객체λ₯Ό μ΄μš©ν•  수 있게 ν•˜κΈ° μœ„ν•΄ λ‹€μŒκ³Ό 같은 두 κ°€μ§€ μ—°μ‚°μžλ₯Ό 지원해야 ν•œλ‹€ (*, ->). 두 μ—°μ‚°μž λͺ¨λ‘ const 버전과 non-const 버전을 지원해야 ν•œλ‹€.
β—† SharedPtr<MyClass> ptr(new MyClass); ptr->some_method(); (*ptr).some_method();
const SharedPtr<MyClass> const_ptr(new MyClass); const_ptr->some_const_method();
(*const_ptr).some_const_method();
β—Ό SharedPtr κ°μ²΄λŠ” ν•„μš”μ‹œ 일반 ν¬μΈν„°λ‘œ λ³€ν™˜λ  수 μžˆμ–΄μ•Ό ν•œλ‹€.
β—† SharedPtr<MyClass> ptr(new MyClass); MyClass* ptr2 = (MyClass*)ptr; const MyClass* ptr3 = (const MyClass*)ptr;
⚫ μžλ™ 동적 ν•΄μ œ
β—Ό SharedPtr 객체둜 더 이상 μ°Έμ‘°λ˜μ§€ μ•ŠλŠ” λ©”λͺ¨λ¦¬ μ˜μ—­μ€ μžλ™μœΌλ‘œ 동적 ν•΄μ œλœλ‹€. μ•„λž˜λŠ” 이 λ™μž‘μ— λŒ€ν•œ μ˜ˆμ΄λ‹€.
β—† SharedPtr<MyClass> ptr(new MyClass(1)); // 첫번째 객체 동적할당 SharedPtr<MyClass> ptr2(ptr);
ptr = SharedPtr<MyClass>(new MyClass(2)); // λ‘λ²ˆμ§Έ 객체 동적할당. 첫번째
κ°μ²΄λŠ” ptr2 μ—μ„œ 가리킀고 μžˆμœΌλ―€λ‘œ 계속 μœ μ§€λ¨
ptr2 = SharedPtr<MyClass>(new MyClass(3)); // μ„Έλ²ˆμ§Έ 객체 동적할당. 첫번째 κ°μ²΄λŠ” 더 이상 아무 SharedPtr 객체가 가리킀지 μ•ŠμœΌλ―€λ‘œ μžλ™μœΌλ‘œ λ™μ ν•΄μ œ.
⚫ λ™μ ν• λ‹Ήλœ λ°°μ—΄μ˜ 지원
β—Ό λ³Έ κ³Όμ œμ—μ„œ μž‘μ„±ν•˜λŠ” SharedPtr κ°μ²΄λŠ” λ°°μ—΄μ˜ 동적할당도 μ§€μ›ν•œλ‹€. λ°°μ—΄μ˜ 경우 동적할당을 μœ„ν•΄ new 와 delete λŒ€μ‹  new[]와 delete[] μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. 이λ₯Ό μœ„ν•΄ SharedPtr ν…œν”Œλ¦Ώμ€ λ‘λ²ˆμ§Έ template parameter 둜 deallocation 을 μœ„ν•œ ν•¨μˆ˜λ₯Ό μž…λ ₯λ°›μ•„μ„œ 일반 객체와 λ°°μ—΄μ˜ λ©”λͺ¨λ¦¬ ν•΄μ œλ₯Ό λ‹€λ₯΄κ²Œ μ²˜λ¦¬ν•˜λŠ” 것을 μ§€μ›ν•œλ‹€. 이에 λŒ€ν•œ κ΅¬ν˜„μ€ λ³Έ κ³Όμ œμ— 같이 제곡된 skeleton code λ₯Ό μ°Έκ³ ν•˜κΈ° λ°”λž€λ‹€.
β—† template<typename T> void ArrayDeallocator(T* ptr) { delete[] ptr; } SharedArray<int,ArrayDeallocator> ptr(new int[N]); // λ‘λ²ˆμ§Έ template
parameter 둜 Array λ₯Ό ν•΄μ œν•˜κΈ° μœ„ν•œ ν•¨μˆ˜λ₯Ό νŒŒλΌλ―Έν„°λ‘œ μ§€μ •ν•  수 μžˆλ‹€. λ‘λ²ˆμ§Έ template parameter κ°€ μ§€μ •λ˜μ§€ μ•ŠλŠ” κ²½μš°μ—λŠ” 일반 객체λ₯Ό ν•΄μ œν•˜κΈ° μœ„ν•œ ν•¨μˆ˜κ°€ default parameter 둜 μ§€μ •λœλ‹€.
β—Ό 같이 제곡된 skeleton code μ—μ„œλŠ” 배열을 μœ„ν•΄ λ‹€μŒκ³Ό 같이 μ •μ˜λœ SharedArray λΌλŠ” νƒ€μž…μ„ μ œκ³΅ν•œλ‹€.
β—† Template<typename T>
using SharedArray = SharedPtr<T,ArrayDeallocator<T> >;
β—Ό λ³Έ κ³Όμ œμ—μ„œ μž‘μ„±ν•΄μ•Ό ν•˜λŠ” 뢀뢄은 λ™μ ν• λ‹Ήλœ λ°°μ—΄μ˜ 지원을 μœ„ν•œ λ°°μ—΄ μ›μ†Œ μ ‘κ·Ό μ—°μ‚°μžμ΄λ‹€. ([ ])
β—† SharedArray<MyClass> ptr(new MyClass[10]); ptr[0].some_method();
const SharedArray<MyClass> ptr(new MyClass[10]); ptr[2].some_const_method();

⚫ 기타 μš”κ΅¬ 사항
β—Ό SharedPtr ν…œν”Œλ¦Ώ 클래슀λ₯Ό 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ΄λ‚˜ μ œλ„€λ¦­ ν”„λ‘œκ·Έλž˜λ° 관점 λ˜λŠ” λ‹€λ₯Έ μΈ‘λ©΄μ—μ„œ κ°œμ„ ν•  수 μžˆλ‹€λ©΄ μ–΄λ–€ μ‹μœΌλ‘œ κ°œμ„ ν•  수 μžˆμ„μ§€ λ³΄κ³ μ„œμ— κΈ°μˆ ν•  것.
β—Ό μ²¨λΆ€λœ μ½”λ“œ 쀑 SharedPtr_test.cpp 은 SharedPtr 클래슀 ν…œν”Œλ¦Ώμ΄ μ œλŒ€λ‘œ κ΅¬ν˜„λ˜μ—ˆλŠ”μ§€ 학생이 슀슀둜 확인할 수 μžˆλŠ” κ°„λ‹¨ν•œ μ½”λ“œλ“€μ΄ μž‘μ„±λ˜μ–΄ μžˆλ‹€. κ·ΈλŸ¬λ‚˜ λ³Έ μ½”λ“œλŠ” 참고용으둜 제곡된 것일 뿐 본인의 ν΄λž˜μŠ€κ°€ μ—¬λŸ¬κ°€μ§€ 상황을 κ³ λ €ν•˜μ—¬ 잘 κ΅¬ν˜„λ˜μ—ˆλŠ”μ§€ μ—¬λΆ€λŠ” 직접 확인해 λ³Ό 것을 μΆ”μ²œν•œλ‹€. μ‘°κ΅λŠ” ν•΄λ‹Ή sharedPtr_test.cpp κ°€ μ•„λ‹Œ 더 λ³΅μž‘ν•œ 상황을 ν…ŒμŠ€νŠΈν•΄ λ³Ό 것이닀. 참고둜 SharedPtr 클래슀 ν…œν”Œλ¦Ώμ΄ μ œλŒ€λ‘œ κ΅¬ν˜„λ˜μ—ˆλ‹€λ©΄ SharedPtr_test.cpp 컴파일 ν›„ κ²°κ³ΌλŠ” λ‹€μŒκ³Ό κ°™μ•„μ•Ό ν•œλ‹€.
test_SharedPtr()
MyClass object(100) created: 1
MyClass object(200) created: 2
============= ptr1: 200 ptr2: 100 ptr3: 100 =============
Dealloc Object
MyClass object(100) destroyed: 1
============= ptr1: 200 ptr2: 200 ptr3: 200 =============
MyClass object(300) created: 2
============= const_ptr: 300 const_ptr: 300 ============= pp: 200 Dealloc Object
MyClass object(300) destroyed: 1
Dealloc Object
MyClass object(200) destroyed: 0
test_SharedArray() ============= arr1[0]: 1 arr2[0]: 1 arr3[0]: 1 ============= ============= arr1[0]: 2 arr2[0]: 3 arr3[0]: 3 =============
Dealloc Array ============= arr1[0]: 2 arr2[0]: 2 arr3[0]: 2 =============
Dealloc Array

문제 2 – Image
2.1. κ°œμš”
λ³Έ 과제의 2 번 λ¬Έμ œλŠ” 이미지 처리λ₯Ό μœ„ν•œ 기초적인 ν…œν”Œλ¦Ώ 클래슀 μž‘μ„±μ΄λ‹€. μ΄λ―Έμ§€λŠ” μ»΄ν“¨ν„°μ—μ„œ 일반적으둜 ν”½μ…€λ“€μ˜ 2 차원 λ°°μ—΄λ‘œ ν‘œν˜„λ˜λ©°, 각각의 ν”½μ…€μ—λŠ” 밝기 μ •λ³΄λ‚˜ 색상에 λŒ€ν•œ 정보가 μ €μž₯λœλ‹€. 컬러 μ΄λ―Έμ§€μ˜ κ²½μš°μ—λŠ” 각 픽셀에 Red, Green, Blue 의 μ„Έκ°€μ§€ 색상에 λŒ€ν•œ 정보가 μ €μž₯되며 κ·Έλ ˆμ΄μŠ€μΌ€μΌ (grayscale) μ΄λ―Έμ§€μ˜ κ²½μš°μ—λŠ” 각 픽셀에 밝기 정보가 μ €μž₯λœλ‹€. 일반적으둜 색상 μ •λ³΄λ‚˜ 밝기 μ •λ³΄λŠ” 0 λΆ€ν„° 255 μ‚¬μ΄μ˜ 값을 κ°–λŠ” 8 bit unsigned integer νƒ€μž…μ„ μ΄μš©ν•˜μ—¬ μ €μž₯λœλ‹€. λ”°λΌμ„œ κ·Έλ ˆμ΄μŠ€μΌ€μΌ μ΄λ―Έμ§€λŠ” ν”½μ…€λ§ˆλ‹€ 8 λΉ„νŠΈλ₯Ό μ‚¬μš©ν•˜λ©° 컬러 μ΄λ―Έμ§€λŠ” ν”½μ…€μ˜ 각 μƒ‰μƒλ§ˆλ‹€ 8 λΉ„νŠΈλ₯Ό μ‚¬μš©ν•˜μ—¬ 총 24 λΉ„νŠΈλ₯Ό μ‚¬μš©ν•œλ‹€. μ΄λ―Έμ§€μ˜ ν”½μ…€λ§ˆλ‹€ 수치 연산을 μ μš©ν•˜λŠ” κ²½μš°μ—λŠ” 8 λΉ„νŠΈ μ •μˆ˜ν˜• νƒ€μž…μ€ 각쒅 수치 연산에 μ ν•©ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— float μ΄λ‚˜ double κ³Ό 같은 λΆ€λ™μ†Œμˆ˜μ  μ‹€μˆ˜ν˜• νƒ€μž…μ„ μ΄μš©ν•˜κΈ°λ„ ν•œλ‹€.
λ³Έ κ³Όμ œμ—μ„œλŠ” μ΄λŸ¬ν•œ 이미지λ₯Ό 닀루기 μœ„ν•œ ν…œν”Œλ¦Ώ 클래슀λ₯Ό μž‘μ„±ν•œλ‹€. 이λ₯Ό 톡해 이미지 파일 포맷 쀑 ν•˜λ‚˜μΈ BMP νŒŒμΌλ‘œλΆ€ν„° 이미지λ₯Ό μ½μ–΄μ„œ κ°„λ‹¨ν•œ μ˜μƒ 처리λ₯Ό 거친 ν›„ λ‚˜μ˜¨ κ²°κ³Όλ₯Ό BMP 파일둜 μ €μž₯ν•  수 μžˆλŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•΄ λ³Έλ‹€. λ˜ν•œ BMP 파일둜 읽은 그림을 문자둜 λ³€ν™˜ν•˜μ—¬ 좜λ ₯ν•˜λŠ” μ½”λ“œλ„ μž‘μ„±ν•œλ‹€.

2.2. 과제 μš”κ΅¬μ‚¬ν•­ λ³Έ κ³Όμ œμ—μ„œ κ΅¬ν˜„ν•΄μ•Ό ν•˜λŠ” Image 클래슀의 κΈ°λŠ₯은 λ‹€μŒκ³Ό κ°™λ‹€.
⚫ Image 생성
β—Ό Image 클래슀 ν…œν”Œλ¦Ώμ€ λ‹€μ–‘ν•œ ν”½μ…€ νƒ€μž…μ„ μ§€μ›ν•œλ‹€. 이λ₯Ό μœ„ν•΄ ν”½μ…€ νƒ€μž…μ„ ν…œν”Œλ¦Ώ νŒŒλΌλ―Έν„°λ‘œ λ°›λŠ”λ‹€. 예제 μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™λ‹€.
β—† Image<uint8_t> img; // ν”½μ…€κ°’μœΌλ‘œ 8 λΉ„νŠΈ unsigned integer νƒ€μž…μ„ μ‚¬μš©ν•˜λŠ” κ·Έλ ˆμ΄μŠ€μΌ€μΌ 이미지 객체 생성. uint8_t λŠ” 8 λΉ„νŠΈ unsigned integer νƒ€μž…μœΌλ‘œ cstdint 에 μ„ μ–Έλ˜μ–΄ 있음.
Image<float> imgf; // ν”½μ…€κ°’μœΌλ‘œ float νƒ€μž…μ„ μ‚¬μš©ν•˜λŠ” κ·Έλ ˆμ΄μŠ€μΌ€μΌ 이미지 객체 생성
Image<RGB<uint8_t>> rgbimg; // ν”½μ…€κ°’μœΌλ‘œ 8 λΉ„νŠΈ μ •μˆ˜ν˜•μ„ μ‚¬μš©ν•˜λŠ” RGB image 생성. RGB<> 클래슀 ν…œν”Œλ¦Ώμ€ 제곡된 skeleton code μ°Έκ³ 
⚫ Image 클래슀 ν…œν”Œλ¦Ώμ—μ„œ μ œκ³΅ν•˜λŠ” public interface
β—Ό μƒμ„±μž
β—† Image() // default constructor
β—† Image(size_t _width, size_t _height); // 이미지 객체 생성 μ‹œ μ΄λ―Έμ§€μ˜ 크기만큼 λ©”λͺ¨λ¦¬ ν• λ‹Ή (_width x _height)
β—† Image(size_t _width, size_t _height, const PixelType& val); // 이미지 객체 생성 μ‹œ μ΄λ―Έμ§€μ˜ 크기만큼 λ©”λͺ¨λ¦¬ ν• λ‹Ήν•˜κ³  val 값을 μ΄μš©ν•΄ λͺ¨λ“  ν”½μ…€κ°’ μ΄ˆκΈ°ν™”
β—† Image(const Image<PixelType>& img); // copy constructor
β—Ό μ†Œλ©Έμž
β—† ~Image(); // νŠΉλ³„νžˆ 아무 일도 ν•˜μ§€ μ•ŠμŒ.
β—Ό μ—°μ‚°μž
β—† λŒ€μž… μ—°μ‚°μž (operator=)– 같은 ν”½μ…€ νƒ€μž…μ„ μ‚¬μš©ν•˜λŠ” 이미지 κ°μ²΄λ‘œλΆ€ν„° λŒ€μž…λ°›λŠ” μ—°μ‚°μž. λ‹€μŒκ³Ό 같은 λ™μž‘μ„ μˆ˜ν–‰ν•  수 μžˆμ–΄μ•Ό 함.
⚫ const Image<float> a; Image<float> b; a = b;
β—† λ°°μ—΄ μ•‘μ„ΈμŠ€ μ—°μ‚°μž
⚫ μ΄λŠ” λ”°λ‘œ κ΅¬ν˜„ν•  ν•„μš” μ—†μŒ. skeleton μ½”λ“œμ— 이미 κ΅¬ν˜„λ˜μ–΄ μžˆμœΌλ‹ˆ μ°Έκ³ λ°”λžŒ
β—Ό 기타 멀버 ν•¨μˆ˜
β—† size_t width() const; // μ΄λ―Έμ§€μ˜ κ°€λ‘œ 길이 리턴
β—† size_t height() const; // μ΄λ―Έμ§€μ˜ μ„Έλ‘œ 길이 리턴
⚫ 기타 μš”κ΅¬ 사항
β—Ό Image 클래슀의 ν”½μ…€ 값을 μ €μž₯ν•˜κΈ° μœ„ν•œ 곡간은 동적 할당을 μ΄μš©ν•΄ κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€. 이 λ•Œ 문제 1 μ—μ„œ κ΅¬ν˜„ν•œ SharedArray λ₯Ό μ΄μš©ν•˜μ—¬ κ΅¬ν˜„ν•  것.
β—Ό Image ν…œν”Œλ¦Ώ 클래슀λ₯Ό 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ΄λ‚˜ μ œλ„€λ¦­ ν”„λ‘œκ·Έλž˜λ° 관점 λ˜λŠ” λ‹€λ₯Έ μΈ‘λ©΄μ—μ„œ κ°œμ„ ν•  수 μžˆλ‹€λ©΄ μ–΄λ–€ μ‹μœΌλ‘œ κ°œμ„ ν•  수 μžˆμ„μ§€ λ³΄κ³ μ„œμ— κΈ°μˆ ν•  것.
β—Ό λ³Έ κ³Όμ œμ— 같이 제곡된 image_test.cpp λŠ” Image 클래슀 ν…œν”Œλ¦Ώμ„ μ΄μš©ν•œ κ°„λ‹¨ν•œ μ˜μƒ 처리 예제 μ½”λ“œλ‘œ Image 클래슀 ν…œν”Œλ¦Ώμ΄ 잘 κ΅¬ν˜„λ˜μ—ˆλ‹€λ©΄ λ‹€μŒκ³Ό 같은 λ‚΄μš©μ„ 좜λ ₯ν•˜κ²Œ λœλ‹€. 이 외에도 본인이 κ΅¬ν˜„ν•˜κ³  싢은 λ‹€λ₯Έ μ˜μƒ 처리 μ˜ˆμ œλ‚˜ μΆ”κ°€ κΈ°λŠ₯이 μžˆλ‹€λ©΄ κ΅¬ν˜„ν•˜κ³  이λ₯Ό λ³΄κ³ μ„œμ— κΈ°μˆ ν•  것. Image 클래슀 μ—­μ‹œ μ‘°κ΅λŠ” image_test.cpp 에 μ œμ‹œλœ μ½”λ“œ 외에도 더 λ³΅μž‘ν•œ 상황을 ν…ŒμŠ€νŠΈν•΄ λ³Ό 것이닀.

Dealloc Array
Dealloc Array
Dealloc Array
Dealloc Array
Dealloc Array
2. ASCII conversion
2.1. Grayscale conversion
Dealloc Array
2.2. Downsampling
Dealloc Array
Dealloc Array
Dealloc Array
2.3. ASCII art drawing
OOOOOOOOOOOOOOOOOOOOOOOOOpEo3Cii}t5SVOOOOOOOOOOOOO
OOOOOOOOOOOOOOOOOOOOOOOde())JJJJJJJ7(uSpOOOOOOOOOO
OOOOOOOOOOOOOOOOOOOOOOx7)))))JJJJJJJ777iZhOOOOOOOO
OOOOOOOOOOOOOOOOOOOOptv)))))))JJJJJJJ77777Ij6pOd]p
OOOOOOOOOOOOOOOOOOOp3vvv)))))))JJJJJJJ77J7777(((CO
OOOOOOOOOOOOOOOOOOOevvv)v))))))))JJJJJJJ7777777(ZO
OOOOOOOOOOOOOOOOOOkvvvvvv)))))))))JJJJJJJJ77777|9O
OOOOOOOOOOOOOOOOOOfTvvvvvv)v)))))))JJJJJJJJ7777yOO
OwOOOOOOOOOOOOOOO6TTTvvvvvvv))))))))JJJJJJJJ77YOOO
OFfwOOOOOOOOOOOOp5TTTvvvvvvv))v)))))))JJJJJJIqVdOO
OZ(7[4OOOOOOOOOOVLTTTTvvvvvvT+v))))))))Jfnj6dyidOO
OVI77F2OOOOOOOOOOT=zTTTTvvT!^Lv)))))))}Z[3}FJJfOOO
Op3JJJ)19OOOOOOOOSk1vTTTTzCjpy)vv)))))7))JJJJJEOOO
Olv7JJ))J5pOOOOOOSz^5TTTT3E/vV[)v)))))))))JJJeOOOO
Ov)JJ))vvTFSOOOOOu“[)JTTo/.`xjvvvvv)))))))|yOOOOO
Oy()))vvTTTL19OOd97vtfff7}I`=htvvvvv))))Jt2pOOOOOO
OOpP))vvTLLLsv5pqFo3fffffTuShovvvvvvv))eSaZ3dOOOOO
OOOOe(vTTLLsLLL|ZLvifFF7FJTTTTTTvvvvvv}|)))ZOOOOOO
OOOOpSSFLLssLLLLsLLL|+`.FTTTTTTTTvvvvvvv))fpOOOOOO
OOOOOOOpYJLLLLLLLLsLTFJi7LTTTTTTTvvvvvvvvf4OOOOOOO
OOOOOOOOOVZ)LLLLLLLsLLTLLLTTTTTTTTTTvvvvnpOOOOOOOO
OOOOOOOOOOOVx|LLLLLLLLLLLLLLTTTTTTTTvv}wOOOOOOOOOO
OOOOOOOOOOOOOOwl)sLLJLs))LLLTTTTTTT(uwOOOOOOOOOOOO
OOOOOOOOOOOOOOOOpFsl{exfCfLLLLLsJo9OOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOOOI)CC{LtJ3LLLLLLLsiqOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOOO[LeCLFLl3LLLLLsLLLL5OOOOOOOOOOOOO
OOOOOOOOOOOOOOOOOYsYTJ5L}1LsLLL7sLsLL[OOOOOOOOOOOO
OOOOOOOOOOOOOOOOOETIlLs7f3LLLLLPIsLTTvYOOOOOOOOOOO
OOOOOOOOOOOOOOOOO9TITlIfs1LLsss9p3LTvvJkOOOOOOOOOO
OOOOOOOOOOOOOOOOOOv{I3f337LLLLLdOpIvv)JuOOOOOOOOOO
OOOOOOOOOOOOOOOOOO{ssLsLLLssLLs4OOV{)J(EOOOOOOOOOO
OOOOOOOOOOOOOOOOOOuLsLsLLLLLLLsVOOO6(C3EOOOOOOOOOO
OOOOOOOOOOOOOOOOOOjLLLLLLLLLLLspOOOO]o5OOOOOOOOOOO
OOOOOOOOOOOOOOOOOOPsLLLLLLLLLLLpOOOOO4OOOOOOOOOOOO
OOOOOOOOOOOOOOOOOOOl)iultt|ss)JiypOOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOOOOOk|fOOOO4}LJ(J7fVOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOOOOOOC|VOOOOpnv((3pOOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOOOOOO5|qOOOOOOSC(apOOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOOOOVh2(e22]]2ESx|oOOOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOOOE5ZlI[55555555CF5OOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOOOphqE]ayjjjya2Sk9OOOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOOOOOOOOOOpppOOOOOOOOOOOOOOOOOOOOOOO
Dealloc Array
Dealloc Array
Dealloc Array
Dealloc Array Dealloc Array

뢀둝 – μ°Έμ‘° μΉ΄μš΄νŒ… (Reference counting)
STL 의 shared_ptr 은 μ°Έμ‘° μΉ΄μš΄νŒ…μ„ μ΄μš©ν•˜μ—¬ 동적 ν• λ‹Ήλœ 객체λ₯Ό κ΄€λ¦¬ν•œλ‹€. λ™μž‘ μ›λ¦¬λŠ” λ‹€μŒκ³Ό κ°™λ‹€. μ•„λž˜μ™€ 같은 μ½”λ“œκ°€ μžˆλ‹€κ³  ν•˜μž.
1: {
2: string* tmp = new string(“Some String”);
3: shared_ptr<string> ptr1(tmp);
4: {
5: shared_ptr<string> ptr2;
6: ptr2 = ptr1;
7: }
8: }

μœ„μ˜ μ½”λ“œμ—μ„œ 2 번 λΌμΈκΉŒμ§€ μ‹€ν–‰λ˜μ—ˆλ‹€κ³  ν•˜μž. 이 λ•Œ tmp κ°€ 가리킀고 μžˆλŠ” string κ°μ²΄λŠ” heap μ˜μ—­μ— 동적 ν• λ‹Ήλœλ‹€. μ΄λ•Œ heap μ˜μ—­μ„ λ‹€μŒκ³Ό 같이 λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€.

3 번 라인이 μ‹€ν–‰λ˜λ©΄μ„œ shared_ptr 의 객체인 ptr1 이 μƒμ„±λ˜κ³  ptr1 은 tmp κ°€ κ°€λ¦¬ν‚€λ˜ string 객체λ₯Ό κ°€λ¦¬ν‚€κ²Œ λœλ‹€. 이 λ•Œ λ§ˆμ°¬κ°€μ§€λ‘œ heap μ˜μ—­μ— 이 object λ₯Ό λͺ‡ 개의 shared_ptr 객체가 가리킀고 μžˆλŠ”μ§€λ₯Ό μΉ΄μš΄νŒ…ν•˜λŠ” λ³€μˆ˜ (counter)λ₯Ό μƒμ„±ν•œλ‹€. 그리고 ν˜„μž¬ ptr1 이 object λ₯Ό 가리킀고 μžˆμœΌλ―€λ‘œ μΉ΄μš΄νŒ… λ³€μˆ˜λ₯Ό 1 둜 μ΄ˆκΈ°ν™”ν•œλ‹€. 이 μƒνƒœλ₯Ό λ„μ‹ν™”ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

5 번 라인이 μ‹€ν–‰λ˜λ©΄μ„œ shared_ptr 객체인 ptr2 κ°€ μƒμ„±λœλ‹€. 그리고 6 번 라인이 μ‹€ν–‰λ˜λ©΄μ„œ ptr2 에 ptr1 의 값을 λŒ€μž…ν•œλ‹€. 이 λŒ€μž…μ—°μ‚°μ—μ„œ ptr2 λŠ” ptr1 이 가리킀고 있던 object λ₯Ό 같이 κ°€λ¦¬ν‚€λ©΄μ„œ λ™μ‹œμ— counter 도 κ°€λ¦¬ν‚€κ²Œ λœλ‹€. λ˜ν•œ 이 λ•Œ counter 의 값을 1 μ¦κ°€μ‹œν‚¨λ‹€.

7 번 라인이 μ‹€ν–‰λ˜λ©΄μ„œ μ•ˆμͺ½ 블둝을 λ²—μ–΄λ‚˜κ²Œ 되고 블둝 λ‚΄μ˜ local variable 인 ptr2 객체가 μ†Œλ©Έλœλ‹€. ptr2 객체가 μ†Œλ©Έλ˜λ©΄μ„œ counter λ₯Ό 1 κ°μ†Œμ‹œν‚¨λ‹€.

λ§ˆμ§€λ§‰μœΌλ‘œ 8 번 라인이 μ‹€ν–‰λ˜λ©΄μ„œ λ°”κΉ₯μͺ½ 블둝을 λ²—μ–΄λ‚˜κ²Œ 되고 블둝 λ‚΄μ˜ local variable 인 ptr1 객체가 μ†Œλ©Έλœλ‹€. ptr1 객체가 μ†Œλ©Έλ˜λ©΄μ„œ λ‹€μ‹œ counter λ₯Ό 1 κ°μ†Œμ‹œν‚¨λ‹€. 그리고 κ°μ†Œλœ counter κ°€ 0 이 λ˜μ—ˆλ‹€λ©΄ ptr1 객체의 μ†Œλ©ΈμžλŠ” counter 와 object λ₯Ό λͺ¨λ‘ 동적 ν•΄μ œν•œλ‹€.

Reviews

There are no reviews yet.

Be the first to review “CSED232 – Programming Assignment # 4 (Solution)”

Your email address will not be published. Required fields are marked *