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++ 정리 - 32 (ν”„λ Œλ“œ:<<μ—°μ‚°μžμ˜ μ˜€λ²„ λ‘œλ”©, μžλ™ λ³€ν™˜κ³Ό 클래슀의 λ°μ΄ν„°ν˜• λ³€ν™˜, λ³€ν™˜ ν•¨μˆ˜(conversion function), ν΄λž˜μŠ€μ™€ 동적 λ©”λͺ¨λ¦¬ λŒ€μž…, νŠΉλ³„ 멀버 ν•¨μˆ˜, λ””ν΄νŠΈ μƒμ„±μž)

2020. 11. 4. 21:53
728x90

ν”„λ Œλ“œ:<<μ—°μ‚°μžμ˜ μ˜€λ²„ λ‘œλ”©

<<μ—°μ‚°μžλ₯Ό μ˜€λ²„ λ‘œλ”©ν•˜μ—¬ coutκ³Ό ν•¨κ»˜ μ‚¬μš©ν•¨μœΌλ‘œμ¨ 객체의 λ‚΄μš©μ„ 좜λ ₯ κ°€λŠ₯

 

μ˜€λ²„λ‘œλ”© <<의 첫 번째 버전

trip이 Time 객체라고 κ°€μ •ν•˜μž.

Time ν΄λž˜μŠ€μ—κ²Œ cout을 μ‚¬μš©ν•˜λŠ” 법을 κ°€λ₯΄μΉ˜λ €λ©΄, ν”„λ Œλ“œ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

 

κ·Έ μ΄μœ λŠ” λ‹€μŒκ³Ό 같은 ꡬ문이

cout<<trip;

두 개의 객체λ₯Ό μ‚¬μš©ν•˜κ³  μžˆμ§€λ§Œ, cout 객체λ₯Ό 첫 번째 ν”Όμ—°μ‚°μžλ‘œ μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έ(cout.operator<<(trip); 와 κ°™λ‹€.)

즉 trip<<cout; 처럼 μ‚¬μš©ν•΄μ•Ό 함 λ”°λΌμ„œ ν˜Όλ™μ„ 쀌

 

ν•˜μ§€λ§Œ ν”„λ Œλ“œ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€λ©΄, λ‹€μŒκ³Ό 같이 μ˜€λ²„ λ‘œλ”© κ°€λŠ₯

void operator<<(ostream &os,const Time &t)

{

os<<t.hours<<"μ‹œκ°„, "<<t.minutes<<"λΆ„";

}

λ‹€μŒκ³Ό 같은 ꡬ문 μ‚¬μš© κ°€λŠ₯

cout<<trip;

 

μ˜€λ²„ λ‘œλ”© <<의 두 번째 버전

첫 번째 λ²„μ „μ˜ μ˜€λ²„ λ‘œλ”© <<μ—°μ‚°μžλŠ” λ‹€μŒκ³Ό 같은 ν‘œν˜„μ—μ„œ λ™μž‘ν•˜μ§€ μ•ŠλŠ”λ‹€.

cout<<"μ—¬ν–‰ μΌμ‹œ: "<<trip<<" (ν™”μš”μΌ)\n";

 

cout λ™μž‘ 원리

int x=5;

int y=8;

cout<<x<<y;

 

c++λŠ” λ§ˆμ§€λ§‰μ˜ 좜λ ₯ ꡬ문을 μ™Όμͺ½μ—μ„œ 였λ₯Έμͺ½μœΌλ‘œ μ½λŠ”λ‹€. 즉 cout<<x<<y; λŠ” λ‹€μŒκ³Ό κ°™λ‹€. (cout<<x)<<y;

(cout<<x)λΌλŠ” ν‘œν˜„ 전체가 <<y의 μ™Όμͺ½μ— λ†“μ—¬μžˆκΈ° λ•Œλ¬Έμ—, (cout<<x)λΌλŠ” ν‘œν˜„ μžμ²΄κ°€ ostreamν˜•μ˜ 객체일 것을 μš”κ΅¬ν•œλ‹€. κ·Έλž˜μ„œ ostream ν΄λž˜μŠ€λŠ” ostream 객체λ₯Ό λ¦¬ν„΄ν•˜λ„λ‘ operator<<()ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•˜κ³  μžˆλ‹€. 이 κ²½μš°μ—λŠ” ν˜ΈμΆœν•œ 객체인 cout을 λ¦¬ν„΄ν•œλ‹€.

 

ν”„λ Œλ“œ ν•¨μˆ˜μ— λŒ€ν•΄μ„œλ„ 같은 μ ‘κ·Ό 방식을 μ·¨ν•  수 μžˆλ‹€.

operator<<()ν•¨μˆ˜κ°€ ostream 객체에 λŒ€ν•œ μ°Έμ‘°λ₯Ό λ¦¬ν„΄ν•˜λ„λ‘ κ°œμ •ν•˜λ©΄ λœλ‹€.

ostream &operator<<(ostream &os,const Time &t)

{

os<<t.hours<<"μ‹œκ°„ ,"<<t.minutes<<"λΆ„";

return os;

}

 

이 λ²„μ „μ˜ operator<<()λŠ” 파일 좜λ ₯에도 μ‚¬μš© κ°€λŠ₯

 

μžλ™ λ³€ν™˜κ³Ό 클래슀의 λ°μ΄ν„°ν˜• λ³€ν™˜

μžλ™ λ°μ΄ν„°ν˜• λ³€ν™˜μ„ λͺ»ν•˜κ²Œ ν•˜λŠ” explicitλΌλŠ” μƒˆλ‘œμš΄ ν‚€μ›Œλ“œκ°€ μΆ”κ°€λ˜μ—ˆλ‹€.

explicit Stonewt(double lbs); //μ•”μ‹œμ  λ°μ΄ν„°ν˜• λ³€ν™˜μ„ ν—ˆμš©ν•˜μ§€ μ•ŠμŒ

 

μƒμ„±μžκ°€ ν‚€μ›Œλ“œ explicit둜 μ œν•œλœ 경우, λͺ…μ‹œμ  λ°μ΄ν„°ν˜• λ³€ν™˜λ§Œ ν•  수 μžˆλ‹€.

 

λ³€ν™˜ ν•¨μˆ˜(conversion function)

λ³€ν™˜ ν•¨μˆ˜λŠ” μ‚¬μš©μž μ •μ˜ κ°•μ œ λ°μ΄ν„°ν˜• λ³€ν™˜μ΄λ‹€.

λ”°λΌμ„œ 일반적인 κ°•μ œ λ°μ΄ν„°ν˜• λ³€ν™˜μ²˜λŸΌ μ‚¬μš©ν•˜λ©΄ λœλ‹€.

typeName ν˜•μœΌλ‘œ λ³€ν™˜ν•˜λ €λ©΄, λ‹€μŒκ³Ό 같은 ν˜•μ‹μ„ μ‚¬μš©ν•œλ‹€.

operator typeName();

  • λ³€ν™˜ ν•¨μˆ˜λŠ” 클래슀의 λ©”μ„œλ“œμ—¬μ•Ό ν•œλ‹€
  • λ³€ν™˜ ν•¨μˆ˜λŠ” λ¦¬ν„΄ν˜•μ„ κ°€μ§€λ©΄ μ•ˆ λœλ‹€
  • λ³€ν™˜ ν•¨μˆ˜λŠ” λ§€κ°œλ³€μˆ˜λ₯Ό κ°€μ§€λ©΄ μ•ˆ λœλ‹€

doubleν˜•μœΌλ‘œ λ³€ν™˜ν•˜λŠ” ν•¨μˆ˜μ˜ μ›ν˜•μ€ λ‹€μŒκ³Ό κ°™λ‹€.

operator double();

 

c++은 ν΄λž˜μŠ€μ— λŒ€ν•΄ λ‹€μŒκ³Ό 같은 λ°μ΄ν„°ν˜• λ³€ν™˜ κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.

  • ν•˜λ‚˜μ˜ λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 클래슀 μƒμ„±μžλŠ”, κ·Έ λ§€κ°œλ³€μˆ˜μ˜ λ°μ΄ν„°ν˜•μ„ ν΄λž˜μŠ€ν˜•μœΌλ‘œ λ³€ν™˜ν•˜λŠ” λͺ…λ Ήμ–΄ 역할을 ν•œλ‹€. κ·ΈλŸ¬λ‚˜ μƒμ„±μž 선언에 explicit ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄, μ•”μ‹œμ  λ³€ν™˜μ€ μ—†μ–΄μ§€κ³  λͺ…μ‹œμ  λ³€ν™˜λ§Œ κ°€λŠ₯ν•˜κ²Œ λœλ‹€.
  • λ³€ν™˜ ν•¨μˆ˜λΌκ³  λΆ€λ₯΄λŠ” νŠΉλ³„ν•œ 클래슀 멀버 μ—°μ‚°μž ν•¨μˆ˜λŠ”, 클래슀 객체λ₯Ό λ‹€λ₯Έ λ°μ΄ν„°ν˜•μœΌλ‘œ λ³€ν™˜ν•˜λŠ” λͺ…λ Ήμ–΄ 역할을 ν•œλ‹€. 이 λ³€ν™˜ ν•¨μˆ˜λŠ” λ¦¬ν„΄ν˜•μ„ μ„ μ–Έν•˜μ§€ μ•Šκ³  맀개 λ³€μˆ˜λ„ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€. 객체λ₯Ό typeNameν˜•μœΌλ‘œ λ³€ν™˜ν•˜λ €λ©΄, κ·Έ λ³€ν™˜ ν•¨μˆ˜λ₯Ό operator() typeName() ν˜•μ‹μ˜ 클래슀 λ©€λ²„λ‘œ μ„ μ–Έν•œλ‹€. 객체λ₯Ό μ–΄λ–€ λ°μ΄ν„°ν˜•μ˜ λ³€μˆ˜μ— λŒ€μž…ν•˜λ©΄, κ·Έ λ³€μˆ˜μ˜ λ°μ΄ν„°ν˜•μ— ν•΄λ‹Ήν•˜λŠ” λ³€ν™˜ ν•¨μˆ˜κ°€ μžλ™μœΌλ‘œ 호좜됨

ν΄λž˜μŠ€μ™€ 동적 λ©”λͺ¨λ¦¬ λŒ€μž…

동적 λ©”λͺ¨λ¦¬μ™€ 클래슀

static 클래슀 λ©€λ²„λŠ” νŠΉλ³„ν•œ μ„±μ§ˆμ„ κ°€μ§„λ‹€. μƒμ„±λ˜λŠ” 객체 μˆ˜μ™€ 상관없이 static 클래슀 λ³€μˆ˜λ₯Ό 단 ν•˜λ‚˜λ§Œ μƒμ„±ν•œλ‹€.

class stringBad
{
private:
	char *str;
    int len;
    static int num_strings;
    ...

예λ₯Ό λ“€μ–΄ 10개의 stringBad 객체λ₯Ό μƒμ„±ν•˜λ©΄, 10개의 str 멀버와 10개의 len 멀버가 μƒκΈ°μ§€λ§Œ num_strings λ©€λ²„λŠ” ν•˜λ‚˜λ§Œ 생긴닀. κ·Έ ν•˜λ‚˜λ₯Ό 10개의 stringBad 객체가 κ³΅μœ ν•œλ‹€.

 

static 데이터 λ©€λ²„λŠ” 클래슀 μ„ μ–Έ μ•ˆμ—μ„œ μ„ μ–Έλ˜μ§€λ§Œ, 클래슀 λ©”μ„œλ“œ νŒŒμΌμ—μ„œ μ΄ˆκΈ°ν™”λœλ‹€. κ·Έ static 클래슀 멀버가 μ–΄λŠ ν΄λž˜μŠ€μ— μ†ν•˜λŠ”μ§€ λ‚˜νƒ€λ‚΄κΈ° μœ„ν•΄μ„œ μ΄ˆκΈ°ν™”ν•  λ•Œ μ‚¬μš©λ²”μœ„ κ²°μ • μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•œλ‹€. κ·ΈλŸ¬λ‚˜ static 멀버가 μ •μˆ˜ν˜•μ΄λ‚˜ μ—΄κ±°ν˜•μ˜ const 이면 클래슀 μžμ²΄μ—μ„œ μ΄ˆκΈ°ν™” κ°€λŠ₯

 

ν”„λ‘œκ·Έλž¨μ—μ„œ ν•˜λ‚˜μ˜ 객체λ₯Ό λ‹€λ₯Έ 객체둜 μ΄ˆκΈ°ν™”ν•˜λ©΄, μ»΄νŒŒμΌλŸ¬λŠ” 볡사 μƒμ„±μžλΌκ³  λΆ€λ₯΄λŠ” μƒμ„±μžλ₯Ό μžλ™μœΌλ‘œ λ°œμƒμ‹œν‚¨λ‹€.

 

νŠΉλ³„ 멀버 ν•¨μˆ˜

c++λŠ” λ‹€μŒκ³Ό 같은 멀버 ν•¨μˆ˜λ₯Ό μžλ™μœΌλ‘œ μ œκ³΅ν•œλ‹€.

  • μƒμ„±μžλ₯Ό μ „ν˜€ μ •μ˜ν•˜μ§€ μ•Šμ•˜μ„ 경우 λ””ν΄νŠΈ μƒμ„±μž
  • λ””ν΄νŠΈ 파괴자λ₯Ό μ •μ˜ν•˜μ§€ μ•Šμ•˜μ„ 경우 λ””ν΄νŠΈ 파괴자
  • 볡사 μƒμ„±μžλ₯Ό μ •μ˜ν•˜μ§€ μ•Šμ•˜μ„ 경우, 볡사 μƒμ„±μž
  • λŒ€μž… μ—°μ‚°μžλ₯Ό μ •μ˜ν•˜μ§€ μ•Šμ•˜μ„ 경우, λŒ€μž… μ—°μ‚°μž
  • μ£Όμ†Œ μ—°μ‚°μžλ₯Ό μ •μ˜ν•˜μ§€ μ•Šμ•˜μ„ 경우, μ£Όμ†Œ μ—°μ‚°μž (ν˜ΈμΆœν•œ 객체의 μ£Όμ†Œλ₯Ό λ¦¬ν„΄ν•œλ‹€.)

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

μ‚¬μš©μžκ°€ μ–΄λ– ν•œ μƒμ„±μžλ„ μ œκ³΅ν•˜μ§€ μ•ŠμœΌλ©΄, c++κ°€ λ””ν΄νŠΈ μƒμ„±μžλ₯Ό μ œκ³΅ν•œλ‹€.

 

λ””ν΄νŠΈ μƒμ„±μžλŠ” ν•˜λ‚˜λ§Œ κ°€μ§ˆ 수 μžˆλ‹€. 

Kluck() {kluck_ct=0;} //λͺ¨ν˜Έν•œ μƒμ„±μž #1

Kluck(int n=0){kluck_ct=n;} //λͺ¨ν˜Έν•œ μƒμ„±μž #2

 

Kluck bus; // 두 μƒμ„±μžμ— λͺ¨λ‘ λΆ€ν•©ν•˜λ―€λ‘œ μ•ˆλ¨.

 

 

728x90
μ €μž‘μžν‘œμ‹œ λΉ„μ˜λ¦¬ (μƒˆμ°½μ—΄λ¦Ό)
    'πŸ”€ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄/C++ 정리' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • C++ 정리 - 34 (포인터와 객체에 λŒ€ν•œ μš”μ•½, 멀버 초기자 리슀트(member initializer list), 클래슀의 상속, 클래슀 νŒŒμƒμ‹œν‚€κΈ°, μƒμ„±μž:접근에 λŒ€ν•˜μ—¬)
    • C++ 정리 - 33 (볡사 μƒμ„±μž, λŒ€μž… μ—°μ‚°μž, static 클래슀 멀버 λ³€μˆ˜, 객체 리턴에 λŒ€ν•œ κ΄€μ°°, new에 μ˜ν•œ 객체 μ΄ˆκΈ°ν™”)
    • C++ 정리 - 31 (좔상화 λ°μ΄ν„°ν˜•(abstract data type, ADT), μ—°μ‚°μž μ˜€λ²„λ‘œλ”©, ν”„λ Œλ“œμ˜ λ„μž…)
    • C++ 정리 - 30 (μƒμ„±μž μ‚¬μš©ν•˜κΈ°, λ””ν΄νŠΈ μƒμ„±μž, 파괴자, c++11의 리슀트 μ΄ˆκΈ°ν™”, const 멀버 ν•¨μˆ˜, this 포인터, 객체 λ°°μ—΄, 클래슀 μ‚¬μš© λ²”μœ„, λ²”μœ„κ°€ μ •ν•΄μ§„ μ—΄κ±°(c++11))
    hugDog
    hugDog
    μ•ˆλ“œλ‘œμ΄λ“œ 곡뢀 쀑인 ν•™μƒμž…λ‹ˆλ‹€!

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