IT’s Portfolio

[Lecture] Cpp - Mid Summary λ³Έλ¬Έ

Development Study/C

[Lecture] Cpp - Mid Summary

f1r3_r41n 2023. 4. 14. 23:19
728x90
λ°˜μ‘ν˜•

πŸ’» 2023λ…„ Cpp 쀑간고사 λŒ€λΉ„ μš”μ  정리

πŸ‘€ [01] Cpp μ‹œμž‘

cpp의 객체 지ν–₯ νŠΉμ„±

  • cppλŠ” 객체 지ν–₯ μ–Έμ–΄
  • μΊ‘μŠν™”(Encapsulation) : 데이터λ₯Ό 캑슐둜 μ‹Έμ„œ μ™ΈλΆ€μ˜ μ ‘κ·ΌμœΌλ‘œλΆ€ν„° 데이터λ₯Ό λ³΄ν˜Έν•˜λŠ” 객체 지ν–₯ νŠΉμ„±
  • 클래슀(Class) : cppμ—μ„œ 캑슐의 역할을 함
    • 객체λ₯Ό μ •μ˜ν•˜λŠ” ν‹€
  • 객체(Object) : 클래슀λ₯Ό μ‚¬μš©ν•΄μ„œ λ§Œλ“€μ–΄μ§„ 싀체(instance)
  • 상속성(Inheritance) : 객체λ₯Ό μ •μ˜ν•˜λŠ” 클래슀 사이에 상속 관계λ₯Ό 두어, μžμ‹ 클래슀의 객체가 생성될 λ•Œ μžμ‹ ν΄λž˜μŠ€μ— μ„ μ–Έλœ 멀버뿐 μ•„λ‹ˆλΌ λΆ€λͺ¨ ν΄λž˜μŠ€μ— μ„ μ–Έλœ 멀버듀도 ν•¨κ»˜ 가지고 생성됨
  • λ‹€ν˜•μ„±(Polymorphism) : ν•˜λ‚˜μ˜ κΈ°λŠ₯이 κ²½μš°μ— 따라 μ„œλ‘œ λ‹€λ₯΄κ²Œ λ³΄μ΄κ±°λ‚˜ λ‹€λ₯΄κ²Œ μž‘λ™ν•˜λŠ” ν˜„μƒ
    • + μ—°μ‚°μžλŠ” μ •μˆ˜ λ§μ…ˆμ΄λ‚˜ λ¬Έμžμ—΄ μ—°κ²°, 객체 λ”ν•˜κΈ° λ“± ν”Όμ—°μ‚°μžμ— 따라 μ„œλ‘œ λ‹€λ₯Έ 연산이 이루어짐 => μ—°μ‚°μž 쀑볡(operator overloading)
    • 같은 μ΄λ¦„μ˜ ν•¨μˆ˜κ°€ 맀개 λ³€μˆ˜μ˜ κ°œμˆ˜λ‚˜ νƒ€μž…μ΄ λ‹€λ₯΄λ©΄ μ„œλ‘œ λ‹€λ₯Έ ν•¨μˆ˜λ‘œ 인식됨 => ν•¨μˆ˜ 쀑볡(function overloading)
    • λ‹€ν˜•μ„±μ€ 상속 κ΄€κ³„μ—μ„œλ„ λ‚˜νƒ€λ‚¨
      • λΆ€λͺ¨ ν΄λž˜μŠ€μ— κ΅¬ν˜„λœ ν•¨μˆ˜λ₯Ό λ™μΌν•œ μ΄λ¦„μœΌλ‘œ μžμ‹ ν΄λž˜μŠ€μ—μ„œ λ‹€λ₯΄κ²Œ κ΅¬ν˜„ => ν•¨μˆ˜ μž¬μ •μ˜ λ˜λŠ” ν•¨μˆ˜ μ˜€λ²„λΌμ΄λ”©(function overriding)

πŸ‘€ [02] Cpp ν”„λ‘œκ·Έλž˜λ°μ˜ κΈ°λ³Έ

#include

  • μ „μ²˜λ¦¬κΈ°(cpp Preprocessor) 에 λŒ€ν•œ μ§€μ‹œλ¬Έ
    • μ†ŒμŠ€ 파일 컴파일 μ „ 헀더 νŒŒμΌμ„ 읽어 μ†ŒμŠ€ 파일 λ‚΄λ‘œ μ‚½μž…ν•  것을 μ§€μ‹œν•¨
  • 헀더 νŒŒμΌμ—λŠ” cpp ν‘œμ€€ μž…μΆœλ ₯을 μœ„ν•œ ν΄λž˜μŠ€μ™€ 객체가 μ„ μ–Έλ˜μ–΄ 있음

ν™”λ©΄ 좜λ ₯

  • cout 객체
    • 슀크린 μž₯μΉ˜μ™€ μ—°κ²°λœ cpp ν‘œμ€€ 좜λ ₯ 슀트림 객체(standard output stream object)
  • << μ—°μ‚°μž
    • 슀트림 μ‚½μž… μ—°μ‚°μž(stream insertion operator)
    • 였λ₯Έμͺ½ ν”Όμ—°μ‚°μž 데이터λ₯Ό μ™Όμͺ½ 슀트림 객체에 μ‚½μž…
    • 본래 << μ—°μ‚°μžλŠ” μ •μˆ˜λ₯Ό μ™Όμͺ½μœΌλ‘œ μ‹œν”„νŠΈ(shift) ν•˜λŠ” cpp의 κΈ°λ³Έ μ—°μ‚°μžμž„
      • 헀더 νŒŒμΌμ—μ„œ μž¬μ •μ˜λ˜μ–΄ μ‚¬μš©λ˜κ³  있음

namespace

  • ν”„λ‘œμ νŠΈλ₯Ό μ—¬λŸ¬ λͺ…이 λ‚˜λˆ„μ–΄ κ°œλ°œν•˜λŠ” 경우 ν˜Ήμ€ λ‹€λ₯Έ μ‚¬λžŒμ΄ μž‘μ„±ν•œ μ†ŒμŠ€ μ½”λ“œλ‚˜ λͺ©μ  νŒŒμΌμ„ κ°€μ Έμ™€μ„œ μ‚¬μš©ν•˜λŠ” 경우 이름(identifier) 이 μΆ©λŒν•˜λŠ” κ²½μš°κ°€ 생김
  • λ³€μˆ˜, ν•¨μˆ˜, 클래슀 λ“±μ˜ 이름이 μΆ©λŒν•˜λŠ” 것을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ κ³ μœ ν•œ 이름 곡간 namespace ν‚€μ›Œλ“œ λ„μž…
  • 이름 곡간 생성 방법 : namespace ν‚€μ›Œλ“œ 뒀에 μ€‘κ΄„ν˜Έλ‘œ μ˜μ—­ 지정
  • :: : cpp의 ν‘œμ€€ μ—°μ‚°μžμΈ λ²”μœ„ 지정 μ—°μ‚°μž

std::

  • std : cpp ν‘œμ€€μ—μ„œ μ •ν•œ ν‘œμ€€ 이름 곡간
    • λͺ¨λ“  cpp ν‘œμ€€ λΌμ΄λΈŒλŸ¬λ¦¬λŠ” std 이름 곡간에 μ •μ˜λ˜μ–΄ 있음
    • std 내에 μ •μ˜λ˜μ–΄ μžˆλŠ” ν•¨μˆ˜λ“€μ„ μ‚¬μš©ν•˜λ €λ©΄ std:: 접두어λ₯Ό λΆ™μ—¬μ„œ 곡간을 λͺ…μ‹œν•΄μ£Όμ–΄μ•Ό 함

std::의 μƒλž΅κ³Ό using μ§€μ‹œμ–΄

  • using : 이름 곡간 접두어λ₯Ό μƒλž΅ν•  수 μžˆλŠ” μ§€μ‹œμ–΄
    • using std::cout : std 내에 μ •μ˜λ˜μ–΄ μžˆλŠ” cout ν•¨μˆ˜μ— λŒ€ν•΄μ„œλ§Œ 접두어λ₯Ό μƒλž΅ν•  수 있음
    • using namespace std : std 내에 μ •μ˜λ˜μ–΄ μžˆλŠ” λͺ¨λ“  ν•¨μˆ˜μ— λŒ€ν•΄μ„œ 접두어λ₯Ό μƒλž΅ν•  수 있음

ν‚€ μž…λ ₯

  • cin 객체
    • ν‚€λ³΄λ“œμ™€ cpp μ‘μš© ν”„λ‘œκ·Έλž¨μ„ μ—°κ²°ν•˜λŠ” cpp ν‘œμ€€ μž…λ ₯ 슀트림 객체(standard input stream object)
    • ν‚€λ³΄λ“œ μž…λ ₯ 값듀은 λͺ¨λ‘ cin 객체의 슀트림 λ²„νΌλ‘œ λ“€μ–΄μ˜€λ©°, μ‘μš© ν”„λ‘œκ·Έλž¨μ€ cin κ°μ²΄λ‘œλΆ€ν„° μž…λ ₯된 ν‚€ 값을 λ°›μŒ
  • >> μ—°μ‚°μž
    • 슀트림 μΆ”μΆœ μ—°μ‚°μž(stream extracion operator)
    • μ™Όμͺ½ ν”Όμ—°μ‚°μžμΈ 슀트림 κ°μ²΄λ‘œλΆ€ν„° 데이터λ₯Ό 읽어 였λ₯Έμͺ½ ν”Όμ—°μ‚°μžμ— μ§€μ •λœ λ³€μˆ˜μ— μ‚½μž…
    • << μ—°μ‚°μžμ™€ λ§ˆμ°¬κ°€μ§€λ‘œ μ •μˆ˜λ₯Ό μ‹œν”„νŠΈν•˜λŠ” cpp의 κΈ°λ³Έ μ—°μ‚°μžμ΄μ§€λ§Œ μž¬μ •μ˜λ˜μ–΄ μ‚¬μš©λ¨

πŸ‘€ [03] ν΄λž˜μŠ€μ™€ 객체

객체

  • μŠ€νƒ€ν¬λž˜ν”„νŠΈμ— λ“±μž₯ν•˜λŠ” 각 인물듀, ν…ŒνŠΈλ¦¬μŠ€ κ²Œμž„μ— λ‚˜μ˜€λŠ” 각 블둝듀, ν•œκΈ€ ν”„λ‘œκ·Έλž¨μ˜ λ©”λ‰΄λ‚˜ λ²„νŠΌ => 객체(object)
  • κ°μ²΄λŠ” 멀버 λ³€μˆ˜μ™€ 멀버 ν•¨μˆ˜λ‘œ ꡬ성됨
    • 멀버 λ³€μˆ˜ : 객체의 μƒνƒœ(state) λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 속성듀
    • 멀버 ν•¨μˆ˜ : 행동(behavior) 을 κ΅¬ν˜„ν•œ μ½”λ“œλ“€
  • μ™ΈλΆ€μ—μ„œ κ°μ²΄μ—κ²Œ μ–΄λ–€ μž‘μ—…μ„ μš”μ²­ν•˜κ±°λ‚˜ μƒνƒœλ₯Ό μ•Œκ³ μž ν•  λ•Œ, 객체 내에 곡개된 멀버 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•¨

ν΄λž˜μŠ€μ™€ 객체

  • 클래슀(class) : 객체(object) λ₯Ό μ •μ˜ν•˜λŠ” ν‹€ ν˜Ήμ€ 섀계도
    • ν΄λž˜μŠ€μ— 멀버 λ³€μˆ˜μ™€ 멀버 ν•¨μˆ˜λ₯Ό 선언함
  • κ°μ²΄λŠ” ν΄λž˜μŠ€λΌλŠ” ν‹€μ—μ„œ 찍어내어, 멀버 λ³€μˆ˜ λ©”λͺ¨λ¦¬μ™€ 멀버 ν•¨μˆ˜ μ½”λ“œλ₯Ό μ‹€μ œ 가지고 ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λŠ” λ™μ•ˆ μ‹€μ‘΄ν•˜λŠ” 싀체 λ˜λŠ” μΈμŠ€ν„΄μŠ€(instance) μž„

클래슀 μ„ μ–Έ

class A {
private:
    int a;
    int b;
public:
    int get_sum() {
        return a+b;
    }
};
  • 클래슀 μ„ μ–ΈλΆ€(class declaration) 와 클래슀 κ΅¬ν˜„λΆ€(class implementation) 으둜 λΆ„λ₯˜
  • class ν‚€μ›Œλ“œλ‘œ μ„ μ–Έ
  • c μ–Έμ–΄μ˜ ꡬ쑰체(struct) 와 같이 κ°œλ°œμžκ°€ μ •μ˜ν•˜λŠ” μƒˆλ‘œμš΄ 데이터 νƒ€μž…μž„
  • μ„ μ–ΈλΆ€μ—μ„œλŠ” 멀버 λ³€μˆ˜μ™€ 멀버 ν•¨μˆ˜μ˜ μ›ν˜•μ„ 선언함
    • 멀버 λ³€μˆ˜ μ΄ˆκΈ°ν™” κ°€λŠ₯
  • μ ‘κ·Ό μ§€μ •μž(access specifier)
    • public : 클래슀 μ™ΈλΆ€λ‘œλΆ€ν„° μ ‘κ·Ό ν—ˆμš©
    • private : 클래슀 μ™ΈλΆ€λ‘œλΆ€ν„° 접근을 ν—ˆμš©ν•˜μ§€ μ•ŠμŒ(Default)
    • protected : νŒŒμƒ ν΄λž˜μŠ€μ—κ²Œ 접근을 ν—ˆμš©ν•˜κ³  λ‹€λ₯Έ ν΄λž˜μŠ€λ‚˜ μ™ΈλΆ€ ν•¨μˆ˜μ—μ„œλŠ” μ ‘κ·Όν•  수 μ—†μŒ
  • μœ„μ™€ 같이 클래슀 μ„ μ–ΈλΆ€μ—μ„œ 클래슀 ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•  μˆ˜λŠ” μžˆμ§€λ§Œ 클래슀의 μž¬μ‚¬μš©μ„ μœ„ν•΄ 보톡 λΆ„λ¦¬ν•˜μ—¬ μž‘μ„±ν•¨
class A {
private:
    int a;
    int b;
public:
    int get_sum();
};

int A::get_sum() {
    return a+b;
}
  • 선언뢀와 κ΅¬ν˜„λΆ€λ₯Ό λΆ„λ¦¬ν•΄μ„œ μ •μ˜ν•œ μ½”λ“œ
  • 클래슀 ν•¨μˆ˜ : ν•¨μˆ˜μ˜ 리턴 νƒ€μž…, 클래슀 이름, λ²”μœ„ 지정 μ—°μ‚°μž, 멀버 ν•¨μˆ˜λͺ…κ³Ό 맀개 λ³€μˆ˜

μƒμ„±μž

  • 객체λ₯Ό 생성할 λ•Œ 객체λ₯Ό μ΄ˆκΈ°ν™”ν•  수 있음

  • μƒμ„±μž(constructor) : ν΄λž˜μŠ€μ—μ„œ 객체가 생성될 λ•Œ μžλ™μœΌλ‘œ μ‹€ν–‰λ˜λŠ” νŠΉλ³„ν•œ 멀버 ν•¨μˆ˜

    • 객체 μ΄ˆκΈ°ν™” ν•¨μˆ˜
  • μƒμ„±μžμ˜ νŠΉμ§•

    • μƒμ„±μžμ˜ λͺ©μ μ€ 객체가 생성될 λ•Œ ν•„μš”ν•œ 초기 μž‘μ—…μ„ μœ„ν•¨
    • μƒμ„±μž ν•¨μˆ˜λŠ” 였직 ν•œ 번만 싀행됨
    • μƒμ„±μž ν•¨μˆ˜μ˜ 이름은 클래슀 이름과 λ™μΌν•˜κ²Œ μž‘μ„±λ˜μ–΄μ•Ό 함
    • μƒμ„±μž ν•¨μˆ˜μ˜ μ›ν˜•μ— 리턴 νƒ€μž…μ„ μ„ μ–Έν•˜μ§€ μ•Šμ•„μ•Ό 함
    • μƒμ„±μžλŠ” 쀑볡 κ°€λŠ₯함
  • μœ„μž„ μƒμ„±μž(delegating constructor)

    • κΈ°λ³Έ μƒμ„±μžμ™€ 맀개 λ³€μˆ˜λ₯Ό κ°€μ§€λŠ” μƒμ„±μžλ₯Ό λ”°λ‘œ μ •μ˜ν•˜κ²Œ 되면 객체λ₯Ό μ΄ˆκΈ°ν™”ν•˜λŠ” λΉ„μŠ·ν•œ μ½”λ“œκ°€ 쀑볡됨
    Circle::Circle() : Circle(1) { }
    
    Circle::Circle(int r) {
      radius = r;
      cout << "λ°˜μ§€λ¦„ " << radius << " 원 생성" << endl;
    }
    • μ€‘λ³΅λœ μ΄ˆκΈ°ν™” μ½”λ“œλ₯Ό ν•˜λ‚˜μ˜ μƒμ„±μžλ‘œ λͺ°κ³ , λ‹€λ₯Έ μƒμ„±μžμ—μ„œ 이 μƒμ„±μžλ₯Ό ν˜ΈμΆœν•  수 있게 함
    • 객체의 μ΄ˆκΈ°ν™” μž‘μ—…μ΄ μ½”λ”©λœ Circle(int r) : νƒ€κ²Ÿ μƒμ„±μž
    • 객체의 μ΄ˆκΈ°ν™”λ₯Ό λ‹€λ₯Έ μƒμ„±μžμ— μœ„μž„ν•˜λŠ” Circle() : μœ„μž„ μƒμ„±μž
  • κΈ°λ³Έ μƒμ„±μž(default constructor)

    • ν΄λž˜μŠ€μ— μ„ μ–Έλœ μ–΄λ–€ μƒμ„±μžλ„ 없을 λ•Œ μ»΄νŒŒμΌλŸ¬κ°€ μžλ™μœΌλ‘œ μƒμ„±ν•΄μ£ΌλŠ” μƒμ„±μž
    • 맀개 λ³€μˆ˜κ°€ μ—†λŠ” μƒμ„±μž
    • μžλ™μœΌλ‘œ μƒμ„±λ˜λŠ” 경우
      • μƒμ„±μžκ°€ ν•˜λ‚˜λ„ μ—†λŠ” 클래슀의 경우, μ»΄νŒŒμΌλŸ¬κ°€ 보이지 μ•Šκ²Œ κΈ°λ³Έ μƒμ„±μžλ₯Ό μ‚½μž…ν•¨
    • μžλ™μœΌλ‘œ μƒμ„±λ˜μ§€ μ•ŠλŠ” 경우
      • μƒμ„±μžκ°€ ν•˜λ‚˜λΌλ„ μ„ μ–Έλœ 클래슀의 경우, μ»΄νŒŒμΌλŸ¬λŠ” κΈ°λ³Έ μƒμ„±μžλ₯Ό μžλ™ μ‚½μž…ν•˜μ§€ μ•ŠμŒ

μ†Œλ©Έμž

  • 객체가 μ†Œλ©Έλ˜λ©΄ 객체 λ©”λͺ¨λ¦¬λŠ” μ‹œμŠ€ν…œμœΌλ‘œ λ°˜ν™˜λ¨
  • μ†Œλ©Έμž(destructor) : 객체가 μ†Œλ©Έλ˜λŠ” μ‹œμ μ—μ„œ μžλ™μœΌλ‘œ ν˜ΈμΆœλ˜λŠ” 클래슀의 멀버 ν•¨μˆ˜
  • μ†Œλ©Έμžμ˜ νŠΉμ§•
    • μ†Œλ©Έμžμ˜ λͺ©μ μ€ 객체가 μ‚¬λΌμ§ˆ λ•Œ ν•„μš”ν•œ 마무리 μž‘μ—…μ„ μœ„ν•¨
    • μ†Œλ©Έμžμ˜ 이름은 클래슀 이름 μ•žμ— ~λ₯Ό λΆ™μž„
    • μ†Œλ©ΈμžλŠ” 리턴 νƒ€μž…μ΄ μ—†μœΌλ©° μ–΄λ–€ 값도 λ¦¬ν„΄ν•΄μ„œλ„ μ•ˆ 됨
    • μ†Œλ©ΈμžλŠ” 였직 ν•œ 개만 μ‘΄μž¬ν•˜λ©° 맀개 λ³€μˆ˜λ₯Ό 가지지 μ•ŠμŒ
    • μ†Œλ©Έμžκ°€ μ„ μ–Έλ˜μ–΄ μžˆμ§€ μ•ŠμœΌλ©΄ κΈ°λ³Έ μ†Œλ©Έμžκ°€ μžλ™μœΌλ‘œ 생성됨

μ ‘κ·Ό 지정

  • 멀버 μ ‘κ·Ό μ§€μ •μž(access specifier)
    • private(λΉ„κ³΅κ°œ)
      • μ ‘κ·Ό μ§€μ •μ˜ default
      • private μ ‘κ·Ό μ§€μ •μœΌλ‘œ μ„ μ–Έλœ λ©€λ²„λŠ” 클래슀 λ‚΄μ˜ 멀버 ν•¨μˆ˜λ“€μ—κ²Œλ§Œ 접근이 ν—ˆμš©λ¨
      • 멀버 λ³€μˆ˜λŠ” private 둜 μ§€μ •ν•˜λŠ” 것이 λ°”λžŒμ§ν•¨
    • public(곡개)
      • public μ ‘κ·Ό μ§€μ •μœΌλ‘œ μ„ μ–Έλœ λ©€λ²„λŠ” 클래슀 λ‚΄μ™Έλ₯Ό λ§‰λ‘ ν•˜κ³  ν”„λ‘œκ·Έλž¨μ˜ λͺ¨λ“  ν•¨μˆ˜λ“€μ—κ²Œ 접근이 ν—ˆμš©λ¨
      • μƒμ„±μžλŠ” public 으둜 지정해야 함
    • protected(보호)
      • protected μ ‘κ·Ό μ§€μ •μœΌλ‘œ μ„ μ–Έλœ λ©€λ²„λŠ” 클래슀 λ‚΄μ˜ 멀버 ν•¨μˆ˜μ™€ 이 클래슀λ₯Ό 상속받은 νŒŒμƒ 클래슀의 멀버 ν•¨μˆ˜μ—κ²Œλ§Œ 접근이 ν—ˆμš©λ¨

πŸ‘€ [04] 객체 포인터와 객체 λ°°μ—΄, 객체의 동적 생성

객체 포인터

  • Circle *p : 객체에 λŒ€ν•œ 포인터 λ³€μˆ˜ μ„ μ–Έ
    • 아무 객체도 가리킀고 μžˆμ§€ μ•ŠμŒ
  • Circle* p = &donut; : 포인터 λ³€μˆ˜μ— 객체 μ£Όμ†Œ 지정
    • 객체의 μ£Όμ†ŒλŠ” 객체 이름 μ•žμ— & μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ—¬ ν‘œν˜„
  • d = donut.getArea(); : 객체 μ΄λ¦„μœΌλ‘œ 멀버 μ ‘κ·Ό
    • . μ—°μ‚°μž μ‚¬μš©
  • d = p->getArea(); : 객체 ν¬μΈν„°λ‘œ 멀버 μ ‘κ·Ό
    • -> μ—°μ‚°μž μ‚¬μš©
    • d = (*p).getArea(); 와 κ°™μŒ

동적 λ©”λͺ¨λ¦¬ ν• λ‹Ή 및 λ°˜ν™˜

  • c μ–Έμ–΄μ—μ„œ 동적 λ©”λͺ¨λ¦¬ ν• λ‹Ή 및 λ°˜ν™˜μ€ malloc() κ³Ό free() λ“±μ˜ ν‘œμ€€ c ν•¨μˆ˜λ₯Ό μ‚¬μš©
  • cppμ—μ„œλŠ” new 와 delete μ—°μ‚°μžλ₯Ό 이용
    • new
      • νž™(heap) κ³΅κ°„μ—μ„œ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήλ°›μŒ => μ˜ˆμ•½μ–΄
    • delete
      • 할당받은 λ©”λͺ¨λ¦¬λ₯Ό νž™μœΌλ‘œ λ°˜ν™˜
[data_type] *[pointer_variable] = new [data_type];
delete [pointer_variable];
  • new 와 delete κΈ°λ³Έ ν˜•μ‹
  • new : 데이터 νƒ€μž…μ˜ 크기만큼 νž™μœΌλ‘œλΆ€ν„° λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήλ°›κ³  μ£Όμ†Œλ₯Ό 리턴함
  • delete : 포인터 λ³€μˆ˜κ°€ κ°€λ¦¬ν‚€λŠ” λ©”λͺ¨λ¦¬λ₯Ό νž™μœΌλ‘œ λ°˜ν™˜
  • νž™ λ©”λͺ¨λ¦¬κ°€ λΆ€μ‘±ν•˜λ©΄ newλŠ” NULL 을 리턴
  • λ™μ μœΌλ‘œ 할당받지 μ•ŠλŠ” λ©”λͺ¨λ¦¬λ₯Ό delete 둜 λ°˜ν™˜ μ‹œ 였λ₯˜
[data_type] *[pointer_variable] = new [data_type] [array_size];
delete [] [pointer_variable];
  • 배열을 λ™μ μœΌλ‘œ ν• λ‹Ήλ°›κ³  λ°˜ν™˜ν•˜λŠ” new 와 delete κΈ°λ³Έ ν˜•μ‹
  • new : λ°°μ—΄μ˜ ν¬κΈ°λ§Œν•œ 배열을 ν• λ‹Ήλ°›μ•„ μ£Όμ†Œλ₯Ό 리턴
  • delete : 포인터 λ³€μˆ˜κ°€ κ°€λ¦¬ν‚€λŠ” λ°°μ—΄ λ©”λͺ¨λ¦¬ λ°˜ν™˜

객체와 객체 λ°°μ—΄μ˜ 동적 생성 및 λ°˜ν™˜

[class_name] *[pointer_variable] = new [class_name];
[class_name] *[pointer_variable] = new [class_name](constructor_parameter_list);
  • new μ—°μ‚°μžλ₯Ό μ΄μš©ν•˜μ—¬ 객체λ₯Ό 동적 μƒμ„±ν•˜λŠ” ꡬ문
  • new : 클래슀 크기의 λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήλ°›μ•„ 객체λ₯Ό 생성
    • μƒμ„±μžλ₯Ό 호좜
delete [pointer_variable];
  • delete μ—°μ‚°μžλ₯Ό μ΄μš©ν•˜μ—¬ 포인터 λ³€μˆ˜κ°€ κ°€λ¦¬ν‚€λŠ” 객체λ₯Ό λ°˜ν™˜
[class_name] *[pointer_variable] = new [class_name] [array_size];
  • new μ—°μ‚°μžλ₯Ό μ΄μš©ν•˜μ—¬ 객체 배열을 λ™μ μœΌλ‘œ μƒμ„±ν•˜λŠ” ꡬ문
    • 각 객체에 λŒ€ν•΄ κΈ°λ³Έ μƒμ„±μžκ°€ 호좜됨
delete [] [pointer_variable];
  • delete μ—°μ‚°μžλ₯Ό μ΄μš©ν•˜μ—¬ λ™μ μœΌλ‘œ 할당받은 배열을 λ°˜ν™˜

동적 ν• λ‹Ή λ©”λͺ¨λ¦¬μ˜ λ°˜ν™˜

  • νž™(heap) 은 ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰ 쀑에 new λ₯Ό μ΄μš©ν•˜μ—¬ λ™μ μœΌλ‘œ ν• λ‹Ήλ°›μ•„ μ‚¬μš©ν•  수 μžˆλŠ” λ©”λͺ¨λ¦¬
  • λŒ€λΆ€λΆ„ μš΄μ˜μ²΄μ œμ—μ„œ ν”„λ‘œκ·Έλž¨λ§ˆλ‹€ νž™μ΄ λ”°λ‘œ 주어지기에 ν•œ ν”„λ‘œκ·Έλž¨μ΄ λ™μ μœΌλ‘œ λ§Žμ€ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήλ°›λŠ” 것이 λ‹€λ₯Έ ν”„λ‘œκ·Έλž¨μ˜ νž™μ— μ „ν˜€ 영ν–₯을 주지 μ•ŠμŒ
  • 할당받은 ν›„ ν•„μš” μ—†κ²Œ 된 λ©”λͺ¨λ¦¬λ₯Ό νž™μ— λ°˜ν™˜ν•˜μ§€ μ•Šκ±°λ‚˜ 논리적 였λ₯˜λ‘œ μΈν•œ λ©”λͺ¨λ¦¬ λˆ„μˆ˜(memory leak) κ°€ λ°œμƒν•˜λ©΄ νž™μ— λ©”λͺ¨λ¦¬κ°€ λΆ€μ‘±ν•˜μ—¬ 할당받지 λͺ»ν•˜κ²Œ 됨
    • λ©”λͺ¨λ¦¬ λˆ„μˆ˜(memory leak) : λ™μ μœΌλ‘œ 할당받은 λ©”λͺ¨λ¦¬μ˜ μ£Όμ†Œλ₯Ό μžƒμ–΄λ²„λ € νž™μ— λ°˜ν™˜ν•  수 없을 λ•Œ λ°œμƒ
      • μ§€μ†μ μœΌλ‘œ λ°œμƒν•  경우 νž™μ˜ 크기가 쀄어듀어 μ‹€ν–‰ 쀑 λ©”λͺ¨λ¦¬λ₯Ό 할당받을 수 μ—†λŠ” μ‹¬κ°ν•œ 논리적 였λ₯˜κ°€ λ°œμƒν•¨

this 포인터

  • this
    • 객체 μžμ‹ μ— λŒ€ν•œ 포인터
    • 클래슀의 멀버 ν•¨μˆ˜ λ‚΄μ—μ„œλ§Œ μ‚¬μš©λ¨
    • 파이썬의 self λž‘ λΉ„μŠ·ν•œ κ°œλ…
  • this κ°€ ν•„μš”ν•œ 경우
    • 맀개 λ³€μˆ˜μ˜ 이름을 멀버 λ³€μˆ˜μ™€ λ™μΌν•˜κ²Œ μ‚¬μš©ν•˜λŠ” 경우
    • 객체의 멀버 ν•¨μˆ˜μ—μ„œ 객체 μžμ‹ μ˜ μ£Όμ†Œλ₯Ό λ¦¬ν„΄ν•˜λŠ” 경우
      • μ—°μ‚°μž 쀑볡을 κ΅¬ν˜„ν•  λ•Œμ˜ κ²½μš°μž„
  • this 의 μ œμ•½ 쑰건
    • 클래슀의 멀버 ν•¨μˆ˜μ—μ„œλ§Œ μ‚¬μš©ν•  수 있음
    • 멀버 ν•¨μˆ˜λΌλ„ 정적 멀버 ν•¨μˆ˜(static member function) λŠ” μ‚¬μš©ν•  수 μ—†μŒ

πŸ‘€ [08] 상속

μƒμ†μ˜ κ°œλ…

  • 상속(Inheritance) : 객체 지ν–₯ μ–Έμ–΄μ˜ 본질적인 νŠΉμ„±
    • 두 클래슀 사이에 λΆ€λͺ¨-μžμ‹μ˜ 상속 관계 μ„ μ–Έ
    • μžμ‹ 클래슀의 객체가 생성될 λ•Œ, μžμ‹ μ˜ 멀버뿐 μ•„λ‹ˆλΌ λΆ€λͺ¨ 클래슀의 멀버λ₯Ό 포함할 것을 μ§€μ‹œν•¨
    • λΆ€λͺ¨ 클래슀 => κΈ°λ³Έ 클래슀(base class)
    • μžμ‹ 클래슀 => νŒŒμƒ 클래슀(derived class)
    • cppλŠ” μ—¬λŸ¬ 개의 클래슀λ₯Ό λ™μ‹œμ— μƒμ†λ°›λŠ” 닀쀑 상속(multiple inheritance) ν—ˆμš©
  • μƒμ†μ˜ λͺ©μ κ³Ό μž₯점
    • κ°„κ²°ν•œ 클래슀 μž‘μ„±
    • 클래슀 κ°„μ˜ 계측적 λΆ„λ₯˜ 및 κ΄€λ¦¬μ˜ μš©μ΄ν•¨
    • 클래슀 μž¬μ‚¬μš©κ³Ό ν™•μž₯을 ν†΅ν•œ μ†Œν”„νŠΈμ›¨μ–΄μ˜ 생산성 ν–₯상

클래슀 상속과 객체

class Student : public Person {

};
class StudentWorker : public Student {

};
  • Person을 μƒμ†λ°›λŠ” Student와 Studentλ₯Ό μƒμ†λ°›λŠ” StudentWorker μ„ μ–Έ
  • κΈ°λ³Έ 클래슀 이름 μ•žμ— λ°˜λ“œμ‹œ 상속 접근을 지정해야 ν•˜λŠ”λ°, μ ‘κ·Ό μ§€μ •μž 3개 λͺ¨λ‘ μ‚¬μš© κ°€λŠ₯함
  • μƒμ†μ˜ νšŸμˆ˜λŠ” μ œν•œμ΄ μ—†μŒ
class ColorPoint : public Point {
  // Pointλ₯Ό μƒμ†λ°›λŠ” ColorPoint의 상속 μ„ μ–Έ
};
int main() {
  Point p; // Point νƒ€μž…μΈ κΈ°λ³Έ 클래슀 객체 p 생성
  ColorPoint cp; // ColorPoint νƒ€μž…μΈ νŒŒμƒ 클래슀 객체 cp 생성
}
  • 객체 pλŠ” Point 클래슀의 λ©€λ²„λ§Œ 가짐
  • 객체 cpλŠ” Point 멀버와 ColorPoint 멀버 λͺ¨λ‘ 가짐

νŒŒμƒ ν΄λž˜μŠ€μ—μ„œ κΈ°λ³Έ 클래슀 멀버 μ ‘κ·Ό

  • νŒŒμƒ ν΄λž˜μŠ€λŠ” 상속을 톡해 κΈ°λ³Έ 클래슀의 멀버λ₯Ό μžμ‹ μ˜ λ©€λ²„λ‘œ ν™•μž₯
  • νŒŒμƒ 클래슀의 멀버듀은 κΈ°λ³Έ 클래슀의 private 멀버 외에 λͺ¨λ“  멀버λ₯Ό μ ‘κ·Όν•  수 있음

κΈ°λ³Έ 클래슀의 private λ©€λ²„μ˜ 상속과 μ ‘κ·Ό

  • κΈ°λ³Έ 클래슀의 private 멀버도 νŒŒμƒ ν΄λž˜μŠ€μ— 상속됨
  • νŒŒμƒ 클래슀의 객체가 생길 λ•Œ νŒŒμƒ 클래슀의 객체 내에 생성됨
  • 즉, κΈ°λ³Έ ν΄λž˜μŠ€μ— μ„ μ–Έλœ private λ©€λ²„λŠ” νŒŒμƒ ν΄λž˜μŠ€μ— μƒμ†λ˜κ³  νŒŒμƒ 클래슀의 객체에도 ν¬ν•¨λ˜μ§€λ§Œ, νŒŒμƒ 클래슀의 μ–΄λ–€ ν•¨μˆ˜μ—μ„œλ„ 직접 접근이 λΆˆκ°€ν•¨

클래슀 μ™ΈλΆ€μ—μ„œ νŒŒμƒ 클래슀의 멀버 호좜

  • main() ν•¨μˆ˜μ™€ 같이 νŒŒμƒ 클래슀 μ™ΈλΆ€μ—μ„œ νŒŒμƒ 클래슀 객체의 public 멀버와 κΈ°λ³Έ 클래슀의 public 멀버λ₯Ό λͺ¨λ‘ μ ‘κ·Όν•  수 있음

πŸ‘€ [μΆ”κ°€] λ‹€ν˜•μ„±κ³Ό 가상 ν•¨μˆ˜

λ‹€ν˜•μ„±

  • λ‹€ν˜•μ„±(polymorphism) : κ°μ²΄λ“€μ˜ νƒ€μž…μ΄ λ‹€λ₯΄λ©΄ λ˜‘κ°™μ€ λ©”μ‹œμ§€κ°€ μ „λ‹¬λ˜λ”λΌλ„ μ„œλ‘œ λ‹€λ₯Έ λ™μž‘μ„ ν•˜λŠ” 것

객체 ν¬μΈν„°μ˜ ν˜•λ³€ν™˜

class Shape {
protected:
    int x, y;
public:
    Shape() { cout << "Shape Constructor" << endl; }
    ~Shape() { cout << "Shape Destructor" << endl; }
    void set(int x, int y) {
        this->x = x;
        this->y = y;
    }
    void draw() {
        cout << "Shape Draw" << endl;
    }
};

class Rectangle : public Shape {
private:
    int w, h;
public:
    Rectangle() { cout << "Rectangle Constructor" << endl; }
    ~Rectangle() { cout << "Rectangle Destructor" << endl; }
    void setWidth(int w) {
        this->w = w;
    }
    void setHeight(int h) {
        this->h = h;
    }
    void draw() {
        cout << "Rectangle Draw" << endl;
    }
};

class Circle : public Shape {
private:
    int r;
public:
    void setRadius(int r) {
        this->r = r;
    }
    void draw() {
        cout << "Circle Draw" << endl;
    }
};
  • λΆ€λͺ¨ 클래슀인 Shape와 Shapeλ₯Ό μƒμ†λ°›λŠ” μžμ‹ 클래슀 Rectangleκ³Ό Circle
int main() {
    Shape *ps = new Rectangle();
    ps->set(10, 10);
    ps->draw();
    delete ps;

    return 0;
}
  • 상ν–₯ ν˜•λ³€ν™˜(upcasting) : μžμ‹ 클래슀 νƒ€μž…μ„ λΆ€λͺ¨ 클래슀 νƒ€μž…μœΌλ‘œ λ³€ν™˜
    • Rectangle 객체λ₯Ό Shape ν¬μΈν„°λ‘œ 가리킀고 μžˆλŠ”λ° 포인터 psλŠ” Rectangle의 멀버 ν•¨μˆ˜μ— μ ‘κ·Όν•˜μ§€ λͺ»ν•˜λ©° Shape에 μ •μ˜λœ 멀버 ν•¨μˆ˜λ§Œ μ ‘κ·Όν•  수 있음
// 1
int main() {
    Shape *ps = new Rectangle();
    Rectangle *pr = (Rectangle *) ps;
    pr->setHeight(10);
    pr->draw();
    delete pr;

    return 0;
}
// 2
int main() {
    Shape *ps = new Rectangle();
    ((Rectangle *)ps)->setHeight(10);
    ((Rectangle *)ps)->draw();
    delete ps;

    return 0;
}
  • ν•˜ν–₯ ν˜•λ³€ν™˜(downcasting) : λΆ€λͺ¨ 클래슀 νƒ€μž…μ„ μžμ‹ 클래슀 νƒ€μž…μœΌλ‘œ λ³€ν™˜
    • Rectangle 객체λ₯Ό Shape ν¬μΈν„°λ‘œ 가리킀고 μžˆλŠ” 포인터 ps둜 Rectangle의 멀버 ν•¨μˆ˜μ— μ ‘κ·Όν•  수 μžˆλŠ” 방법

κ°€μƒν•¨μˆ˜

class Shape {
protected:
    int x, y;
public:
    Shape() { cout << "Shape Constructor" << endl; }
    virtual ~Shape() { cout << "Shape Destructor" << endl; }
    void set(int x, int y) {
        this->x = x;
        this->y = y;
    }
    // 가상 ν•¨μˆ˜ μ •μ˜
    virtual void draw() {
        cout << "Shape Draw" << endl;
    }
};

class Rectangle : public Shape {
private:
    int w, h;
public:
    Rectangle() { cout << "Rectangle Constructor" << endl; }
    ~Rectangle() { cout << "Rectangle Destructor" << endl; }
    void setWidth(int w) {
        this->w = w;
    }
    void setHeight(int h) {
        this->h = h;
    }
    // μž¬μ •μ˜(μ˜€λ²„λΌμ΄λ”©)
    void draw() {
        cout << "Rectangle Draw" << endl;
    }
};
  • λΆ€λͺ¨ 클래슀인 Shape와 Shapeλ₯Ό μƒμ†λ°›λŠ” μžμ‹ 클래슀 Rectangle
  • Shape의 draw ν•¨μˆ˜λŠ” 가상 ν•¨μˆ˜λ‘œ μ •μ˜λ˜μ—ˆμœΌλ©° Rectangleμ—μ„œ μž¬μ •μ˜

int main() {
    Shape *ps = new Rectangle();
    ps->draw();
    delete ps;

    return 0;
}
  • Shape의 draw ν•¨μˆ˜κ°€ μ•„λ‹Œ μž¬μ •μ˜λœ Rectangle의 draw ν•¨μˆ˜κ°€ 싀행됨

바인딩

  • 정적 바인딩(static binding) : 컴파일 λ‹¨κ³„μ—μ„œ λͺ¨λ“  바인딩이 μ™„λ£Œλ˜λŠ” 것
    • 컴파일 μ‹œκ°„μ— 호좜 ν•¨μˆ˜κ°€ 결정됨
    • 속도가 빠름
    • 일반 ν•¨μˆ˜ λŒ€μƒ
  • 동적 바인딩(dynamic binding) ν˜Ήμ€ 지연 바인딩(late binding) : 바인딩이 μ‹€ν–‰ μ‹œκΉŒμ§€ μ—°κΈ°λ˜κ³  μ‹€ν–‰ μ‹œκ°„μ— μ‹€μ œ ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜λ₯Ό κ²°μ •ν•˜λŠ” 것
    • μ‹€ν–‰ μ‹œκ°„μ— 호좜 ν•¨μˆ˜κ°€ 결정됨
    • 속도가 느림
    • 가상 ν•¨μˆ˜ λŒ€μƒ

μ°Έμ‘°μžμ™€ 가상 ν•¨μˆ˜

  • μ°Έμ‘°μžλ„ 포인터와 λ§ˆμ°¬κ°€μ§€λ‘œ λͺ¨λ“  것이 λ™μΌν•˜κ²Œ 적용됨
  • λΆ€λͺ¨ 클래슀의 참쑰자둜 μžμ‹ 클래슀λ₯Ό 가리킬 수 있으며 가상 ν•¨μˆ˜μ˜ λ™μž‘λ„ 동일함

가상 μ†Œλ©Έμž

  • λ‹€ν˜•μ„±μ„ μ‚¬μš©ν•˜λŠ” κ³Όμ •μ—μ„œ μ†Œλ©Έμžλ₯Ό 가상 ν•¨μˆ˜ν™” 해주지 μ•ŠμœΌλ©΄ λ©”λͺ¨λ¦¬ λˆ„μˆ˜ λ°œμƒ
  • μ†Œλ©Έμžλ₯Ό 가상 ν•¨μˆ˜λ‘œ μ„ μ–Έν•˜λ©΄ λΆ€λͺ¨ 클래슀의 μ†Œλ©Έμž μ‹€ν–‰ 쀑 동적 바인딩에 μ˜ν•΄ μžμ‹ 클래슀의 μ†Œλ©Έμžμ— λŒ€ν•œ 호좜둜 λ³€ν•˜κ²Œ 됨
    • μžμ‹ 클래슀의 μ†Œλ©ΈμžλŠ” μžμ‹ μ΄ μ‹€ν–‰λœ ν›„ λΆ€λͺ¨ 클래슀의 μ†Œλ©Έμžλ₯Ό ν˜ΈμΆœν•˜λ„λ‘ 컴파일되기 λ•Œλ¬Έμ— λΆ€λͺ¨ ν΄λž˜μŠ€μ™€ μžμ‹ 클래슀의 μ†Œλ©Έμžκ°€ λͺ¨λ‘ μˆœμ„œλŒ€λ‘œ 싀행됨

순수 가상 ν•¨μˆ˜

  • 순수 가상 ν•¨μˆ˜(pure virtual function) : ν•¨μˆ˜ ν—€λ”λ§Œ μ‘΄μž¬ν•˜κ³  ν•¨μˆ˜μ˜ λͺΈμ²΄λŠ” μ—†λŠ” ν•¨μˆ˜
    • virtual [return_type] [function_name]([parameters]) = 0;

좔상 클래슀

  • 좔상 클래슀(abstract class) : 순수 가상 ν•¨μˆ˜λ₯Ό 가지고 μžˆλŠ” 클래슀
    • 좔상적인 κ°œλ…μ„ ν‘œν˜„ν•˜λŠ”λ° 적당함
728x90
λ°˜μ‘ν˜•
Comments