πŸ“ Language

    [C++] OOP μ†Œλ©Έμžμ˜ virtual ν‚€μ›Œλ“œ

    객체지ν–₯의 νŠΉμ„± 쀑 λ‹€ν˜•μ„±μ˜ κ°œλ…μ„ μ μš©ν•œ 것이닀. λ‹€ν˜•μ„±μ€ 각각의 객체λ₯Ό κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄ ν•¨μˆ˜μ— 쓰기도 ν•˜μ§€λ§Œ μ†Œλ©Έμžμ—λ„ μ‚¬μš©λœλ‹€. 클래슀 λ‚΄ μ†Œλ©Έμžμ—λŠ” μ™œ virtual ν‚€μ›Œλ“œκ°€ λΆ™μ„κΉŒ? λ¨Όμ €, μƒμ†μ—λŠ” 3가지 관계가 μ‘΄μž¬ν•œλ‹€. is-a: 데이터 ν˜•μ€ λΆ€λͺ¨ 클래슀둜 μ„ μ–Έν•˜κ³  생성은 μžμ‹ 클래슀둜 ν• λ‹Ήν•œλ‹€. λΆ€λͺ¨ 클래슀의 λ³€μˆ˜μ™€ ν•¨μˆ˜λ§Œ ν˜ΈμΆœν•  수 μžˆλ‹€. λ§Œμ•½, μžμ‹ ν΄λž˜μŠ€μ— Override ν•œ ν•¨μˆ˜κ°€ μ‘΄μž¬ν•œλ‹€λ©΄ κ·Έ ν•¨μˆ˜λŠ” 호좜 κ°€λŠ₯ν•˜λ‹€. has-a: μ†Œμœ κ΄€κ³„λ‘œμ„œ λ‹€λ₯Έ 객체λ₯Ό ν¬ν•¨ν•˜μ—¬ κ·Έ 객체의 κΈ°λŠ₯(λ³€μˆ˜, ν•¨μˆ˜)을 μ‚¬μš©ν•œλ‹€. 생성 μ‹œ 상속받은 λΆ€λͺ¨ ν΄λž˜μŠ€λΆ€ν„° ν˜ΈμΆœν•˜κ³  μ†Œλ©Έ μ‹œ μžμ‹ ν΄λž˜μŠ€λΆ€ν„° ν˜ΈμΆœλœλ‹€. is implemented of #include using namespace std; class Has..

    [C++] 정적(Static) 멀버 λ³€μˆ˜μ™€ ν•¨μˆ˜

    정적 멀버 λ³€μˆ˜ static μžλ£Œν˜• λ³€μˆ˜ 이름; ν˜•μ‹μœΌλ‘œ 클래슀 λ°–μ—μ„œ μ΄ˆκΈ°ν™”ν•΄μ•Ό ν•œλ‹€. 같은 클래슀 λ‚΄ λͺ¨λ“  객체가 ν•˜λ‚˜μ˜ 정적 멀버 λ³€μˆ˜λ₯Ό 곡용으둜 μ‚¬μš©ν•œλ‹€. 즉 클래슀 λ‚΄μ˜ μ „μ—­ λ³€μˆ˜μ²˜λŸΌ ν–‰λ™ν•œλ‹€. μ–΄λ–€ κ°μ²΄μ—μ„œ λ°”κΎΌ 정적 멀버 λ³€μˆ˜ 값은 μœ μ§€λ˜λ©° 같은 클래슀의 λ‹€λ₯Έ κ°μ²΄μ—κ²Œ 영ν–₯을 λ―ΈμΉœλ‹€. λ©”λͺ¨λ¦¬ 할당을 λ”± ν•œλ²ˆλ§Œ ν•˜κ²Œ λ˜μ–΄ λ©”λͺ¨λ¦¬ μ‚¬μš© νš¨μœ¨μ„ 높일 수 μžˆλ‹€. 정적 멀버 ν•¨μˆ˜ 클래슀의 객체 없이 호좜이 κ°€λŠ₯ν•˜λ©° κ°μ²΄μ—μ„œλŠ” ν˜ΈμΆœν•  수 μ—†λŠ” ν•¨μˆ˜λ₯Ό λ§ν•œλ‹€. private으둜 μ„ μ–Έν•œ 정적 멀버 λ³€μˆ˜λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€. #include using namespace std; class A { private: //정적 멀버 λ³€μˆ˜μ˜ μ΄ˆκΈ°ν™”λŠ” 클래슀 μ™ΈλΆ€μ—μ„œ ν•œλ‹€. static int count; public:..

    [C++] 얕은 볡사(Shallow Copy)와 κΉŠμ€ 볡사(Deep Copy)

    [C++] 얕은 볡사(Shallow Copy)와 κΉŠμ€ 볡사(Deep Copy)

    κΈ°μ‘΄ 객체와 같은 값을 가진 객체λ₯Ό 볡사할 λ•Œ κ°’ ν˜•μ‹μ΄λƒ μ°Έμ‘° ν˜•μ‹μ΄λƒμ— 따라 볡사가 λ‚˜λˆ„μ–΄μ§„λ‹€. 얕은 볡사(Shallow Copy) ν•œ 객체의 λͺ¨λ“  멀버 λ³€μˆ˜μ˜ 값을 λ‹€λ₯Έ 객체둜 λ³΅μ‚¬ν•˜λŠ”λ° 객체가 포인터 νƒ€μž…μ˜ 멀버λ₯Ό κ°–κ³  μžˆλ‹€λ©΄ μ£Όμ†Œ κ°’λ§Œ λ³΅μ‚¬λœλ‹€. μ΄λ•Œ, 원본 객체λ₯Ό μ œκ±°ν•  경우 μ°Έμ‘°ν•˜κ³  μžˆλŠ” ν¬μΈν„°λŠ” 이미 μ‚­μ œν•œ 데이터λ₯Ό κ°€λ¦¬ν‚€λŠ” λŒ•κΈ€λ§ 포인터가 될 수 μžˆλ‹€. μ°Έμ‘° νƒ€μž… 객체듀은 기본적으둜 λͺ…μ‹œν•˜μ§€ μ•ŠμœΌλ©΄ 얕은 볡사가 μΌμ–΄λ‚œλ‹€. κΉŠμ€ 볡사(Deep Copy) λͺ¨λ“  멀버 λ³€μˆ˜λΏλ§Œ μ•„λ‹ˆλΌ 포인터 λ³€μˆ˜κ°€ κ°€λ¦¬ν‚€λŠ” λͺ¨λ“  객체에 λŒ€ν•΄μ„œλ„ 볡사λ₯Ό μ‹œν–‰ν•˜μ—¬ λ³΅μ‚¬ν•œ 객체와 참쑰된 객체가 λ…λ¦½μ μœΌλ‘œ μœ μ§€λœλ‹€. κ°’ ν˜•μ‹ 객체듀은 기본적으둜 κΉŠμ€ 볡사λ₯Ό ν•œλ‹€. struct Test { char* ptr; }; vo..

    [C++] μ˜€λ²„λ‘œλ”©(Overloding)κ³Ό μ˜€λ²„λΌμ΄λ”©(Overriding)

    μ˜€λ²„λ‘œλ”©(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

    Call by value 값에 μ˜ν•œ 호좜 ν•¨μˆ˜ 호좜 μ‹œ 인자둜 λ³€μˆ˜μ˜ 볡사 값을 μ „λ‹¬ν•œλ‹€. μ΄λ•Œ λ³΅μ‚¬λœ μΈμžλŠ” ν•¨μˆ˜ μ•ˆμ—μ„œ μ§€μ—­μ μœΌλ‘œ μ‚¬μš©λ˜κΈ° λ•Œλ¬Έμ— local value의 속성을 가진닀. λ”°λΌμ„œ ν•¨μˆ˜ μ•ˆμ—μ„œ 인자 값이 λ³€κ²½λ˜λ”λΌλ„ μ•„κ·œλ¨ΌνŠΈ(argument)λŠ” λ³€κ²½λ˜μ§€ μ•ŠλŠ”λ‹€. λ©”λͺ¨λ¦¬ κ³΅κ°„μ—μ„œλŠ” λ³„λ„μ˜ μž„μ‹œ 곡간에 μƒμ„±λ˜λ―€λ‘œ ν•¨μˆ˜ μ’…λ£Œ μ‹œ 사라진닀. Call by reference 참쑰에 μ˜ν•œ 호좜 ν•¨μˆ˜ 호좜 μ‹œ 인자둜 λ³€μˆ˜μ˜ 레퍼런슀λ₯Ό μ „λ‹¬ν•œλ‹€. λ”°λΌμ„œ ν•¨μˆ˜ μ•ˆμ—μ„œ 인자 값이 λ³€κ²½λ˜λ©΄ μ•„κ·œλ¨ΌνŠΈλ‘œ μ „λ‹¬λœ 객체의 값도 λ³€κ²½λœλ‹€. μ„ μ–Έκ³Ό λ™μ‹œμ— μ΄ˆκΈ°ν™”ν•΄μ•Ό ν•˜κ³  μ΄ˆκΈ°ν™”λœ ν›„μ—λŠ” λ‹€λ₯Έ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  수 μ—†λ‹€. #include using namespace std; void func_by_value(int a, i..

    [C++] STL μ»¨ν…Œμ΄λ„ˆ(Containers)

    [C++] STL μ»¨ν…Œμ΄λ„ˆ(Containers)

    1. μˆœμ„œ(μ‹œν€€μŠ€) μ»¨ν…Œμ΄λ„ˆ 데이터λ₯Ό μ„ ν˜•μœΌλ‘œ μ €μž₯ν•˜λŠ” μ»¨ν…Œμ΄λ„ˆλ‘œ μ—°κ΄€ μ»¨ν…Œμ΄λ„ˆμ— λΉ„ν•΄ 검색 μ„±λŠ₯이 쒋지 μ•Šλ‹€. 1) Vector κ°€μž₯ 기본적인 μ»¨ν…Œμ΄λ„ˆμ΄λ‹€. 일반 λ°°μ—΄μ²˜λŸΌ 연속적인 λ©”λͺ¨λ¦¬μ— μ €μž₯되고 ν™•μž₯/μΆ•μ†Œκ°€ κ°€λŠ₯ν•œ 동적 λ°°μ—΄λ‘œ κ΅¬ν˜„λ˜μ–΄ μžˆλ‹€. iterator 뿐만 μ•„λ‹ˆλΌ indexλ‘œλ„ 접근이 κ°€λŠ₯ν•˜μ—¬ κ°œλ³„ μ›μ†Œμ— λŒ€ν•œ μ ‘κ·Ό 속도가 λΉ λ₯΄λ‹€. 2) Deque vector와 λΉ„μŠ·ν•œ μ»¨ν…Œμ΄λ„ˆμ΄μ§€λ§Œ, ν•˜λ‚˜μ˜ λ©”λͺ¨λ¦¬ 블둝이 μ•„λ‹Œ μ—¬λŸ¬ λ©”λͺ¨λ¦¬ 블둝에 λ‚˜λ‰˜μ–΄ μ €μž₯λœλ‹€. Random access iteratorλ₯Ό ν†΅ν•œ index둜 접근이 κ°€λŠ₯ν•˜λ‹€. 3) List 비연속적인 λ©”λͺ¨λ¦¬μ— μ €μž₯λœλ‹€. index둜 접근이 λΆˆκ°€λŠ₯ν•˜λ‹€. 접근을 ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ„ ν˜• 탐색이 ν•„μš”ν•˜λ‹€. 보톡 μ‚½μž…, μ‚­μ œν•˜λŠ” 연산이 λ§Žμ„ λ•Œ μ‚¬μš©ν•œλ‹€...