hugDog
Android DevLog
hugDog
전체 방문자
였늘
μ–΄μ œ
  • πŸ™Œ Hello? (162)
    • πŸ§©μ•ˆλ“œλ‘œμ΄λ“œ (12)
      • κ°œλ… 정리 (5)
      • 버그 ν•΄κ²° (4)
      • 기타 (3)
    • πŸ”μ•Œκ³ λ¦¬μ¦˜ (54)
      • κ°œλ… (0)
      • λ°±μ€€ (48)
      • ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ (6)
    • πŸ“„κ°œλ°œ 일지 (0)
      • FINPO (0)
    • πŸ”€ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄ (71)
      • C++ 정리 (49)
      • C++κΈ°μ΄ˆν”ŒλŸ¬μŠ€ μ—°μŠ΅λ¬Έμ œ (20)
      • Kotlin (2)
    • ⭐Project (1)
    • 🚴TIL (13)
      • Clean Code (13)
    • πŸš©κΈ°νƒ€ (9)
      • λͺ©ν‘œ (6)
      • 일상 (3)
      • λ¬Έμ„œ (0)

인기 κΈ€

졜근 λŒ“κΈ€

졜근 κΈ€

ν‹°μŠ€ν† λ¦¬

hELLO Β· Designed By μ •μƒμš°.
hugDog

Android DevLog

πŸ”€ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄/C++ 정리

C++ 정리 - 36 (클래슀 섀계 볡슡, 클래슀 λ©”μ„œλ“œμ— κ΄€λ ¨λœ κ·Έ λ°–μ˜ κ³ λ € 사항, 객체 리턴과 μ°Έμ‘° 리턴, public 상속에 κ΄€λ ¨λœ κ·Έ λ°–μ˜ 고렀사항)

2020. 11. 16. 18:49
728x90

클래슀 섀계 볡슡

 

μ»΄νŒŒμΌλŸ¬κ°€ μžλ™μœΌλ‘œ μƒμ„±ν•˜λŠ” 멀버 ν•¨μˆ˜λ“€

 

-λ””ν΄νŠΈ μƒμ„±μž

λ””ν΄νŠΈ μƒμ„±μžλŠ” 맀개 λ³€μˆ˜λ₯Ό μ „ν˜€ μ‚¬μš©ν•˜μ§€ μ•Šκ±°λ‚˜, λͺ¨λ“  맀개 λ³€μˆ˜κ°€ λ””ν΄νŠΈ λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” μƒμ„±μžμ΄λ‹€. μ‚¬μš©μžκ°€ μƒμ„±μžλ₯Ό ν•˜λ‚˜λ„ μ •μ˜ν•˜μ§€ μ•ŠμœΌλ©΄, μ‚¬μš©μžλ₯Ό λŒ€μ‹ ν•˜μ—¬ μ»΄νŒŒμΌλŸ¬κ°€ λ””ν΄νŠΈ μƒμ„±μžλ₯Ό μ •μ˜ν•œλ‹€.

 

멀버 초기자 리슀트λ₯Ό μ‚¬μš©ν•˜μ—¬ 기초 클래슀 μƒμ„±μžλ₯Ό λͺ…μ‹œμ μœΌλ‘œ ν˜ΈμΆœν•˜μ§€ μ•Šκ³  νŒŒμƒ 클래슀 μƒμ„±μžλ₯Ό μž‘μ„±ν•˜λ©΄, μ»΄νŒŒμΌλŸ¬λŠ” μƒˆ 객체의 기초 클래슀 뢀뢄을 μƒμ„±ν•˜κΈ° μœ„ν•˜μ—¬ 기초 클래슀 λ””ν΄νŠΈ μƒμ„±μžλ₯Ό μ‚¬μš©ν•œλ‹€.

 

μ–΄λ–€ μ’…λ₯˜ 이든 간에  μ‚¬μš©μžκ°€ μƒμ„±μžλ₯Ό μ •μ˜ν•˜λ©΄, μ»΄νŒŒμΌλŸ¬λŠ” λ””ν΄νŠΈ μƒμ„±μžλ₯Ό μ •μ˜ν•˜μ§€ μ•ŠλŠ”λ‹€. μ΄λŸ¬ν•œ 경우, ν•„μš”ν•œ λ””ν΄νŠΈ μƒμ„±μžλ₯Ό μ œκ³΅ν•˜λŠ” 것은 ν”„λ‘œκ·Έλž˜λ¨Έμ˜ μ±…μž„μ΄λ‹€.

 

-볡사 μƒμ„±μž

μ–΄λ–€ 클래슀λ₯Ό μœ„ν•œ 볡사 μƒμ„±μžλŠ”, κ·Έ ν΄λž˜μŠ€ν˜•μ˜ 객체λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ μ‚¬μš©ν•˜λŠ” μƒμ„±μžμ΄λ‹€. 같이 μ„ μ–Έλœ 맀개 λ³€μˆ˜λŠ” κ·Έ ν΄λž˜μŠ€ν˜•μ— λŒ€ν•œ const 참쑰이닀. 예λ₯Ό λ“€μ–΄ star 클래슀의 볡사 μƒμ„±μžλŠ” λ‹€μŒκ³Ό 같은 μ›ν˜•μ„ κ°€μ§„λ‹€.

star(const star &);

 

볡사 μƒμ„±μžλŠ” λ‹€μŒκ³Ό 같은 μƒν™©μ—μ„œ μ‚¬μš©λœλ‹€.

  • μƒˆ 객체λ₯Ό λ™μΌν•œ 클래슀의 λ‹€λ₯Έ 객체둜 μ΄ˆκΈ°ν™” ν• λ•Œ
  • 객체가 ν•¨μˆ˜μ˜ κ°’μœΌλ‘œ 전달될 λ•Œ
  • ν•¨μˆ˜κ°€ 객체λ₯Ό κ°’μœΌλ‘œ 리턴할 λ•Œ
  • μ»΄νŒŒμΌλŸ¬κ°€ μž„μ‹œ 객체λ₯Ό 생성할 λ•Œ

ν”„λ‘œκ·Έλž¨μ΄ 볡사 μƒμ„±μžλ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ©΄, μ»΄νŒŒμΌλŸ¬λŠ” ν•¨μˆ˜ μ •μ˜κ°€ μ•„λ‹ˆλΌ μ›ν˜•λ§Œ μ œκ³΅ν•œλ‹€. κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄, ν”„λ‘œκ·Έλž¨μ€ 멀버별 μ΄ˆκΈ°ν™”λ₯Ό μˆ˜ν–‰ν•˜λŠ” 볡사 μƒμ„±μžλ₯Ό μ •μ˜ν•œλ‹€. λ§Œμ•½ μ–΄λ–€ 멀버가 κ·Έ 자체둜 클래슀 객체일 경우, 멀버 κ°„ μ΄ˆκΈ°ν™”λŠ” ν•΄λ‹Ή ν΄λž˜μŠ€μ— μ •μ˜λœ 볡사 μƒμ„±μžλ₯Ό μ‚¬μš©ν•œλ‹€.

 

new에 μ˜ν•΄ μ΄ˆκΈ°ν™”λ˜λŠ” 멀버 포인터듀은, κΉŠμ€ 볡사λ₯Ό μš”κ΅¬ν•œλ‹€. λ˜λŠ” 변경이 이루어져야 ν•˜λŠ” static λ³€μˆ˜λ₯Ό μ‚¬μš©ν•  λ•Œκ°€ μžˆλ‹€. μ΄λŸ¬ν•œ 경우 μ‚¬μš©μžκ°€ 볡사 μƒμ„±μžλ₯Ό 직접 μ •μ˜ν•΄μ•Ό 함.

 

λŒ€μž… μ—°μ‚°μž

λ””ν΄νŠΈ λŒ€μž… μ—°μ‚°μžλŠ” μ–΄λ–€ 객체λ₯Ό λ™μΌν•œ 클래슀의 λ‹€λ₯Έ 객체에 λŒ€μž…ν•˜λŠ” 것을 μ²˜λ¦¬ν•œλ‹€.

λ””ν΄νŠΈ λŒ€μž…μ€ 멀버 κ°„ λŒ€μž…μ„ μ‚¬μš©ν•œλ‹€. μ–΄λ–€ 멀버가 클래슀 객체일 경우, λ””ν΄νŠΈ 멀버간 λŒ€μž…μ€ ν•΄λ‹Ή ν΄λž˜μŠ€μ— μ •μ˜λœ λŒ€μž… μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•œλ‹€.

 

star 클래슀의 λŒ€μž… μ—°μ‚°μžμ˜ μ›ν˜•μ€ λ‹€μŒκ³Ό κ°™λ‹€.

star &star::operator=(const star &);

 

μ»΄νŒŒμΌλŸ¬λŠ” ν•˜λ‚˜μ˜ λ°μ΄ν„°ν˜•μ„ λ‹€λ₯Έ λ°μ΄ν„°ν˜•μ— λŒ€μž…ν•˜λŠ” λŒ€μž… μ—°μ‚°μžλŠ” μƒμ„±ν•˜μ§€ μ•ŠλŠ”λ‹€.

λ¬Έμžμ—΄μ„ star 객체에 λŒ€μž…ν•˜κ³  μ‹Άλ‹€λ©΄, 첫 번째 μ ‘κ·Ό 방식은 κ·ΈλŸ¬ν•œ μ—°μ‚°μžλ₯Ό λͺ…μ‹œμ μœΌλ‘œ μ •μ˜ν•˜λŠ” 것이닀. 

star &star::operator=(const char *){...}

두 번째 μ ‘κ·Ό 방식은 λ¬Έμžμ—΄μ„ star 객체둜 λ³€ν™˜ν•˜λŠ” λ³€ν™˜ ν•¨μˆ˜μ™€, starλ₯Ό star에 λŒ€μž…ν•˜λŠ” λŒ€μž… μ—°μ‚°μž ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 것이닀.

 

클래슀 λ©”μ„œλ“œμ— κ΄€λ ¨λœ κ·Έ λ°–μ˜ κ³ λ € 사항

-μƒμ„±μž κ΄€λ ¨ 사항

μƒμ„±μžλ“€μ€ μƒˆλ‘œμš΄ 객체λ₯Ό μƒμ„±ν•œλ‹€.

 

-파괴자 κ΄€λ ¨ 사항

클래슀 μƒμ„±μžμ—μ„œ new에 μ˜ν•΄ λŒ€μž…λ˜λŠ” λ©”λͺ¨λ¦¬λ₯Ό ν•΄μ œν•˜κ³ , 클래슀 객체의 νŒŒκ΄΄μ— λ”°λ₯΄λŠ” 정리 μž‘μ—…μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄, λͺ…μ‹œμ  파괴자λ₯Ό λ°˜λ“œμ‹œ μ •μ˜ν•΄μ•Ό 함. 클래슀λ₯Ό 기초 클래슀둜 μ‚¬μš©ν•  μ˜ˆμ •μ΄λΌλ©΄, 가상 파괴자λ₯Ό μ œκ³΅ν•΄μ•Ό ν•œλ‹€.

 

-λ³€ν™˜ κ΄€λ ¨ 사항

μ •ν™•νžˆ ν•˜λ‚˜μ˜ λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ ν˜ΈμΆœν•  수 μžˆλŠ” μƒμ„±μžλŠ”, κ·Έ 맀개 λ³€μˆ˜μ˜ λ°μ΄ν„°ν˜•μ„ ν΄λž˜μŠ€ν˜•μœΌλ‘œ λ³€ν™˜ν•˜λŠ” 것을 μ •μ˜ν•œλ‹€.

Star(const char *); //const char *λ₯Ό star둜 λ³€ν™˜ν•œλ‹€.

Star(const Spectral &,int members = 1); //Spectral을 star둜 λ³€ν™˜ν•œλ‹€.

 

예λ₯Ό λ“€μ–΄, 클래슀 맀개 λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λ„λ‘ μ •μ˜λœ ν•¨μˆ˜μ— λ³€ν™˜ν•  수 μžˆλŠ” λ°μ΄ν„°ν˜•μ΄ μ „λ‹¬λ˜μ—ˆμ„ λ•Œ, λ³€ν™˜ μƒμ„±μžκ°€ μ‚¬μš©λ¨.

 

Star north;

north = "polaris";

star::star(const char *)λ₯Ό μ‚¬μš©ν•˜μ—¬ star 객체λ₯Ό μƒμ„±ν•˜κ³ , μƒμ„±λœ star 객체λ₯Ό 맀개 λ³€μˆ˜λ‘œ μ‚¬μš©ν•˜μ—¬ star::operator=(const star &) ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œλ‹€.

 

ν•˜λ‚˜μ˜ λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” μƒμ„±μžμ˜ μ›ν˜•μ— explicitλ₯Ό μ‚¬μš©ν•˜λ©΄, μ•”μ‹œμ  λ³€ν™˜μ„ μ‚¬μš©ν•  수 μ—†κ²Œ λœλ‹€.

 

클래슀 객체λ₯Ό λ‹€λ₯Έ λ°μ΄ν„°ν˜•μœΌλ‘œ λ³€ν™˜ν•˜λ €λ©΄, λ³€ν™˜ ν•¨μˆ˜λ₯Ό μ •μ˜ν•΄μ•Ό ν•œλ‹€. λ³€ν™˜ ν•¨μˆ˜λŠ” 맀개 λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³ , λ³€ν™˜ κ²°κ³Ό λ°μ΄ν„°ν˜•μ˜ 이름을 λ¦¬ν„΄ν˜•μœΌλ‘œ μ„ μ–Έν•˜μ§€ μ•ŠλŠ” 클래슀 멀버 ν•¨μˆ˜μ΄λ‹€. λ¦¬ν„΄ν˜•μ„ μ„ μ–Έν•˜μ§€ μ•ŠλŠ”λ°λ„, μ›ν•˜λŠ” λ³€ν™˜ 값을 리턴해야 ν•œλ‹€.

star::star double() const{...} //starλ₯Ό double둜 λ³€ν™˜

star::star const char *() const {...} //starλ₯Ό const char* 둜 λ³€ν™˜

c++11은 λ³€ν™˜ ν•¨μˆ˜μ™€ ν•¨κ»˜ explicit ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” μ˜΅μ…˜μ„ μ œκ³΅ν•œλ‹€.

 

-κ°’μœΌλ‘œ 전달과 참쑰둜 전달

일반적으둜, 객체λ₯Ό 맀개 λ³€μˆ˜λ‘œ μ‚¬μš©ν•˜λŠ” ν•¨μˆ˜λ₯Ό μž‘μ„±ν•˜λ €λ©΄, κ·Έ 객체λ₯Ό 참쑰둜 전달해야 ν•œλ‹€. κ·Έ 이유 쀑 ν•˜λ‚˜λŠ” νš¨μœ¨μ„± λ•Œλ¬Έμ΄λ‹€. 또 λ‹€λ₯Έ μ΄μœ λŠ” 가상 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” μƒμ†μ˜ 경우, 기초 클래슀 μ°Έμ‘° 맀개 λ³€μˆ˜λ₯Ό 받아듀이도둝 μ •μ˜λœ ν•¨μˆ˜λŠ”, νŒŒμƒ ν΄λž˜μŠ€μ— λŒ€ν•΄μ„œλ„ μ„±κ³΅μ μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.

 

객체 리턴과 μ°Έμ‘° 리턴

객체λ₯Ό 직접 λ¦¬ν„΄ν•˜λŠ” 것과 μ°Έμ‘°λ₯Ό λ¦¬ν„΄ν•˜λŠ” κ²ƒμ˜ μ°¨μ΄λŠ” ν•¨μˆ˜ μ›ν˜•κ³Ό ν•¨μˆ˜ 머리에 λ‚˜νƒ€λ‚œλ‹€.

star nova1(const star &);

star &nova2(const star &);

 

객체가 μ•„λ‹Œ μ°Έμ‘°λ₯Ό 리턴해야 ν•˜λŠ” μ΄μœ λŠ”, μ°Έμ‘°λ₯Ό λ¦¬ν„΄ν•˜λ©΄ μ‹œκ°„κ³Ό λ©”λͺ¨λ¦¬κ°€ μ ˆμ•½λ˜κΈ° λ•Œλ¬Έ. κ·ΈλŸ¬λ‚˜ μ°Έμ‘°λ₯Ό λ¦¬ν„΄ν•˜λŠ” 것이 항상 κ°€λŠ₯ν•œ 것은 μ•„λ‹ˆλ‹€. ν•¨μˆ˜λŠ” κ·Έ ν•¨μˆ˜ μ•ˆμ—μ„œ μƒμ„±λœ μž„μ‹œ 객체에 λŒ€ν•œ μ°Έμ‘°λ₯Ό λ¦¬ν„΄ν•˜λ©΄ μ•ˆ λœλ‹€. μ°Έμ‘°λ‚˜ 포인터λ₯Ό 톡해 μ „λ‹¬λœ 객체λ₯Ό ν•¨μˆ˜κ°€ λ¦¬ν„΄ν•œλ‹€λ©΄, κ·Έ 객체λ₯Ό 참쑰둜 리턴해야 ν•œλ‹€. 

const Stock &Stock::topval(const Stock &s) const
{
	if(s.total_val > total_val)
    	return s;
    else
    	return *this;
}

 

-const 의 μ‚¬μš©

λ©”μ„œλ“œκ°€ 맀개 λ³€μˆ˜λ₯Ό λ³€κ²½ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 확신이 μžˆμ„ λ•Œ μ‚¬μš© κ°€λŠ₯

star::star(const char *s) {...}

λ©”μ„œλ“œκ°€ 그것을 ν˜ΈμΆœν•œ 객체λ₯Ό λ³€κ²½ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 확신이 μžˆμ„ λ•Œ const μ‚¬μš©

void star::show() const{...}

 

public 상속에 κ΄€λ ¨λœ κ·Έ λ°–μ˜ 고렀사항

- is-a 관계

μ˜ˆμƒν•˜λŠ” νŒŒμƒ ν΄λž˜μŠ€κ°€ 기초 클래슀의 νŠΉλ³„ν•œ μ’…λ₯˜κ°€ μ•„λ‹ˆλ©΄ public νŒŒμƒμ„ μ‚¬μš©ν•˜λ©΄ μ•ˆ λœλ‹€.

순수 가상 ν•¨μˆ˜λ₯Ό κ°€μ§€κ³  μžˆλŠ” 좔상화 기초 클래슀λ₯Ό μƒμ„±ν•˜κ³ , λ‹€λ₯Έ 클래슀λ₯Ό νŒŒμƒμ‹œν‚€λŠ” 것이 μ΅œμ„ μ˜ 방법일 수 μžˆλ‹€.

 

λͺ…μ‹œμ  λ°μ΄ν„°ν˜• λ³€ν™˜ 없이 기초 클래슀 포인터가 νŒŒμƒ 클래슀 객체λ₯Ό μ§€μ‹œν•  수 있고, 기초 클래슀 μ°Έμ‘°κ°€ νŒŒμƒ 클래슀 객체λ₯Ό μ°Έμ‘°ν•  수 μžˆλ‹€λŠ” 것이 is-a κ΄€κ³„μ˜ ν•œ νŠΉμ„±μ΄λ‹€. κ·Έ 역은 μ„±λ¦½ν•˜μ§€ μ•ŠλŠ”λ‹€.

 

-μƒμ†λ˜μ§€ μ•ŠλŠ” 것

μƒμ„±μžλŠ” μƒμ†λ˜μ§€ μ•ŠλŠ”λ‹€. 일반적으둜 νŒŒμƒ 클래슀 μƒμ„±μžλŠ” νŒŒμƒ 클래슀 객체의 기초 클래슀 뢀뢄을 μƒμ„±ν•˜κΈ° μœ„ν•΄, 멀버 초기자 리슀트 문법을 μ‚¬μš©ν•˜μ—¬ 기초 클래슀 μƒμ„±μžλ₯Ό ν˜ΈμΆœν•œλ‹€.

 

νŒŒκ΄΄μžλŠ” μƒμ†λ˜μ§€ μ•ŠλŠ”λ‹€. κ·ΈλŸ¬λ‚˜ μ–΄λ–€ 객체가 파괴될 λ•Œ, ν”„λ‘œκ·Έλž¨μ€ λ¨Όμ € νŒŒμƒ 파괴자λ₯Ό ν˜ΈμΆœν•˜κ³  λ‚˜μ„œ 기초 파괴자λ₯Ό ν˜ΈμΆœν•œλ‹€. 일반적으둜, μ–΄λ–€ ν΄λž˜μŠ€κ°€ 기초 클래슀의 역할을 ν•œλ‹€λ©΄, κ·Έ νŒŒκ΄΄μžλŠ” 가상 이어야 ν•œλ‹€.

 

λŒ€μž… μ—°μ‚°μžλŠ” μƒμ†λ˜μ§€ μ•ŠλŠ”λ‹€.

728x90
μ €μž‘μžν‘œμ‹œ λΉ„μ˜λ¦¬ (μƒˆμ°½μ—΄λ¦Ό)
    'πŸ”€ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄/C++ 정리' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • C++ 정리 - 38 (valarray 클래슀: 훑어보기, μ΄ˆκΈ°ν™” μˆœμ„œ, private 상속, 기초 클래슀 λ©”μ„œλ“œμ— μ ‘κ·Όν•˜κΈ°, 기초 클래슀 객체에 μ ‘κ·Όν•˜κΈ°, 기초 클래슀 ν”„λ Œλ“œμ— μ ‘κ·Όν•˜κΈ°, μ»¨ν…ŒμΈλ¨ΌνŠΈμ™€ private 상속)
    • C++ 정리 - 37 (λŒ€μž… μ—°μ‚°μž κ΄€λ ¨ 사항, private 멀버와 protected 멀버, 가상 λ©”μ„œλ“œ, ν”„λ Œλ“œ κ΄€λ ¨ 사항, 기초 클래슀 λ©”μ„œλ“œμ˜ μ‚¬μš©)
    • C++ 정리 - 35 (상속: is-a 관계, public λ‹€ν˜• 상속, 가상 λ©”μ„œλ“œλŠ” μ™œ ν•„μš”ν• κΉŒ?, 정적 κ²°ν•©κ³Ό 동적 κ²°ν•©, 포인터와 μ°Έμ‘°ν˜•μ˜ ν˜Έν™˜, 가상 멀버 ν•¨μˆ˜μ™€ 동적 κ²°ν•©, μ ‘κ·Όμ œμ–΄: protected, ABC μ² ν•™, 상속과 ..
    • C++ 정리 - 34 (포인터와 객체에 λŒ€ν•œ μš”μ•½, 멀버 초기자 리슀트(member initializer list), 클래슀의 상속, 클래슀 νŒŒμƒμ‹œν‚€κΈ°, μƒμ„±μž:접근에 λŒ€ν•˜μ—¬)
    hugDog
    hugDog
    μ•ˆλ“œλ‘œμ΄λ“œ 곡뢀 쀑인 ν•™μƒμž…λ‹ˆλ‹€!

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”