C Programming Language/C++

C++ 클래슀(Class)의 μ’…λ₯˜μ™€ 좔상 클래슀(abstract classes)

567Rabbit 2024. 8. 31. 23:56

클래슀(Class)의 μ’…λ₯˜

 

1. ꡬ체 클래슀(concrete classes)  ex) std::vector, std::string λ“±

마치 λ‚΄μž₯ νƒ€μž…(int)처럼 μž‘λ™ν•¨. ꡬ체 νƒ€μž… μ •μ˜μ˜ μΌλΆ€λ‘œ λ©”λͺ¨λ¦¬ ν‘œν˜„μ΄ μ‘΄μž¬ν•¨.

μŠ€νƒμ΄λ‚˜ λ‹€λ₯Έ 객체 μ•ˆμ— μœ„μΉ˜ν•  수 있음. ν¬μΈν„°λ‚˜ μ°Έμ‘°λ₯Ό κ±°μΉ˜μ§€ μ•Šκ³  객체λ₯Ό 직접 μ°Έμ‘°ν•  수 있음.

객체λ₯Ό μ¦‰μ‹œ, 그리고 μ™„λ²½νžˆ μ΄ˆκΈ°ν™”ν•  수 있음. 객체λ₯Ό λ³΅μ‚¬ν•˜κ±°λ‚˜ 이동할 수 있음

 

 

 

2. 좔상 클래슀(abstract classes)  <- 상속을 톡해 λ§Œλ“€μ–΄μ§„λ‹€

μ‚¬μš©μžμ—κ²Œ 상세 κ΅¬ν˜„μ„ μ™„μ „νžˆ 감좀. μΈν„°νŽ˜μ΄μŠ€μ™€ λ©”λͺ¨λ¦¬ ν‘œν˜„μ„ 뢄리함.

μΆ”μƒνƒ€μž…μ„ μ§€μ—­λ³€μˆ˜λ‘œ μ‚¬μš©ν•  수 μ—†μŒ. νž™ μ˜μ—­μ— 객체λ₯Ό ν• λ‹Ήν•˜κ³  μ°Έμ‘°λ‚˜ ν¬μΈν„°λ‘œ 접근함.

 

 

 

3. 클래슀 계측ꡬ쑰 속 클래슀(Classes in class hierarchies)  <- 상속을 톡해 λ§Œλ“€μ–΄μ§„λ‹€

클래슀 계측은 νŒŒμƒμ— μ˜ν•΄ μƒμ„±λœ 격자(lattice)둜 μ •λ ¬λœ 클래슀 집합.

"μ†Œλ°©μ°¨λŠ” μΌμ’…μ˜ 트럭인 μ°¨λŸ‰μ˜ μΌμ’…μž…λ‹ˆλ‹€"와 같이 계측적 관계가 μžˆλŠ” κ°œλ…μ„ λ‚˜νƒ€λ‚΄κΈ° μœ„ν•΄ 클래슀 계측을 μ‚¬μš©ν•¨

주둜 newλ₯Ό μ΄μš©ν•΄ νž™ μ˜μ—­μ— ν• λ‹Ήν•˜κ³  포인터와 참쑰둜 μ ‘κ·Ό.

객체 μƒμ„±μ‹œμ—λŠ” μƒμ„±μžλ₯Ό μ΄μš©ν•΄ 기반 ν΄λž˜μŠ€μ—μ„œ νŒŒμƒ

클래슀 μˆœμ„œλ‘œ μƒμ„±ν•˜κ³ , μ†Œλ©Έλ  λ•ŒλŠ” κ·Έ λ°˜λŒ€μˆœμ„œλ‘œ μ†Œλ©Έν•¨

νŠΉμ • νŒŒμƒ 클래슀의 멀버 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄ dynamic_cast μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•  수 있음.

μžμ› λˆ„μˆ˜λ₯Ό ν”Όν•˜κΈ° μœ„ν•΄ 슀마트 포인트λ₯Ό μ‚¬μš©ν•¨

 

 

 

<클래슀 계측ꡬ쑰 속 클래슀의 두가지 이점>

- μΈν„°νŽ˜μ΄μŠ€ 상속 : 기반 클래슀의 객체λ₯Ό μ‚¬μš©ν•˜λŠ” κ³³ μ–΄λ””μ„œλ“  νŒŒμƒ 클래슀의 객체λ₯Ό λŒ€μ‹  μ‚¬μš©ν•  수 있음

- κ΅¬ν˜„ 상속 : 기반 ν΄λž˜μŠ€κ°€ μ œκ³΅ν•˜λŠ” ν•¨μˆ˜μ™€ 데이터 덕뢄에 νŒŒμƒ 클래슀의 κ΅¬ν˜„μ΄ λ‹¨μˆœν•΄μ§

 

 

 

 

 

좔상 클래슀(abstract classes)

 

C++ μ—…μΊμŠ€νŒ…, λ‹€ν˜•μ„±, 닀쀑 상속과 가상 상속

C++ Inheritance(상속), 상속과 μ˜€λ²„λ‘œλ”© (using ν‚€μ›Œλ“œ)Inheritance(상속) - C++μ—μ„œ μƒμ†μ˜ μš©μ–΄  base class (superclass : λΆ€λͺ¨ 클래슀)derived class (subclass : μžμ‹ 클래슀)  ex) Person이 base class 이고, studentκ°€ deriv

codebunny99.tistory.com

 

좔상 ν΄λž˜μŠ€λŠ” 객체λ₯Ό 직접 생성할 수 μ—†λŠ” ν΄λž˜μŠ€μ΄λ‹€. 즉, 좔상 ν΄λž˜μŠ€λŠ” μΈμŠ€ν„΄μŠ€ν™”(instantiation)κ°€ λΆˆκ°€λŠ₯ν•˜λ‹€. 좔상 ν΄λž˜μŠ€λŠ” 보톡 곡톡적인 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •μ˜ν•˜λŠ” 데 μ‚¬μš©λœλ‹€. 이λ₯Ό 톡해 μ—¬λŸ¬ νŒŒμƒ ν΄λž˜μŠ€λ“€μ΄ λ™μΌν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 가지도둝 ν•  수 μžˆλ‹€. <μžλ°”μ˜ μΈν„°νŽ˜μ΄μŠ€μ™€ λΉ„μŠ·ν•œ κ°œλ…μ΄λ‹€.>

 

 

 

  • 좔상 ν΄λž˜μŠ€λŠ” ν•˜λ‚˜ μ΄μƒμ˜ 순수 가상 ν•¨μˆ˜(Pure Virtual Function)λ₯Ό 포함. 순수 가상 ν•¨μˆ˜λŠ” = 0으둜 μ΄ˆκΈ°ν™”λœ 가상 ν•¨μˆ˜μ΄λ‹€. ex) virtual void draw() = 0;
  • 순수 가상 ν•¨μˆ˜λŠ” ν•΄λ‹Ή ν΄λž˜μŠ€μ—μ„œ κ΅¬ν˜„λ˜μ§€ μ•ŠμœΌλ©°, νŒŒμƒ ν΄λž˜μŠ€μ—μ„œ λ°˜λ“œμ‹œ κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€.
  • 순수 가상 ν•¨μˆ˜μ˜ λͺ©μ μ€ νŠΉμ • ν•¨μˆ˜κ°€ νŒŒμƒ ν΄λž˜μŠ€μ—μ„œ λ°˜λ“œμ‹œ κ΅¬ν˜„λ˜μ–΄μ•Ό ν•œλ‹€λŠ” 것을 κ°•μ œν•˜λŠ” 것이닀. 이λ₯Ό 톡해 상속 κ³„μΈ΅μ—μ„œ 일관성을 μœ μ§€ν•  수 μžˆλ‹€.

 

 

 

좔상 ν΄λž˜μŠ€μ™€ 순수 가상 ν•¨μˆ˜λŠ” 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ 맀우 μ€‘μš”ν•œ κ°œλ…. 좔상 클래슀λ₯Ό μ‚¬μš©ν•˜λ©΄ 상속 계측 κ΅¬μ‘°μ—μ„œ 곡톡 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •μ˜ν•  수 있으며, 순수 가상 ν•¨μˆ˜λ₯Ό 톡해 νŒŒμƒ ν΄λž˜μŠ€μ—μ„œ λ°˜λ“œμ‹œ κ΅¬ν˜„ν•΄μ•Ό ν•˜λŠ” κΈ°λŠ₯을 λͺ…ν™•νžˆ ν•  수 μžˆλ‹€. 좔상 ν΄λž˜μŠ€λŠ” 직접 μΈμŠ€ν„΄μŠ€ν™”ν•  수 μ—†μœΌλ©°, 포인터(*)λ‚˜ μ°Έμ‘°(&)λ₯Ό ν†΅ν•΄μ„œλ§Œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€λŠ” 점도 μ€‘μš”ν•˜λ‹€

 

 

 

 

좔상 ν΄λž˜μŠ€λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό 직접 생성할 수 μ—†κΈ° λ•Œλ¬Έμ—, λ‹€μŒκ³Ό 같이 좔상 클래슀 νƒ€μž…μ˜ 객체λ₯Ό 직접 μƒμ„±ν•˜λ €κ³  ν•˜λ©΄ μ—λŸ¬κ°€ λ°œμƒν•œλ‹€

Shape shape{}; //Error

ClosedShape* pClosedShape = new ClosedShape{} ; //Error

 

 

κ·ΈλŸ¬λ‚˜, 좔상 클래슀의 포인터(*)λ‚˜ μ°Έμ‘°(&)λ₯Ό 톡해 νŒŒμƒ 클래슀의 객체λ₯Ό κ°€λ¦¬ν‚€κ±°λ‚˜ μ°Έμ‘°ν•  수 μžˆλ‹€.

 

 

 

 

 

μΆ”μƒν΄λž˜μŠ€μ˜ 개방 폐쇄 원칙(Open-Closed Principle)

 

: ν΄λž˜μŠ€λŠ” ν™•μž₯μ—λŠ” μ—΄λ €μžˆκ³  λ³€κ²½μ—λŠ” λ‹«ν˜€ μžˆμ–΄μ•Ό ν•œλ‹€!

 

 

개방-폐쇄 원칙을 μ€€μˆ˜ν•˜λ©΄μ„œ 좔상 ν΄λž˜μŠ€μ™€ 순수 가상 ν•¨μˆ˜, 가상 μ†Œλ©Έμž 등을 적절히 ν™œμš©ν•˜λ©΄, μœ μ—°ν•˜κ³  ν™•μž₯ κ°€λŠ₯ν•˜λ©° μœ μ§€λ³΄μˆ˜κ°€ μ‰¬μš΄ μ‹œμŠ€ν…œμ„ 섀계할 수 μžˆλ‹€. μ΄λŸ¬ν•œ μ„€κ³„λŠ” ν”„λ‘œκ·Έλž¨μ˜ 경직성을 쀄이고, μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±μ„ 높이며, μ‹œμŠ€ν…œμ˜ 일관성과 μ•ˆμ •μ„±μ„ κ°•ν™”ν•˜λŠ” 데 κΈ°μ—¬ν•œλ‹€.

 

개방 폐쇄 원칙은 주둜 상속과 μΈν„°νŽ˜μ΄μŠ€λ₯Ό 톡해 κ΅¬ν˜„λœλ‹€. μƒμœ„ ν΄λž˜μŠ€λ‚˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 톡해 κΈ°λŠ₯을 μ •μ˜ν•˜κ³ , 이 클래슀λ₯Ό ν™•μž₯ν•˜κ±°λ‚˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜μ—¬ μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•œλ‹€.

 

- 좔상 ν΄λž˜μŠ€λŠ” μΈν„°νŽ˜μ΄μŠ€ 역할을 ν•˜λ©°, 좔상 클래슀λ₯Ό 톡해 개방-폐쇄 원칙을 κ΅¬ν˜„ν•  수 μžˆλ‹€.

- 순수 가상 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬, νŒŒμƒ ν΄λž˜μŠ€μ—μ„œ λ°˜λ“œμ‹œ μž¬μ •μ˜ν•˜λ„λ‘ κ°•μ œν•œλ‹€. 이λ₯Ό 톡해 κΈ°μ‘΄ 클래슀λ₯Ό μˆ˜μ •ν•˜μ§€ μ•Šκ³ λ„ μƒˆλ‘œμš΄ νŒŒμƒ 클래슀λ₯Ό μΆ”κ°€ν•˜μ—¬ κΈ°λŠ₯을 ν™•μž₯ν•  수 μžˆλ‹€.

 

 

 

 

좔상 클래슀의 μ•ˆμ •μ„±κ³Ό μΈν„°νŽ˜μ΄μŠ€ 섀계

 

데이터 멀버λ₯Ό 가지지 μ•ŠλŠ” 좔상 클래슀

: 좔상 ν΄λž˜μŠ€λŠ” 데이터 멀버(λ©€λ²„λ³€μˆ˜)λ₯Ό 가지지 μ•ŠλŠ” 것이 λ°”λžŒμ§ν•˜λ‹€. μ΄λŠ” 클래슀λ₯Ό 더 μ•ˆμ •μ μ΄κ³  μœ μ—°ν•˜κ²Œ λ§Œλ“€λ©°, 상속을 톡해 μ—¬λŸ¬ ν΄λž˜μŠ€μ—μ„œ μΌκ΄€λœ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•  수 있게 ν•œλ‹€

 

좔상 클래슀의 μƒμ„±μž

: 일반적으둜 좔상 ν΄λž˜μŠ€μ—λŠ” μƒμ„±μžκ°€ ν•„μš”ν•˜μ§€ μ•Šλ‹€. 좔상 ν΄λž˜μŠ€λŠ” μΈν„°νŽ˜μ΄μŠ€ μ œκ³΅μ— 쀑점을 두기 λ•Œλ¬Έμ—, 데이터λ₯Ό 가지지 μ•ŠμœΌλ©°, 데이터 μ΄ˆκΈ°ν™”κ°€ ν•„μš”ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ΄λ‹€.