싱글톀 νŒ¨ν„΄(Singleton Pattern)
Β·
πŸ“ Computer Science/✏ Design Pattern
싱글톀 νŒ¨ν„΄(Singleton Pattern) μ „μ—­ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  μΈμŠ€ν„΄μŠ€λ₯Ό ν•˜λ‚˜λ§Œ μƒμ„±ν•˜λ„λ‘ ν•˜λ©° μƒμ„±λœ μΈμŠ€ν„΄μŠ€λ₯Ό μ–΄λ””μ„œλ“  μ‚¬μš©ν•  수 μžˆλŠ” νŒ¨ν„΄μ΄λ‹€. μΈμŠ€ν„΄μŠ€λ₯Ό μ—¬λŸ¬ 개 λ§Œλ“€λ©΄ μžμ›μ„ λ‚­λΉ„ν•˜κ±°λ‚˜ 버그λ₯Ό λ°œμƒμ‹œν‚¬ 수 μžˆμœΌλ―€λ‘œ 였직 ν•˜λ‚˜λ§Œ μƒμ„±ν•œλ‹€. κ΅¬ν˜„ ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ§Œ μœ μ§€ν•˜κΈ° μœ„ν•΄ μƒμ„±μžμ— private μ ‘κ·Ό μ œμ–΄μžλ₯Ό μ§€μ •ν•˜κ³  μœ μΌν•œ 단일 객체λ₯Ό λ°˜ν™˜ν•  수 μžˆλ„λ‘ 정적 λ©”μ†Œλ“œλ₯Ό 지원해야 ν•œλ‹€. #include using namespace std; // λ‹€μ΄λ‚˜λ―Ή 싱글톀(Dynamic Singleton) // 게으λ₯Έ μ΄ˆκΈ°ν™”: 싱글톀을 μ‹€μ œλ‘œ ν•„μš”λ‘œ ν• λ•ŒκΉŒμ§€ μ΄ˆκΈ°ν™”λ₯Ό 미룬닀. class DynamicSingleton { private: DynamicSingleton() {} static Dynam..
λ””μžμΈ νŒ¨ν„΄(Design Pattern)
Β·
πŸ“ Computer Science/✏ Design Pattern
λ””μžμΈ νŒ¨ν„΄(Design Pattern) μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό 섀계할 λ•Œ νŠΉμ • λ§₯λ½μ—μ„œ 자주 λ°œμƒν•˜λŠ” 고질적인 λ¬Έμ œλ“€μ΄ 또 λ°œμƒν–ˆμ„ λ•Œ μž¬μ‚¬μš©ν•  ν•  수 μžˆλŠ” ν›Œλ₯­ν•œ 해결책이닀. 각기 λ‹€λ₯Έ μ†Œν”„νŠΈμ›¨μ–΄ λͺ¨λ“ˆμ΄λ‚˜ κΈ°λŠ₯을 κ°€μ§„ λ‹€μ–‘ν•œ μ‘μš© μ†Œν”„νŠΈμ›¨μ–΄ μ‹œμŠ€ν…œλ“€μ„ κ°œλ°œν•  λ•Œλ„ μ„œλ‘œ 간에 κ³΅ν†΅λ˜λŠ” 섀계 λ¬Έμ œκ°€ μ‘΄μž¬ν•˜λ©° 이λ₯Ό μ²˜λ¦¬ν•˜λŠ” ν•΄κ²°μ±… 사이에도 곡톡점이 μžˆλ‹€. μ΄λŸ¬ν•œ μœ μ‚¬μ μ„ νŒ¨ν„΄μ΄λΌ ν•œλ‹€. νŒ¨ν„΄μ€ κ³΅ν†΅μ˜ μ–Έμ–΄λ₯Ό λ§Œλ“€μ–΄μ£Όλ©° νŒ€μ› μ‚¬μ΄μ˜ μ˜μ‚¬μ†Œν†΅μ„ μ›ν™œν•˜κ²Œ ν•΄μ£ΌλŠ” μ•„μ£Ό μ€‘μš”ν•œ 역할을 ν•œλ‹€. GoF λ””μžμΈ νŒ¨ν„΄ 23κ°€μ§€μ˜ λ””μžμΈ νŒ¨ν„΄μ„ μ •λ¦¬ν•˜κ³  각각의 λ””μžμΈ νŒ¨ν„΄μ„ 생성, ꡬ쑰, ν–‰μœ„ 3κ°€μ§€λ‘œ κ΅¬λΆ„ν–ˆλ‹€. 생성 νŒ¨ν„΄: 객체 생성에 κ΄€λ ¨λœ νŒ¨ν„΄μœΌλ‘œ 객체의 생성과 쑰합을 μΊ‘μŠν™”ν•΄ νŠΉμ • 객체가 μƒμ„±λ˜κ±°λ‚˜ λ³€κ²½λ˜μ–΄λ„ ν”„λ‘œκ·Έλž¨ ꡬ쑰에 ..
[C++] 얕은 볡사(Shallow Copy)와 κΉŠμ€ 볡사(Deep Copy)
Β·
πŸ“ Language/✏ C & C++
κΈ°μ‘΄ 객체와 같은 값을 κ°€μ§„ 객체λ₯Ό 볡사할 λ•Œ κ°’ ν˜•μ‹μ΄λƒ μ°Έμ‘° ν˜•μ‹μ΄λƒμ— 따라 볡사가 λ‚˜λˆ„μ–΄μ§„λ‹€. 얕은 볡사(Shallow Copy) ν•œ 객체의 λͺ¨λ“  멀버 λ³€μˆ˜μ˜ 값을 λ‹€λ₯Έ 객체둜 λ³΅μ‚¬ν•˜λŠ”λ° 객체가 포인터 νƒ€μž…μ˜ 멀버λ₯Ό κ°–κ³  μžˆλ‹€λ©΄ μ£Όμ†Œ κ°’λ§Œ λ³΅μ‚¬λœλ‹€. μ΄λ•Œ, 원본 객체λ₯Ό μ œκ±°ν•  경우 μ°Έμ‘°ν•˜κ³  μžˆλŠ” ν¬μΈν„°λŠ” 이미 μ‚­μ œν•œ 데이터λ₯Ό κ°€λ¦¬ν‚€λŠ” λŒ•κΈ€λ§ 포인터가 될 수 μžˆλ‹€. μ°Έμ‘° νƒ€μž… 객체듀은 기본적으둜 λͺ…μ‹œν•˜μ§€ μ•ŠμœΌλ©΄ 얕은 볡사가 μΌμ–΄λ‚œλ‹€. κΉŠμ€ 볡사(Deep Copy) λͺ¨λ“  멀버 λ³€μˆ˜λΏλ§Œ μ•„λ‹ˆλΌ 포인터 λ³€μˆ˜κ°€ κ°€λ¦¬ν‚€λŠ” λͺ¨λ“  객체에 λŒ€ν•΄μ„œλ„ 볡사λ₯Ό μ‹œν–‰ν•˜μ—¬ λ³΅μ‚¬ν•œ 객체와 참쑰된 객체가 λ…λ¦½μ μœΌλ‘œ μœ μ§€λœλ‹€. κ°’ ν˜•μ‹ 객체듀은 기본적으둜 κΉŠμ€ 볡사λ₯Ό ν•œλ‹€. struct Test { char* ptr; }; vo..
[C++] μ˜€λ²„λ‘œλ”©(Overloding)κ³Ό μ˜€λ²„λΌμ΄λ”©(Overriding)
Β·
πŸ“ Language/✏ C & C++
μ˜€λ²„λ‘œλ”©(Overloding) μ˜€λ²„λ‘œλ”©μ΄λž€ ν•¨μˆ˜μ˜ 이름은 κ°™κ³  λ§€κ°œλ³€μˆ˜λ₯Ό λ‹€λ₯΄κ²Œ ν•¨μœΌλ‘œμ¨ 맀개 λ³€μˆ˜μ— 따라 λ‹€λ₯Έ ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜λŠ” 것이닀. int add(int a, int b) { return a + b; } // μ›ν•¨μˆ˜ float add(int a, int b) { return a + b; } // μ˜€λ²„λ‘œλ”© λΆˆκ°€λŠ₯ float add(int a, float b) { return a + b; } // μ˜€λ²„λ‘œλ”© κ°€λŠ₯ μ˜€λ²„λΌμ΄λ”©(Overriding) μ˜€λ²„λΌμ΄λ”©μ΄λž€ λΆ€λͺ¨ ν΄λž˜μŠ€λ‘œλΆ€ν„° 상속받은 ν•¨μˆ˜λ₯Ό μž¬μ •μ˜ν•˜λŠ” 것이닀. μžμ‹ κ°μ²΄μ—μ„œ μ˜€λ²„λΌμ΄λ”©ν•œ ν•¨μˆ˜λŠ” 호좜 μ‹œ λ¨Όμ € ν˜ΈμΆœλœλ‹€. λ™μΌν•œ 리턴 κ°’, 이름, λ§€κ°œλ³€μˆ˜λ₯Ό κ°€μ Έμ•Ό ν•œλ‹€. #include using namespace std; class Drink { publ..
[C++] Call by value와 Call by reference
Β·
πŸ“ Language/✏ C & C++
Call by value 값에 μ˜ν•œ 호좜 ν•¨μˆ˜ 호좜 μ‹œ 인자둜 λ³€μˆ˜μ˜ 볡사 값을 μ „λ‹¬ν•œλ‹€. μ΄λ•Œ λ³΅μ‚¬λœ μΈμžλŠ” ν•¨μˆ˜ μ•ˆμ—μ„œ μ§€μ—­μ μœΌλ‘œ μ‚¬μš©λ˜κΈ° λ•Œλ¬Έμ— local value의 속성을 κ°€μ§„λ‹€. λ”°λΌμ„œ ν•¨μˆ˜ μ•ˆμ—μ„œ 인자 값이 λ³€κ²½λ˜λ”λΌλ„ μ•„κ·œλ¨ΌνŠΈ(argument)λŠ” λ³€κ²½λ˜μ§€ μ•ŠλŠ”λ‹€. λ©”λͺ¨λ¦¬ κ³΅κ°„μ—μ„œλŠ” λ³„λ„μ˜ μž„μ‹œ 곡간에 μƒμ„±λ˜λ―€λ‘œ ν•¨μˆ˜ μ’…λ£Œ μ‹œ 사라진닀. Call by reference 참쑰에 μ˜ν•œ 호좜 ν•¨μˆ˜ 호좜 μ‹œ 인자둜 λ³€μˆ˜μ˜ 레퍼런슀λ₯Ό μ „λ‹¬ν•œλ‹€. λ”°λΌμ„œ ν•¨μˆ˜ μ•ˆμ—μ„œ 인자 값이 λ³€κ²½λ˜λ©΄ μ•„κ·œλ¨ΌνŠΈλ‘œ μ „λ‹¬λœ 객체의 값도 λ³€κ²½λœλ‹€. μ„ μ–Έκ³Ό λ™μ‹œμ— μ΄ˆκΈ°ν™”ν•΄μ•Ό ν•˜κ³  μ΄ˆκΈ°ν™”λœ ν›„μ—λŠ” λ‹€λ₯Έ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μ—†λ‹€. #include using namespace std; void func_by_value(int a, i..
[C++] STL μ»¨ν…Œμ΄λ„ˆ(Containers)
Β·
πŸ“ Language/✏ C & C++
1. μˆœμ„œ(μ‹œν€€μŠ€) μ»¨ν…Œμ΄λ„ˆ 데이터λ₯Ό μ„ ν˜•μœΌλ‘œ μ €μž₯ν•˜λŠ” μ»¨ν…Œμ΄λ„ˆλ‘œ μ—°κ΄€ μ»¨ν…Œμ΄λ„ˆμ— λΉ„ν•΄ 검색 μ„±λŠ₯이 μ’‹μ§€ μ•Šλ‹€. 1) Vector κ°€μž₯ 기본적인 μ»¨ν…Œμ΄λ„ˆμ΄λ‹€. 일반 λ°°μ—΄μ²˜λŸΌ 연속적인 λ©”λͺ¨λ¦¬μ— μ €μž₯되고 ν™•μž₯/μΆ•μ†Œκ°€ κ°€λŠ₯ν•œ 동적 λ°°μ—΄λ‘œ κ΅¬ν˜„λ˜μ–΄ μžˆλ‹€. iterator 뿐만 μ•„λ‹ˆλΌ indexλ‘œλ„ 접근이 κ°€λŠ₯ν•˜μ—¬ κ°œλ³„ μ›μ†Œμ— λŒ€ν•œ μ ‘κ·Ό 속도가 λΉ λ₯΄λ‹€. 2) Deque vector와 λΉ„μŠ·ν•œ μ»¨ν…Œμ΄λ„ˆμ΄μ§€λ§Œ, ν•˜λ‚˜μ˜ λ©”λͺ¨λ¦¬ 블둝이 μ•„λ‹Œ μ—¬λŸ¬ λ©”λͺ¨λ¦¬ 블둝에 λ‚˜λ‰˜μ–΄ μ €μž₯λœλ‹€. Random access iteratorλ₯Ό ν†΅ν•œ index둜 접근이 κ°€λŠ₯ν•˜λ‹€. 3) List 비연속적인 λ©”λͺ¨λ¦¬μ— μ €μž₯λœλ‹€. index둜 접근이 λΆˆκ°€λŠ₯ν•˜λ‹€. 접근을 ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ„ ν˜• 탐색이 ν•„μš”ν•˜λ‹€. 보톡 μ‚½μž…, μ‚­μ œν•˜λŠ” 연산이 λ§Žμ„ λ•Œ μ‚¬μš©ν•œλ‹€...