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
πŸ”€ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄/C++ 정리

C++ 정리 - 41 (ν…œν”Œλ¦Ώ ꡬ체화, 멀버 ν…œν”Œλ¦Ώ, λ§€κ°œλ³€μˆ˜ ν…œν”Œλ¦Ώ, ν…œν”Œλ¦Ώ ν΄λž˜μŠ€μ™€ ν”„λ Œλ“œ ν•¨μˆ˜, ν…œν”Œλ¦Ώ ν΄λž˜μŠ€μ— λŒ€ν•œ λ°”μš΄λ“œ ν…œν”Œλ¦Ώ ν”„λ Œλ“œ ν•¨μˆ˜, ν…œν”Œλ¦Ώ ν΄λž˜μŠ€μ— λŒ€ν•œ μ–Έλ°”μš΄λ“œ ν…œν”Œλ¦Ώ ν”„λ Œλ“œ ..

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

C++ 정리 - 41 (ν…œν”Œλ¦Ώ ꡬ체화, 멀버 ν…œν”Œλ¦Ώ, λ§€κ°œλ³€μˆ˜ ν…œν”Œλ¦Ώ, ν…œν”Œλ¦Ώ ν΄λž˜μŠ€μ™€ ν”„λ Œλ“œ ν•¨μˆ˜, ν…œν”Œλ¦Ώ ν΄λž˜μŠ€μ— λŒ€ν•œ λ°”μš΄λ“œ ν…œν”Œλ¦Ώ ν”„λ Œλ“œ ν•¨μˆ˜, ν…œν”Œλ¦Ώ ν΄λž˜μŠ€μ— λŒ€ν•œ μ–Έλ°”μš΄λ“œ ν…œν”Œλ¦Ώ ν”„λ Œλ“œ ..

2020. 11. 24. 20:00
728x90

ν…œν”Œλ¦Ώ ꡬ체화

-μ•”μ‹œμ  ꡬ체화

μ‚¬μš©ν•˜κΈ° μ›ν•˜λŠ” λ°μ΄ν„°ν˜•μ„ λ‚˜νƒ€λ‚΄λŠ” ν•˜λ‚˜ λ˜λŠ” κ·Έ μ΄μƒμ˜ 객체λ₯Ό μ„ μ–Έν•˜λ©΄ μ»΄νŒŒμΌλŸ¬λŠ” 포괄적인 ν…œν”Œλ¦Ώμ΄ μ œκ³΅ν•˜λŠ” 섀계도λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•˜λ‚˜μ˜ νŠΉμˆ˜ν™”λœ 클래슀 μ •μ˜λ₯Ό μƒμ„±ν•œλ‹€.

ArrayTP<int,100> stuff; //μ•”μ‹œμ  ꡬ체화

 

-λͺ…μ‹œμ  ꡬ체화

ν‚€μ›Œλ“œ template을 μ‚¬μš©ν•˜μ—¬ 클래슀λ₯Ό μ„ μ–Έν•˜κ³ , μ‚¬μš©ν•˜λ €λŠ” λ°μ΄ν„°ν˜•μ„ λ‚˜νƒ€λƒˆμ„ λ•Œ, μ»΄νŒŒμΌλŸ¬λŠ” λͺ…μ‹œμ  ꡬ체화λ₯Ό μƒμ„±ν•œλ‹€. 

template class ArrayTP<string,100>;

ArrayTP<string,100>이 클래슀라고 μ„ μ–Έν•œλ‹€.

이 선언은 ν…œν”Œλ¦Ώ μ •μ˜μ™€ λ™μΌν•œ 이름 곡간 μ•ˆμ— μžˆμ–΄μ•Ό ν•œλ‹€.

 

-λͺ…μ‹œμ  νŠΉμˆ˜ν™”

λͺ…μ‹œμ  νŠΉμˆ˜ν™”λŠ” 포괄적인 ν…œν”Œλ¦Ώ λŒ€μ‹ μ—, μ‚¬μš©ν•˜λ €λŠ” νŠΉμ •ν•œ λ°μ΄ν„°ν˜•μ„ μœ„ν•œ μ •μ˜μ΄λ‹€. 포괄적인 λ°μ΄ν„°ν˜• λŒ€μ‹  ꡬ체적인 ν•˜λ‚˜μ˜ λ°μ΄ν„°ν˜•μ— 맞게 μ •μ˜λœ ν…œν”Œλ¦Ώ ν˜•μ‹μ„ μ·¨ν•œλ‹€.

template<>class Classname<specialized-type-name>{...};

 

-뢀뢄적인 νŠΉμˆ˜ν™”

뢀뢄적인 νŠΉμˆ˜ν™”λŠ” ν…œν”Œλ¦Ώμ˜ 포괄성을 일뢀 μ œν•œν•œλ‹€.

예λ₯Ό λ“€μ–΄, 뢀뢄적인 νŠΉμˆ˜ν™”λŠ” λ°μ΄ν„°ν˜• λ§€κ°œλ³€μˆ˜λ“€ μ€‘μ˜ μ–΄λŠ ν•˜λ‚˜μ— ꡬ체적인 λ°μ΄ν„°ν˜•μ„ μ œκ³΅ν•  수 μžˆλ‹€.

 

//포괄적인 ν…œν”Œλ¦Ώ

template<class T1,class T2> class Pair{...};

//T2λ₯Ό int둜 μ„€μ •ν•œ, 뢀뢄적인 νŠΉμˆ˜ν™”

template<class T1>class Pair<T1,int> {...};

 

λ°μ΄ν„°ν˜•μ„ λͺ¨λ‘ μ§€μ •ν•˜λ©΄, κ΄„ν˜Έ μŒμ€ λΉ„κ²Œ 되고 μ™„μ „ν•œ λͺ…μ‹œμ  νŠΉμˆ˜ν™”κ°€ 이루어진닀.

//T1κ³Ό T2λ₯Ό λͺ¨λ‘ int둜 μ„€μ •ν•œ, μ™„μ „ν•œ λͺ…μ‹œμ  νŠΉμˆ˜ν™”

template<>class PAir<int,int>{...};

 

μ—¬λŸ¬ κ°€μ§€ μ€‘μ—μ„œ ν•˜λ‚˜λ₯Ό 선택해야 ν•œλ‹€λ©΄, μ»΄νŒŒμΌλŸ¬λŠ” κ°€μž₯ νŠΉμˆ˜ν™”λœ ν…œν”Œλ¦Ώμ„ μ‚¬μš©ν•œλ‹€.

포인터듀을 μœ„ν•œ 버전을 μ œκ³΅ν•¨μœΌλ‘œμ¨, 기쑴의 ν…œν”Œλ¦Ώμ„ λΆ€λΆ„μ μœΌλ‘œ νŠΉμˆ˜ν™”μ‹œν‚¬ 수 μžˆλ‹€.

template<class T> //포괄적인 버전

class Feeb{...};

template<class T*> //포인터λ₯Ό μœ„ν•œ 뢀뢄적인 νŠΉμˆ˜ν™”

class Feeb{...}; //μˆ˜μ •λœ μ½”λ“œ

 

Feeb<char *>fb2; //T νŠΉμˆ˜ν™” μ‚¬μš©, TλŠ” char

 

멀버 ν…œν”Œλ¦Ώ

ν…œν”Œλ¦Ώμ€ ꡬ쑰체, 클래슀, ν…œν”Œλ¦Ώ 클래슀의 멀버가 될 수 μžˆλ‹€.

 

λ§€κ°œλ³€μˆ˜ ν…œν”Œλ¦Ώ

ν…œν”Œλ¦Ώ λ§€κ°œλ³€μˆ˜λŠ”, ν‘œμ€€ ν…œν”Œλ¦Ώ 라이브러리λ₯Ό κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λœ ν…œν”Œλ¦Ώ κΈ°λŠ₯이닀.

template<template<typename T>class Thing>

class Crab

ν…œν”Œλ¦Ώ λ§€κ°œλ³€μˆ˜λŠ” template<typename T>class Thing이닀.

μ—¬κΈ°μ„œ template<typename T> classκ°€ λ°μ΄ν„°ν˜•μ΄κ³ , Thing이 λ§€κ°œλ³€μˆ˜μ΄λ‹€.

Crab<King> legs;

이것이 ν—ˆμš©λ˜λ €λ©΄ ν…œν”Œλ¦Ώ λ§€κ°œλ³€μˆ˜ King이 ν…œν”Œλ¦Ώ ν΄λž˜μŠ€μ—¬μ•Ό ν•œλ‹€. 그리고 ν…œν”Œλ¦Ώ 클래슀의 선언이 ν…œν”Œλ¦Ώ λ§€κ°œλ³€μˆ˜ Thing의 μ„ μ–Έκ³Ό μΌμΉ˜ν•΄μ•Ό ν•œλ‹€.

template<typename T>

class King{...};

 

ν…œν”Œλ¦Ώ λ§€κ°œλ³€μˆ˜λ₯Ό 일반 λ§€κ°œλ³€μˆ˜μ™€ ν˜Όν•©ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆλ‹€.

 

ν…œν”Œλ¦Ώ ν΄λž˜μŠ€μ™€ ν”„λ Œλ“œ ν•¨μˆ˜

ν…œν”Œλ¦Ώμ˜ ν”„λ Œλ“œλ₯Ό λ‹€μŒ 3κ°€μ§€λ‘œ λΆ„λ₯˜ν•  수 μžˆλ‹€.

ν…œν”Œλ¦Ώμ΄ μ•„λ‹Œ ν”„λ Œλ“œ

λ°”μš΄λ“œ ν…œν”Œλ¦Ώ ν”„λ Œλ“œ, ν΄λž˜μŠ€κ°€ ꡬ체화될 λ•Œ 클래슀의 λ°μ΄ν„°ν˜•μ— μ˜ν•΄ ν”„λ Œλ“œμ˜ λ°μ΄ν„°ν˜•μ΄ κ²°μ •λœλ‹€.

μ–Έλ°”μš΄λ“œ ν…œν”Œλ¦Ώ ν”„λ Œλ“œ, ν”„λ Œλ“œμ˜ λͺ¨λ“  νŠΉμˆ˜ν™”κ°€ κ·Έ 클래슀의 각 νŠΉμˆ˜ν™”μ— λŒ€ν•΄ ν”„λ Œλ“œλ“€μ΄λ‹€.

 

-ν…œν”Œλ¦Ώ ν΄λž˜μŠ€μ— λŒ€ν•œ ν…œν”Œλ¦Ώμ΄ μ•„λ‹Œ ν”„λ Œλ“œ ν•¨μˆ˜

ν…œν”Œλ¦Ώ ν΄λž˜μŠ€μ— μžˆλŠ” λ³΄ν†΅μ˜ ν•¨μˆ˜λ₯Ό ν”„λ Œλ“œλ‘œ μ„ μ–Έν•΄λ³΄μž

template<class T>
class HasFriend
{
	friend void counts();//λͺ¨λ“  HasFriend ꡬ체화듀에 λŒ€ν•΄ ν”„λ Œλ“œμ΄λ‹€.
    ...
};

이 선언은 counts() ν•¨μˆ˜λ₯Ό κ·Έ ν…œν”Œλ¦Ώμ΄ κ°€λŠ₯ν•œ λͺ¨λ“  ꡬ체화듀에 λŒ€ν•΄ ν”„λ Œλ“œλ‘œ λ§Œλ“ λ‹€.

 

count() ν•¨μˆ˜λŠ” 객체 λ§€κ°œλ³€μˆ˜λ“€μ„ κ°€μ§€μ§€ μ•Šκ³  객체에 μ˜ν•΄ ν˜ΈμΆœλ˜μ§€ μ•ŠλŠ”λ‹€. counts() ν•¨μˆ˜κ°€ HasFriend 객체에 μ ‘κ·Όν•˜λŠ” 법 1. μ „μ—­ 객체에 μ ‘κ·Όν•  수 μžˆλ‹€. 2. μ „μ—­ 포인터λ₯Ό μ‚¬μš©ν•˜μ—¬ 전역이 μ•„λ‹Œ 객체에 μ ‘κ·Όν•  수 μžˆλ‹€. 3. ν…œν”Œλ¦Ώ 클래슀의 static 데이터 멀버에 μ ‘κ·Όν•  수 μžˆλ‹€. 그리고 κ·ΈλŸ¬ν•œ static 데이터 멀버듀을 객체와 λ”°λ‘œ λΆ„λ¦¬λ˜μ–΄ μ‘΄μž¬ν•œλ‹€.

 

ν…œν”Œλ¦Ώ 클래슀 λ§€κ°œλ³€μˆ˜λ₯Ό μ œκ³΅ν•˜λ €λ©΄, ν•˜λ‚˜μ˜ νŠΉμˆ˜ν™”λ₯Ό μ œκ³΅ν•΄μ•Ό ν•œλ‹€.

friend void report(HasFriend<T> &); 

//HasFriend &λŠ” μ•ˆλ¨.

 

ν…œν”Œλ¦Ώ ν΄λž˜μŠ€μ— λŒ€ν•œ λ°”μš΄λ“œ ν…œν”Œλ¦Ώ ν”„λ Œλ“œ ν•¨μˆ˜

1. 클래슀 μ •μ˜ μ•žμ— ν…œν”Œλ¦Ώ ν•¨μˆ˜ 각각 μ„ μ–Έ

template<typename T> void counts();

template<typename T> void report(T &);

 

2. ν•¨μˆ˜ μ•ˆμ—μ„œ λ‹€μ‹œ ν…œν”Œλ¦Ώλ“€μ„ ν”„λ Œλ“œλ‘œ μ„ μ–Έ.

   ν΄λž˜μŠ€ ν…œν”Œλ¦Ώ λ§€κ°œλ³€μˆ˜μ˜ λ°μ΄ν„°ν˜•μ— κΈ°μ΄ˆν•˜λŠ” νŠΉμˆ˜ν™”λ“€ μ„ μ–Έ

template <typename T>
class HasFriendT
{
	...
    friend void counts<TT>();
    friend void report<>(HasFriendT<TT>&);
    //report<> = report<HasFriendT<TT>>
};

3. ν”„λ‘œκ·Έλž¨μ€ κ·Έ ν”„λ Œλ“œλ“€μ„ μœ„ν•œ μ •μ˜λ₯Ό μ œκ³΅ν•΄μ•Ό ν•œλ‹€.

 

-ν…œν”Œλ¦Ώ ν΄λž˜μŠ€μ— λŒ€ν•œ μ–Έλ°”μš΄λ“œ ν…œν”Œλ¦Ώ ν”„λ Œλ“œ ν•¨μˆ˜

ν…œν”Œλ¦Ώμ„ 클래슀 μ•ˆμ— μ„ μ–Έν•¨μœΌλ‘œμ¨, μ–Έλ°”μš΄λ“œ ν”„λ Œλ“œ ν•¨μˆ˜λ₯Ό 생성할 수 μžˆλ‹€. μ΄λ•Œ λͺ¨λ“  ν•¨μˆ˜ νŠΉμˆ˜ν™”λŠ” λͺ¨λ“  클래슀 νŠΉμˆ˜ν™”μ— λŒ€ν•΄ ν”„λ Œλ“œμ΄λ‹€. μ–Έλ°”μš΄λ“œ ν”„λ Œλ“œλ“€μ˜ 경우, ν”„λ Œλ“œ ν…œν”Œλ¦Ώ λ°μ΄ν„°ν˜• λ§€κ°œλ³€μˆ˜λ“€μ„ ν…œν”Œλ¦Ώ 클래슀 λ°μ΄ν„°ν˜• λ§€κ°œλ³€μˆ˜λ“€κ³Ό λ‹€λ₯΄λ‹€.

template<typename T>
class ManyFriend
{
	...
    template<typename C,typename D>friend void
    	Show2(C &,D &);
};

Show2(hf1i1,hfi2) ν•¨μˆ˜ ν˜ΈμΆœμ€ λ‹€μŒκ³Ό 같은 νŠΉμˆ˜ν™”μ™€ μΌμΉ˜ν•œλ‹€.

void show2<ManyFriend<int> &,c,ManyFriend<int>& d);

 

ManyFriend의 λͺ¨λ“  νŠΉμˆ˜ν™”λ“€μ— λŒ€ν•΄ ν”„λ Œλ“œμ΄κΈ° λ•Œλ¬Έμ—, 이 ν•¨μˆ˜λŠ” λͺ¨λ“  νŠΉμˆ˜ν™”λ“€μ˜ item 멀버에 μ ‘κ·Όν•  수 μžˆλ‹€. κ·ΈλŸ¬λ‚˜ ManyFriend<int> 객체듀에 λŒ€ν•œ μ ‘κ·Όλ§Œμ„ μ‚¬μš©ν•œλ‹€.

728x90
μ €μž‘μžν‘œμ‹œ λΉ„μ˜λ¦¬ (μƒˆμ°½μ—΄λ¦Ό)
    'πŸ”€ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄/C++ 정리' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • C++ 정리 - 43 (abort() 호좜, μ˜ˆμ™Έ λ©”μ»€λ‹ˆμ¦˜, μ˜ˆμ™Έλ‘œ 객체 μ‚¬μš©ν•˜κΈ°, c++11μ—μ„œμ˜ μ˜ˆμ™Έ 규격, μŠ€νƒ ν’€κΈ°, μ˜ˆμ™Έμ˜ κ·Έ λ°–μ˜ κΈ°λŠ₯)
    • C++ 정리 - 42 (ν”„λ Œλ“œ 클래슀, ν”„λ Œλ“œ 멀버 ν•¨μˆ˜, 내포 클래슀)
    • C++ 정리 - 40 (닀쀑 상속 μš”μ•½, 클래슀 ν…œν”Œλ¦Ώ, ν¬μΈν„°λ“€μ˜ μŠ€νƒμ„ λ°”λ₯΄κ²Œ μ‚¬μš©ν•˜λŠ” 경우)
    • C++ 정리 - 39 (using을 μ‚¬μš©ν•˜μ—¬ μ ‘κ·Ό λ‹€μ‹œ μ •μ˜ν•˜κΈ°, 닀쀑 상속, 가상 기초 ν΄λž˜μŠ€μ™€ 가상이 μ•„λ‹Œ 기초 클래슀의 ν˜Όν•©, 가상 기초 ν΄λž˜μŠ€μ™€ 기초 μš°μœ„)
    hugDog
    hugDog
    μ•ˆλ“œλ‘œμ΄λ“œ 곡뢀 쀑인 ν•™μƒμž…λ‹ˆλ‹€!

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

    단좕킀

    λ‚΄ λΈ”λ‘œκ·Έ

    λ‚΄ λΈ”λ‘œκ·Έ - κ΄€λ¦¬μž ν™ˆ μ „ν™˜
    Q
    Q
    μƒˆ κΈ€ μ“°κΈ°
    W
    W

    λΈ”λ‘œκ·Έ κ²Œμ‹œκΈ€

    κΈ€ μˆ˜μ • (κΆŒν•œ μžˆλŠ” 경우)
    E
    E
    λŒ“κΈ€ μ˜μ—­μœΌλ‘œ 이동
    C
    C

    λͺ¨λ“  μ˜μ—­

    이 νŽ˜μ΄μ§€μ˜ URL 볡사
    S
    S
    맨 μœ„λ‘œ 이동
    T
    T
    ν‹°μŠ€ν† λ¦¬ ν™ˆ 이동
    H
    H
    단좕킀 μ•ˆλ‚΄
    Shift + /
    ⇧ + /

    * λ‹¨μΆ•ν‚€λŠ” ν•œκΈ€/영문 λŒ€μ†Œλ¬Έμžλ‘œ 이용 κ°€λŠ₯ν•˜λ©°, ν‹°μŠ€ν† λ¦¬ κΈ°λ³Έ λ„λ©”μΈμ—μ„œλ§Œ λ™μž‘ν•©λ‹ˆλ‹€.