πŸ’£μ€‘μš”) 가상 ν•¨μˆ˜ #1

보물창고·2022λ…„ 8μ›” 20일
0

c++ basic μ½”λ“œλˆ„λ¦¬

λͺ©λ‘ 보기
35/50

μ—…μΊμŠ€νŒ…

  • κ°œλ…
    1) 기반 객체의 ν¬μΈν„°λ‘œ νŒŒμƒ 클래슀λ₯Ό μ°Έμ‘°ν•  수 있음.
    2) 기반 객체의 참쑰둜 νŒŒμƒ 클래슀λ₯Ό μ°Έμ‘°ν•  수 있음.

  • κ°’λ°Έλ₯˜ ν˜•νƒœλ‘œ ν•˜λ©΄??
    : 이 λ•ŒλŠ” λ©”λͺ¨λ¦¬ ꡬ쑰만 바라보고 ν•˜λŠ” 것이기 λ•Œλ¬Έμ— 볡사 손싀 λ°œμƒν•œλ‹€.

  • μ—…μΊμŠ€νŒ…μ—μ„œ λ‹€ν–₯μ„± μ μš©ν•˜λŠ” 방법.
    : 기반 ν¬λž˜μŠ€μ—μ„œμ˜ virtual μ„ μ–Έ.
    -> 동적바인딩에 μ˜ν•΄ 포인터λ₯Ό μ‹€ν˜•μ‹μœΌλ‘œ μ•”μ‹œμ  ν˜•λ³€ν™˜ν•¨.

  • μ™œ 이것이 κ°€λŠ₯ν•œ 것인가?
    : 기반 ν΄λž˜μŠ€μ™€ νŒŒμƒ 클래슀의 λ©”λͺ¨λ¦¬ ꡬ쑰 λ•Œλ¬Έμž„.
    -> νŒŒμƒμ΄λŠ” 기반이의 λ©”λͺ¨λ¦¬ κ΅¬μ‘°μ—μ„œ μƒˆλ‘œμš΄ 데이터가 μΆ”κ°€λœ ν˜•νƒœ.
    --> κ·Έλž˜μ„œ 기반이둜 νŒŒμƒμ„ μ°Έμ‘°ν•  수 있음.

    • ν•˜μ§€λ§Œ λ°˜λŒ€λ‘œ νŒŒμƒμ΄ = κΈ°λ°˜μ€ λΆˆκ°€ν•˜λ‹€.

νŠΉμ§•

  • μ—…μΊμŠ€νŒ…μœΌλ‘œ 기반 클래슀의 λ©€λ²„λŠ” μ ‘κ·Όν•  수 있음.
    but νŒŒμƒν΄λž˜μŠ€μ—μ„œ μƒˆλ‘­κ²Œ μΆ”κ°€ν•œ λ©€λ²„λŠ” μ ‘κ·Όν•  수 μ—†μŒ.
    -> νŒŒμƒν΄λž˜μŠ€λ§Œ μ†ν•œ 데이터이고, κΈ°λ°˜μ—λŠ” 정보가 μ—†κΈ° λ•Œλ¬Έμž„.

    • virtual 선언을 ν†΅ν•΄μ„œ μ°Έμ‘°ν•˜λŠ” νƒ€μž…μ„ μ‹€ν˜•μ‹μœΌλ‘œ μ •ν•΄μ‘Œλ‹€κ³ λŠ” ν•˜μ§€λ§Œ, κ°μ²΄λŠ” 어쨋든 parent 둜 λ˜μ–΄μžˆλ‹€.
      : parent
      μž…μž₯μ—μ„œ 접근을 ν•΄μ•Ό ν•˜λŠ”λ°, parent λ©”λͺ¨λ¦¬ κ΅¬μ‘°μ—λŠ” νŒŒμƒν΄λž˜μŠ€ λ©”λͺ¨λ¦¬ 정보가 μ—†κΈ° λ•Œλ¬Έμ— λ‹Ήμ—°νžˆ 접근이 λΆˆκ°€ν•˜λ‹€.
  • λ§Œμ•½ μœ„μ˜ κ·Έλ¦Όμ—μ„œ λ¬Έμ œκ°€ μ—†λ‹€κ³  ν•œλ‹€λ©΄, childA , childB μ—μ„œ μƒˆλ‘œμš΄ 데이터가 μΆ”κ°€λœλ‹€κ³  ν•˜λ©΄ pμ—μ„œ λͺ¨λ‘ 접근이 κ°€λŠ₯ν•œ μƒνƒœμΈλ°
    ꡉμž₯히 λ¬΄λΆ„λ³„ν•˜μ§€ μ•Šμ„κΉŒ?, μ–΄λ–»κ²Œ 컴파일 λ‹¨κ³„μ—μ„œ pκ°€ λͺ¨λ“  νŒŒμƒν΄λž˜μŠ€μ˜ 데이터λ₯Ό μ•Œμˆ˜ μžˆμ„κΉŒ?

κ²°λ‘ 
: μ—…μΊμŠ€νŒ…μ„ ν•˜λ”λΌλ„ virtual을 톡해 μ‹€ν˜•μ‹μ„ λ§Œλ“€μ—ˆλ‹€κ³  ν•˜λ”λΌλ„, νŒŒμƒν΄λž˜μŠ€λ§Œμ˜ 멀버 λ°μ΄ν„°λŠ” μ ‘κ·Όν•  수 μ—†λ‹€.

  • νŒŒμƒ ν΄λž˜μŠ€μ—μ„œ μΆ”κ°€ν•œ 멀버에 μ ‘κ·Όν•˜κΈ° μœ„ν•΄μ„œλŠ”
    ν˜•λ³€ν™˜μ„ 해야함. : λ‹€μš΄μΊμŠ€νŒ….

μ‹€ν˜•μ‹ κ³Ό 객체 νƒ€μž…μ„ ν™•μΈν•΄λ³΄μž.

1) virtual μ„ μ–Έ 없을 경우.
: μ•„λž˜ μ½”λ“œλ₯Ό 보면, p의 νƒ€μž…μ€ parent * , 이고 μ°Έμ‘°ν•˜λŠ” 클래슀의 νƒ€μž…μ΄ parent λΌλŠ” 것을 확인할 수 μžˆλ‹€.

2) virtual μ„ μ–Έ μžˆμ„ 경우.
: μ•„λž˜ μ½”λ“œλ₯Ό 보면, p의 νƒ€μž…μ€ parent* , 이고 μ°Έμ‘°ν•˜λŠ” 클래슀의 νƒ€μž„μ΄
νŒŒμƒμΈ childλΌλŠ” 것을 확인 ν• μˆ˜ μžˆλ‹€.

정리.

κ²°λ‘ 
ν¬μΈν„°λ‘œ μ—…μΊμŠ€νŒ…μ„ ν•˜λ”λΌλ„ virtual μ„ μ–Έ μœ λ¬΄μ— λ”°λΌμ„œ μ‹€ν˜•μ‹ μ°Έμ‘° μ—¬λΆ€κ°€ λ‹€λ₯΄λ‹€.

ν™œμš©

: μ—…μΊμŠ€νŒ…μ„ μ΄μš©ν•΄ , λ‹€λ₯΄κ²Œ νŒŒμƒλœ λͺ¨λ“  클래슀λ₯Ό μ°Έμ‘° ν• μˆ˜ 있음.

problem

: Animal ν΄λž˜μŠ€μ™€ Dog , Cat 클래슀λ₯Ό λ§Œλ“€μ–΄λΌ.

  • λ²‘ν„°λ‘œ μ„ μ–Έν›„, μ‚½μž…ν•˜λΌ.

μ˜€λ²„λΌμ΄λ”© , ν•¨μˆ˜ μž¬μ •μ˜

: 기반클래슀의 ν•¨μˆ˜λ₯Ό νŒŒμƒ ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜ν•  수 있음.

problem

: Shout ν•¨μˆ˜λ₯Ό 기반과 νŒŒμƒμ—μ„œ μ˜€λ²„λΌμ΄λ”© λ§Œλ“€κ³ , ν˜ΈμΆœν•΄λ³΄μž.

κ°€) μ—…μΊμŠ€νŒ… ν•œ 후에 μ˜€λ²„λΌμ΄λ”© ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λΌ.

-> μž¬μ •μ˜ ν–ˆμ§€λ§Œ, Animal 객체의 Shoutκ°€ 호좜됨.
: 즉 μ°Έμ‘°ν•˜κ³  μžˆλŠ” ν΄λž˜μŠ€λŠ” Dog 와 Cat 이 μ•„λ‹ˆλΌ Animal μ΄λΌλŠ” 것을 μ˜λ―Έν•œλ‹€.

λ‚˜) νŒŒμƒ 객체만 생성 후에 μ˜€λ²„λΌμ΄λ”© ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λΌ.

-> μ™ˆμ™ˆμ΄ 좜λ ₯됨을 확인함.

  • μ™œ 그럴까???
    : λ‹€ν˜•μ„±μ„ μ œκ³΅ν•¨μœΌλ‘œμ¨, μ°Έμ‘° 클래슀λ₯Ό λ³€κ²½ν•΄μ•Ό ν•œλ‹€.

ν•¨μˆ˜ 바인딩

https://online-unreal.tistory.com/77

πŸ’£λ°”μΈλ”©μ΄λž€?

: 데이터 ν˜•μ˜ νƒ€μž…μ„ κ²°μ •ν•˜λŠ” 것을 말함.

1) 정적 바인딩 : 컴파일 μ‹œμ— νƒ€μž…μ„ 결정함.

  • 포인터 νƒ€μž…μœΌλ‘œ 결정함.

2) 동적 바인딩 : μ‹€ν–‰μ‹œκ°„μ— νƒ€μž…μ„ 결정함.

  • μ‹€μ œ 클래슀 νƒ€μž…μœΌλ‘œ 결정함.

κ°œλ…

: ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ μ‹€μ œ μ–΄λ–€ ν•¨μˆ˜λ₯Ό μ—°κ²°ν•  것이냐λ₯Ό 말함.

νŠΉμ§•. : μ•„λž˜λŠ” κ°œλ…μ΄λ‹€ μ™Έμš°κ³  κ°€μž.

: c++은 기본적으둜 정적 바인딩을 λ””ν΄νŠΈκ°’μœΌλ‘œ μ‚¬μš©ν•¨.

  • 컴파일 ν•  λ•Œ ν•¨μˆ˜ ν˜ΈμΆœμ„ 결정함.
    • 컴파일 μ‹œμ— ν• λ‹Ήν•œ νƒ€μž…μ΄ μ•„λ‹Œ 포인터 ν˜•νƒœμ˜ νƒ€μž…μ„ μ‹€μ œ νƒ€μž…μœΌλ‘œ λ°›μ•„λ“€μž„.
    • 예제 μ½”λ“œ
      : μž…λ ₯λ˜λŠ” 값에 λ”°λΌμ„œ, 즉 μ‹€ν–‰ μ‹œκ°„μ— νƒ€μž…μ΄ 결정됨 .
      -> μ΄λ•Œ pλŠ” Shape νƒ€μž…μž„.

κ²°λ‘ 

- virtual둜 κ°€μƒμ†Œλ©Έμž μž‘μ„±ν•΄λ„ νƒ€μž…μ€ baseType을 κ·ΈλŒ€λ‘œ 가지고 κ°„λ‹€.

  • -> 잘λͺ»λ¨,

: virtual tableμ—μ„œ μ°Έμ‘°ν•  μ˜€λ²„λΌμ΄λ”© ν•¨μˆ˜κ°€ νŒŒμƒν΄λž˜μŠ€μ˜ ν•¨μˆ˜ ν¬μΈν„°λ‘œ κ²°μ •(λ³€κ²½) λ˜λŠ” 것이닀.
-> μ•„λž˜ μ˜ˆμ œλŠ” typeid 의 인수λ₯Ό 잘λͺ» μž‘μ„±ν–ˆλ‹€.
: 맨 μœ„μ—μ„œ νƒ€μž…ν™•μΈν•˜λŠ” 그림을 보자. 240731 μ•„λ‹ˆλ©΄ λ°”λ‘œ 밑에 μžˆλ‹€.

  • μ΄λ ‡κ²Œ λ³€κ²½ν•΄μ•Όλ§Œ 객체 νƒ€μž…μ„ μ•Œμˆ˜ μžˆλ‹€. 240428
    : virtual ν‚€μ›Œλ“œμ— μ˜ν•΄μ„œ 동적바인딩 μ²˜λ¦¬λ˜λŠ” 것을 확인할 수 μžˆλ‹€.

  • virtual ν‚€μ›Œλ“œλ₯Ό λΉΌλ©΄ μ–΄λ–»κ²Œ 될까?
    : μœ„μ—μ„œ λ§ν•œ c++의 κΈ°λ³Έ 바인딩인 정적바인딩이 μ μš©λ˜μ–΄μ„œ 포인터 νƒ€μž…μœΌλ‘œ κ²°μ •λ˜λŠ” 것을 확인할 수 μžˆλ‹€.

예제
Animal *a = new Dog;
ν•  경우, 컴파일 μ‹œμ— aλŠ” Dog둜 동적할당 ν–ˆμ§€λ§Œ,
μ»΄νŒŒμΌλŸ¬κ°€ λ°›μ•„λ“€μ΄κΈ°μ—λŠ” Animal νƒ€μž…μœΌλ‘œ μΈμ§€ν•˜κ²Œ 됨.
λ”°λΌμ„œ a->Shout()λ₯Ό ν•˜κ²Œ 되면, Animal::Shout λ₯Ό ν˜ΈμΆœν•˜κ²Œ 됨.

μœ„μ˜ μ˜ˆμ œμ—μ„œ Dog::Shoutλ₯Ό ν•˜κ²Œ ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ‹€ν–‰μ‹œκ°„μ—
νƒ€μž…μ„ κ²°μ •ν•˜κ²Œ ν•΄μ•Ό 함!

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

: 객체λ₯Ό 동적바인딩 ν•¨μœΌλ‘œμ¨ μ‹€ν˜•μ‹ νƒ€μž…μœΌλ‘œ 결정함., μ‹€ν–‰μ‹œκ°„μ— λ©”λͺ¨λ¦¬λ₯Ό μ‘°μ‚¬ν•΄μ„œ ν•¨μˆ˜ ν˜ΈμΆœμ„ 결정함.

  • virtual μ„ μ–Έ μ‹œ , μ‹€ν–‰μ‹œκ°„μ— 기반, νŒŒμƒν΄λž˜μŠ€μ˜ μƒμ„±μž μ§„μž… ꡬ간에
    κ°€μƒν•¨μˆ˜ 포인터가 κ°€μƒν•¨μˆ˜ ν…Œμ΄λΈ”μ— λ§μ”Œμ›Œμ§.

problem

: κ°€μƒν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄μ„œ , Dog::shoutκ°€ 호좜되게 ν•˜μ—¬λΌ.

  • 문제
    animal, Dog, Cat 을 λ§Œλ“€κ³ ,
    기반 포인터 객체에 λ‹€ λ‹΄μ•„μ„œ ν•œλ²ˆμ— Shoutν•΄μ„œ
    Dog, cat의 shout각각 호좜되게 ν•˜λΌ.


-> μ™ˆμ™ˆ κ³Ό μ•Όμ˜Ήμ΄ ν˜ΈμΆœλ¨μ„ 확인함.

λ‹€ν˜•μ„±

: λ™μΌν•œ μ½”λ“œμ˜ λ™μž‘μ΄ 상황에 따라 λ‹€λ₯΄κ²Œ λ™μž‘ν•˜λŠ” 것을 말함.

  • virtual : λ‹€ν˜•μ„±μ„ ν•˜κ²Œ ν•˜λŠ” ν‚€μ›Œλ“œ

κ°œλ°©νμ‡„μ˜ 법칙

λ””μžμΈ νŒ¨ν„΄μ—μ„œ 자주 μ‚¬μš©λ˜λŠ” κΈ°λ³Έ κ°œλ…
: λ³€κ²½ν•˜λŠ” 것은 λ‹€ν˜•μ„±μœΌλ‘œ ν•˜κ³ , λ³€κ²½λ˜μ§€ μ•ŠλŠ” 것은 κ·ΈλŒ€λ‘œ λ‘ .

profile
πŸ”₯πŸ”₯πŸ”₯

0개의 λŒ“κΈ€