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++ 정리 - 42 (ν”„λ Œλ“œ 클래슀, ν”„λ Œλ“œ 멀버 ν•¨μˆ˜, 내포 클래슀)

2020. 11. 27. 20:11
728x90

ν”„λ Œλ“œ 클래슀

λ‹€μŒ ꡬ문은 Remoteλ₯Ό ν”„λ Œλ“œ 클래슀둜 λ§Œλ“ λ‹€.

friend class Remote;

ν”„λ Œλ“œ 선언은 public, private, protected λΆ€λΆ„ μ–΄λ””μ—λ‚˜ λ‘˜ 수 μžˆλ‹€.

 

ν”„λ Œλ“œ 멀버 ν•¨μˆ˜

클래슀 전체λ₯Ό ν”„λ Œλ“œλ‘œ λ§Œλ“œλŠ” λŒ€μ‹ , μ›ν•˜λŠ” λ©”μ„œλ“œλ“€λ§Œ λ‹€λ₯Έ ν΄λž˜μŠ€μ— λŒ€ν•΄ ν”„λ Œλ“œλ‘œ λ§Œλ“œλŠ” 것이 κ°€λŠ₯ν•˜λ‹€.

 

Remote::set_chan()을 Tv ν΄λž˜μŠ€μ— λŒ€ν•΄ ν”„λ Œλ“œλ‘œ λ§Œλ“œλŠ” 방법은, Tv 클래슀 μ„ μ–Έ μ•ˆμ— 그것을 ν”„λ Œλ“œλ‘œ μ„ μ–Έν•˜λŠ” 것.

class Tv
{
	friend void Remote::set_chan(Tv &t,int c);
    ...
}

 κ·ΈλŸ¬λ‚˜ μ»΄νŒŒμΌλŸ¬κ°€ 이 ꡬ문을 μ²˜λ¦¬ν•˜λ €λ©΄ Remote μ •μ˜λ₯Ό 미리 μ•Œκ³  μžˆμ–΄μ•Ό ν•œλ‹€. 사전 선언을 μ‚¬μš©ν•΄ 이 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€.

class Tv; //사전 μ„ μ–Έ
class Remote{...};
class Tv{...};

Remote 선언이 λ‹€μŒκ³Ό 같은 인라인 μ½”λ“œλ₯Ό ν¬ν•¨ν•˜κ³  μžˆλ‹€κ³  κ°€μ •ν•΄λ³΄μž.

void onoff(Tv &t) { t.onoff(); }

이 선언은 Tv λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜κΈ° λ•Œλ¬Έμ—, 이 μ‹œμ μ—μ„œ μ»΄νŒŒμΌλŸ¬λŠ” Tv클래슀 선언을 이미 μ•Œκ³  μžˆμ–΄μ•Ό 함.

이 문제의 해결책은 Remoteλ₯Ό λ©”μ„œλ“œ μ„ μ–ΈμœΌλ‘œ μ œν•œν•˜κ³ , μ‹€μ œ μ •μ˜λ“€μ€ Tv클래슀 μ„ μ–Έ 뒀에 λ‘λŠ” 것이닀.

class Tv; //사전 μ„ μ–Έ
class Remote{...}; //Tvλ₯Ό μ‚¬μš©ν•˜λŠ” Remote λ©”μ„œλ“œλ“€μ˜ μ›ν˜•
class Tv{...}; //여기에 Remote λ©”μ„œλ“œλ“€μ˜ μ‹€μ œ μ •μ˜λ“€μ„ λ„£λŠ”λ‹€.

내포 클래슀

λ‹€λ₯Έ 클래슀 μ•ˆμ— μ„ μ–Έλœ 클래슀λ₯Ό 내포 클래슀라 ν•œλ‹€. 클래슀 선언을 λ‚΄ν¬ν•˜κ³  μžˆλŠ” 클래슀의 멀버 ν•¨μˆ˜λ“€μ€, 내포 클래슀의 객체듀을 μƒμ„±ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆλ‹€. 클래슀 μ™ΈλΆ€μ—μ„œ 내포 클래슀 선언이 public 뢀뢄에 λ“€μ–΄ 있고, μ‚¬μš© λ²”μœ„ κ²°μ • μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•΄μ•Όλ§Œ 내포 클래슀λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€. 클래슀λ₯Ό λ‚΄ν¬μ‹œν‚€λŠ” 일반적인 μ΄μœ λŠ”, λ‹€λ₯Έ 클래슀의 κ΅¬ν˜„μ„ μ§€μ›ν•˜κ³ , 이름 μΆ©λŒμ„ λ§‰λŠ” 것이닀.

 

-내포 ν΄λž˜μŠ€μ™€ μ ‘κ·Ό

내포 ν΄λž˜μŠ€μ—λŠ” 두 μ’…λ₯˜μ˜ μ ‘κ·Ό ν˜•νƒœκ°€ μžˆλ‹€.

1. 내포 ν΄λž˜μŠ€κ°€ μ„ μ–Έλœ μž₯μ†Œκ°€ 내포 클래슀의 μ‚¬μš©λ²”μœ„λ₯Ό μ œν•œν•œλ‹€.

2. 내포 클래슀의 public, protected, private 뢀뢄듀도 κ·Έ 클래슀 멀버에 λŒ€ν•œ 접근을 μ œν•œν•œλ‹€.

 

-μ‚¬μš© λ²”μœ„

내포 ν΄λž˜μŠ€κ°€ 제2 클래슀의 private 뢀뢄에 μ„ μ–Έλ˜μ—ˆλ‹€λ©΄, κ·Έ 내포 ν΄λž˜μŠ€λŠ” 제2 ν΄λž˜μŠ€μ—λ§Œ μ•Œλ €μ§„λ‹€.

 

내포 ν΄λž˜μŠ€κ°€ 제2 클래슀의 protected 뢀뢄에 μ„ μ–Έλ˜μ—ˆλ‹€λ©΄, κ·Έ 내포 ν΄λž˜μŠ€λŠ” 제2 ν΄λž˜μŠ€μ—κ²Œ μ•Œλ €μ§€μ§€λ§Œ, 제2 클래슀의 μ™ΈλΆ€μ—λŠ” 보이지 μ•ŠλŠ”λ‹€. νŒŒμƒ ν΄λž˜μŠ€λŠ” 내포 클래슀의 쑴재λ₯Ό μ•Œκ²Œ 되고, 내포 ν΄λž˜μŠ€ν˜•μ˜ 객체λ₯Ό 직접 생성 κ°€λŠ₯.

 

내포 ν΄λž˜μŠ€κ°€ 제2 클래슀의 public 뢀뢄에 μ„ μ–Έλ˜μ—ˆλ‹€λ©΄, κ·Έ 내포 ν΄λž˜μŠ€λŠ” 제2 ν΄λž˜μŠ€μ—μ„œ, 제2 ν΄λž˜μŠ€λ‘œλΆ€ν„° νŒŒμƒλœ ν΄λž˜μŠ€λ“€μ—μ„œ, 그리고 public 이기 λ•Œλ¬Έμ— 제2 클래슀의 μ™ΈλΆ€μ—μ„œ μ‚¬μš©ν•  수 μžˆλ‹€. κ·ΈλŸ¬λ‚˜ 내포 ν΄λž˜μŠ€λŠ” 클래슀 μ‚¬μš© λ²”μœ„λ₯Ό κ°€μ§€κΈ° λ•Œλ¬Έμ—, 제2 클래슀의 μ™ΈλΆ€μ—μ„œλŠ” 클래슀 μ œν•œμžμ™€ ν•¨κ»˜ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

 

내포 클래슀, 내포 ꡬ쑰체, 내포 μ—΄κ±°μ²΄μ˜ μ‚¬μš© λ²”μœ„ νŠΉμ„±

제2 ν΄λž˜μŠ€μ—μ„œ μ„ μ–Έλœ μž₯μ†Œ 제2 ν΄λž˜μŠ€μ—μ„œ μ‚¬μš© μ—¬λΆ€ 제2 ν΄λž˜μŠ€λ‘œλΆ€ν„° νŒŒμƒλœ ν΄λž˜μŠ€μ—μ„œ μ‚¬μš© μ—¬λΆ€ λ°”κΉ₯ μ„Έκ³„μ—μ„œ μ‚¬μš© μ—¬λΆ€
private λΆ€λΆ„ O X X
protected λΆ€λΆ„ O O X
public λΆ€λΆ„ O O O 클래슀 μ œν•œμž μ‚¬μš©

 

-μ ‘κ·Ό μ œμ–΄

μ–΄λ–€ ν΄λž˜μŠ€κ°€ μ‚¬μš© λ²”μœ„ μ•ˆμ— λ“€μ–΄μ˜€λ©΄, μ ‘κ·Ό μ œμ–΄κ°€ κ°œμ‹œλœλ‹€. 일반 클래슀 접근을 μ œμ–΄ν•˜λŠ” κ·œμΉ™κ³Ό λ™μΌν•œ κ·œμΉ™μ΄ 내포 클래슀 접근에도 μ μš©λœλ‹€.

728x90
μ €μž‘μžν‘œμ‹œ λΉ„μ˜λ¦¬ (μƒˆμ°½μ—΄λ¦Ό)
    'πŸ”€ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄/C++ 정리' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • C++ 정리 - 44 (exception 클래슀, stdexcept μ˜ˆμ™Έ 클래슀, bad_alloc μ˜ˆμ™Έμ™€ new, μ˜ˆμ™Έ, 클래슀, 상속, 잘λͺ»λœ μ˜ˆμ™Έ)
    • C++ 정리 - 43 (abort() 호좜, μ˜ˆμ™Έ λ©”μ»€λ‹ˆμ¦˜, μ˜ˆμ™Έλ‘œ 객체 μ‚¬μš©ν•˜κΈ°, c++11μ—μ„œμ˜ μ˜ˆμ™Έ 규격, μŠ€νƒ ν’€κΈ°, μ˜ˆμ™Έμ˜ κ·Έ λ°–μ˜ κΈ°λŠ₯)
    • C++ 정리 - 41 (ν…œν”Œλ¦Ώ ꡬ체화, 멀버 ν…œν”Œλ¦Ώ, λ§€κ°œλ³€μˆ˜ ν…œν”Œλ¦Ώ, ν…œν”Œλ¦Ώ ν΄λž˜μŠ€μ™€ ν”„λ Œλ“œ ν•¨μˆ˜, ν…œν”Œλ¦Ώ ν΄λž˜μŠ€μ— λŒ€ν•œ λ°”μš΄λ“œ ν…œν”Œλ¦Ώ ν”„λ Œλ“œ ν•¨μˆ˜, ν…œν”Œλ¦Ώ ν΄λž˜μŠ€μ— λŒ€ν•œ μ–Έλ°”μš΄λ“œ ν…œν”Œλ¦Ώ ν”„λ Œλ“œ ..
    • C++ 정리 - 40 (닀쀑 상속 μš”μ•½, 클래슀 ν…œν”Œλ¦Ώ, ν¬μΈν„°λ“€μ˜ μŠ€νƒμ„ λ°”λ₯΄κ²Œ μ‚¬μš©ν•˜λŠ” 경우)
    hugDog
    hugDog
    μ•ˆλ“œλ‘œμ΄λ“œ 곡뢀 쀑인 ν•™μƒμž…λ‹ˆλ‹€!

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