Language/C++ [C++] μ ‘κ·Ό μ œμ–΄/가상 ν•¨μˆ˜/μ˜ˆμ™Έ 처리
  • 728x90
    λ°˜μ‘ν˜•

     

     

     

    C++


     

     

    μ ‘κ·Όμ œμ–΄

    🎯 μ ‘κ·Όμ œμ–΄ ν‚€μ›Œλ“œ λ‹€μ‹œ 보기

    • public : λͺ¨λ“  κ³³μœΌλ‘œλΆ€ν„°μ˜ 접근을 ν—ˆμš©ν•œλ‹€.
    • protected : μžμ‹ 클래슀의 멀버 ν•¨μˆ˜λ‘œλΆ€ν„°μ˜ μ ‘κ·Όλ§Œ ν—ˆμš©ν•œλ‹€.
    • private : μžμ‹ μ˜ 멀버 ν•¨μˆ˜ μ™Έμ—λŠ” μ ‘κ·Όν•  수 μ—†λ‹€.

     

    πŸ”” 예) 상속과 μ ‘κ·Ό μ œμ–΄

     

      μžμ‹ μ˜ 멀버 ν•¨μˆ˜μ—μ„œ μ ‘κ·Ό μžμ‹ 클래슀의 멀버 ν•¨μˆ˜μ—μ„œ μ ‘κ·Ό μ™ΈλΆ€μ—μ„œ μ ‘κ·Ό
    private 멀버 Yes No No
    protected 멀버 Yes Yes No
    public 멀버 Yes Yes Yes

     

    🎯 μ˜€λ²„λ‘œλ”©κ³Ό λ‹€ν–₯μ„±

    πŸ“Œ μ˜€λ²„λ‘œλ”©λ„ λ‹€ν˜•μ„±μ˜ ν•œ μ’… λ₯˜λ‹€. ν•˜λ‚˜μ˜ 이름을 μ‚¬μš©ν•˜μ§€λ§Œ μΈμžμ— λ”°λΌμ„œ μ—¬λŸ¬κ°€μ§€ λ‹€λ₯Έ ν•¨μˆ˜λ“€μ΄ 호좜될 수 있기 λ•Œλ¬Έμ΄λ‹€.

     

     

     

     

    순수 가상 ν•¨μˆ˜

    πŸ“Œ 가상 ν•¨μˆ˜μ˜ μ„ μ–Έ 뒀에 λ‹€μŒκ³Ό 같이 ' = 0 ' 을 λΆ™μ—¬μ£Όλ©΄ λœλ‹€.

    virtual void Draw() const = 0;

     

     

    🎯 순수 가상 ν•¨μˆ˜μ˜ 의미

    πŸ“Œ "이 ν•¨μˆ˜λŠ” μ •μ˜κ°€ μ—†μ–΄. κ·ΈλŸ¬λ‹ˆκΉŒ ν˜ΈμΆœν•  μˆ˜κ°€ 없지 ν•˜μ§€λ§Œ μžμ‹ν΄λž˜μŠ€μ—μ„œ 이 ν•¨μˆ˜λ₯Ό μ˜€λ²„λΌμ΄λ”© ν• κ±°κ±°λ“  κ·ΈλŸ¬λ‹ˆκΉŒ λ‹€ν˜•μ„±μ„ μ‚¬μš©ν•΄μ„œ 이 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λž€ 말이야" 이것이 λ°”λ‘œ 순수 가상 ν•¨μˆ˜λ‘œ λ§Œλ“€μ–΄μ£ΌλŠ” μ˜λ―Έλ‹€.

     

    πŸ”” 예) Draw() ν•¨μˆ˜λ₯Ό 순수 가상 ν•¨μˆ˜λ‘œ λ§Œλ“€κΈ°

     

     

     

     

    μ‹€ν–‰ 였λ₯˜

    • 110 line 처럼 순수 κ°€μƒν•¨μˆ˜ 일 경우 객체λ₯Ό μ„ μ–Έν•  수 μ—†λ‹€.

     

     

    🎯 λ‹€μ–‘ν•œ μ’…λ₯˜μ˜ 멀버 ν•¨μˆ˜

    • 일반적인 멀버 ν•¨μˆ˜
    • 가상 ν•¨μˆ˜
    • 순수 가상 ν•¨μˆ˜

     

    πŸ’‘ μ–΄λ–€ κ²½μš°μ— 멀버 ν•¨μˆ˜λ₯Ό 가상 ν•¨μˆ˜λ‘œ λ§Œλ“€ 것 인지 μ•„λ‹ˆλ©΄ 순수 가상 ν•¨μˆ˜λ‘œ λ§Œλ“€ 것인지λ₯Ό μƒκ°ν•΄λ³΄μž.

     

    • μ²˜μŒμ—” κ·Έλƒ₯ 멀버 ν•¨μˆ˜λ‘œ λ§Œλ“ λ‹€. 
    • λ‹€ν˜•μ„±μ„ μ΄μš©ν•΄μ•Ό ν•˜λŠ” 경우라면 가상 ν•¨μˆ˜λ‘œ λ§Œλ“ λ‹€. 
    • λ‹€ν˜•μ„±μ„ μœ„ν•΄μ„œ ν•¨μˆ˜μ˜ μ›ν˜•λ§Œ ν•„μš”ν•œ 경우라면 순수 가상 ν•¨μˆ˜λ‘œ λ§Œλ“ λ‹€.

     

     

    🎯 μ΅œμƒμœ„ 클래슀 ?

    πŸ“Œ JAVA μ—μ„œλŠ” Super class(Object) 라고 λΆ€λ₯Έλ‹€. class λ₯Ό μ •μ˜ν•˜κ³  μƒμ†ν•˜μ§€ μ•ŠμœΌλ©΄ μžλ™μœΌλ‘œ Object λ₯Ό μƒμ†λ°›λŠ”λ‹€. (μ΄λŠ” ν”Όν•΄κ°ˆ 수 μ—†λ‹€.)

     

    πŸ’‘ λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œ μ˜€λ²„λ‘œλ“œλœ ν•¨μˆ˜ 쀑에 μ–΄λŠ 것 ν•˜λ‚˜λΌλ„ μ˜€λ²„λΌμ΄λ“œν•˜λ©΄ λ‚˜λ¨Έμ§€ λ‹€λ₯Έ ν•¨μˆ˜λ“€λ„ λͺ¨λ‘ μ‚¬μš©ν•  수 μ—†λ‹€. 이 κ·œμΉ™ λ•Œλ¬Έμ— test()ν•¨μˆ˜ 쀑에 ν•˜λ‚˜λ§Œ μ˜€λ²„λΌμ΄λ”©ν•˜μ—¬λ„ test() ν•¨μˆ˜λ„ μ‚¬μš©ν•  수 μ—†κ²Œ λœλ‹€.

     

    κΌ­ ν˜ΈμΆœν•˜κ³  μ‹Άλ‹€λ©΄ λ‹€μŒκ³Ό 같이 ν•  수 μžˆλ‹€.

    child.Point::test("???");

     

    πŸ’‘ λ””ν΄νŠΈ μƒμ„±μžλ₯Ό λ§Œλ“€μ§€ μ•Šκ³  μΈμžκ°€ μžˆλŠ” μƒμ„±μžλ₯Ό μ‚¬μš©ν•  수 μ—†λ‹€. μƒμ„±μžκ°€ ν•˜λ‚˜λ„ 없을 경우만 μ»΄νŒŒμΌλŸ¬κ°€ λ””ν΄νŠΈ μƒμ„±μžλ₯Ό λ§Œλ“€μ–΄ μ€€λ‹€.

     

     

     

     

    μ˜ˆμ™Έ 처리

    πŸ“Œ μ‚¬μš©μžκ°€ ν”„λ‘œκ·Έλž¨μ„ 많이 λ„μ›Œ λ†“μ•„μ„œ 컴퓨터에 더 이상 μ‚¬μš© κ°€λŠ₯ν•œ λ©”λͺ¨λ¦¬κ°€ λ‚¨μ•„μžˆμ§€ μ•Šμ€ κ²½μš°μ—λŠ” 이 가정이 거짓이 될 수 μžˆλ‹€. μš°λ¦¬λŠ” 이런 κ²½μš°μ— μ˜ˆμ™Έκ°€ λ°œμƒν–ˆλ‹€κ³  ν‘œν˜„ν•˜κ³  이런 상황을 μ˜¬λ°”λ₯΄κ²Œ μ²˜λ¦¬ν•˜λŠ” 과정을 μ˜ˆμ™Έ 처리라고 λ§ν•œλ‹€.

    • 컴퓨터에 μ‚¬μš© κ°€λŠ₯ν•œ λ©”λͺ¨λ¦¬κ°€ λΆ€μ‘±ν•œ 경우
    • ν•˜λ“œλ””μŠ€ν¬μ— νŒŒμΌμ„ μ“°λŠ”λ° ν•˜λ“œλ””μŠ€ν¬μ˜ 남은 μš©λŸ‰μ΄ λΆ€μ‘±ν•œ 경우
    • μ‚¬μš©μžκ°€ λ²”μœ„ λ°–μ˜ 값을 μž…λ ₯ν•˜κ±°λ‚˜ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 파일의 이름을 μž…λ ₯ν•˜λŠ” 경우

     

    μ€‘μš”ν•œ 것은 λ²„κ·Έλ‚˜ 였λ₯˜ 같이 개발자의 μ‹€μˆ˜λ‘œ μΌμ–΄λ‚˜λŠ” λ¬Έμ œμ λ“€κ³Ό μ˜ˆμ™Έλ₯Ό ꡬ별할 쀄 μ•Œμ•„μ•Όν•œλ‹€.

     

    πŸ”” 예)

    <DynamicArray.h>

     

    <DynamicArray.cpp>

     

    <Example.cpp>

     

    μ‹€ν–‰ κ²°κ³Ό

     

    🎯 λ°˜ν™˜ 값을 μ‚¬μš©ν•œ μ˜ˆμ™Έ 처리

    πŸ“Œ DynamicArray 클래슀의 SetAt(), GetAt() ν•¨μˆ˜μ—λŠ” 문제점이 ν•˜λ‚˜ μžˆλ‹€.

     

    예λ₯Ό λ“€μ–΄ SetAt() ν•¨μˆ˜ μ—λŠ” μ›μ†Œμ˜ μΈλ”•μŠ€λ₯Ό λ„˜κ²¨μ£Όκ²Œ λ˜μ–΄ μžˆλŠ”λ° λ°°μ—΄μ˜ 크기λ₯Ό λ„˜κ²¨μ„œ 인덱슀λ₯Ό λ„˜κ²¨μ£ΌλŠ” κ²½μš°μ—λŠ” ν• λ‹Ήλ˜μ§€ μ•ŠλŠ” λ©”λͺ¨λ¦¬λ₯Ό κ±΄λ“œλ €μ„œ ν”„λ‘œκ·Έλž¨μ΄ λΉ„μ •μƒμ μœΌλ‘œ μ’…λ£Œν•  수고 μžˆλ‹€.

     

    SetAt() ν•¨μˆ˜μ—μ„œλŠ” 잘λͺ»λœ 인덱슀λ₯Ό λ°›μ•˜μ„ λ•Œ κ³„μ†ν•΄μ„œ μž‘μ—…μ„ μ§„ν–‰ν•˜λŠ” λŒ€μ‹ μ— μžμ‹ μ„ ν˜ΈμΆœν•œ 곳에 λ¬Έμ œκ°€ λ°œμƒν–ˆμŒμ„ μ•Œλ €μ£Όμ–΄μ•Ό ν•œλ‹€.

     

    • μœ„ 예제λ₯Ό μˆ˜μ •ν•˜μ—¬ μ‚¬μš©

    <DynamicArray.h>

     

    <DynamicArray.cpp>

     

    <Example.cpp>

     

    ' !b ' λΌλŠ” ν‘œν˜„μ€ ' b != true ' λΌλŠ” ν‘œν˜„κ³Ό λ™μΌν•˜λ‹€.

     

    Example.cpp 의 16번째 μ€„μ—μ„œ λ°°μ—΄μ˜ 크기λ₯Ό λ„˜μ–΄μ„œλŠ” 20μ΄λΌλŠ” 인덱슀λ₯Ό λ„˜κ²¨μ£Όμ—ˆμ§€λ§Œ ν”„λ‘œκ·Έλž¨μ΄ 비정상 μ’…λ£Œν•˜λŠ” λ“±μ˜ λ¬Έμ œκ°€ μƒκΈ°μ§€λŠ” μ•Šμ•˜λ‹€.

     

    SetAt() ν•¨μˆ˜ μ•ˆμ—μ„œ 인덱슀 λΉ„κ΅ν•œ 후에 false λ₯Ό λ°˜ν™˜ν–ˆκΈ° λ•Œλ¬Έμ΄λ‹€.

     

    17번째 μ€„μ—μ„œλŠ” SetAt() ν•¨μˆ˜μ˜ λ°˜ν™˜ 값을 λΉ„κ΅ν•¨μœΌλ‘œμ¨ λ¬Έμ œκ°€ λ°œμƒν–ˆλŠ”μ§€λ₯Ό μ•Œμ•„λ‚Ό 수 μžˆλ‹€.

     

    μ—¬κΈ°μ„œ SetAt() ν•¨μˆ˜μ— 잘λͺ»λœ 인덱슀λ₯Ό λ„˜κΈ΄ 사싀은 'μ˜ˆμ™Έ 상황' 이 되고, SetAt() ν•¨μˆ˜μ—μ„œ 이λ₯Ό κ°μ§€ν•œ 후에 μ˜ˆμ™Έ 상황을 외뢀에 μ•Œλ¦¬λŠ” 과정이 'μ˜ˆμ™Έ 처리' 라고 λ³Ό 수 μžˆλ‹€.

     

    μ‹€ν–‰ κ²°κ³Ό

     

     

    🎯 λ°˜ν™˜ 값을 μ‚¬μš©ν•œ μ˜ˆμ™Έ 처리λ₯Ό λŒ€μ²΄ν•˜μž

    • try (μ‹œλ„ν•˜λ‹€) : μ˜ˆμ™Έκ°€ λ°œμƒν•˜λŠ”μ§€ κ°μ‹œν•œλ‹€.
    • throw ( λ˜μ§€λ‹€ ): μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ μ˜ˆμ™Έλ₯Ό λ˜μ§€κ³ 
    • catch ( μž‘λ‹€ ) : throw κ°€ λ˜μ§„ μ˜ˆμ™Έλ₯Ό μž‘λŠ”λ‹€.

     

    πŸ”” 예) ꡬ쑰적 μ˜ˆμ™Έ 처리 μ‚¬μš©

    • throw κ°€ μ–΄λ–€ type 을 λ˜μ§€λŠλƒμ— λ”°λΌμ„œ catch κ°€ μž‘λŠ”λ‹€.

     

    μ‹€ν–‰ κ²°κ³Ό

     

    πŸ”” 예) ꡬ쑰적 μ˜ˆμ™Έ 처리 μ‚¬μš©

    <DynamicArray.cpp>

     

    <Example.cpp>

     

    πŸ’‘ catch 블둝은 였직 ν•œ 가지 νƒ€μž…μ˜ κ°’λ§Œ 받을 수 μžˆλ‹€.

     

    • try 블둝 μ•ˆμ—μ„œ λ°œμƒν•˜λŠ” μ˜ˆμ™Έλ§Œ μ΄μ–΄μ§€λŠ” catch 블둝에 μž‘νžŒλ‹€.
      μ˜ˆμ™Έκ°€ λ˜μ Έμ§€λ©΄ DynamicArray :: SetAt() ν•¨μˆ˜λŠ” λ°”λ‘œ 싀행을 μ’…λ£Œν•œλ‹€.
    • 그리고 μ‹€ν–‰μ˜ 흐름은 UseArray() ν•¨μˆ˜μ˜ catch λΈ”λ‘μœΌλ‘œ μ΄λ™ν•œλ‹€.

     

    μ‹€ν–‰ κ²°κ³Ό

     

     

    🎯 μ˜ˆμ™Έ 객체의 μ‚¬μš©

    πŸ“Œ ν˜„μž₯μ—μ„œλ„ κΈ°λ³Έ νƒ€μž…μ˜ 값을 μ˜ˆμ™Έλ‘œ λ˜μ§€λŠ” κ²½μš°λŠ” 거의 μ—†κ³  λŒ€λΆ€λΆ„ 객체λ₯Ό λ˜μ§„λ‹€.

     

    <MyException.h>

     

    <DynamicArray.cpp>

     

    <Example.cpp>

     

    μ‹€ν–‰ κ²°κ³Ό

     

     

     

     

    728x90
    λ°˜μ‘ν˜•
μƒλ‹¨μœΌλ‘œ