C Programming Language/C++

C++ ν•¨μˆ˜(inline, μž¬κ·€, lambda)와 ν•¨μˆ˜ 포인터, 인자의 μœ ν˜•κ³Ό 전달 방식

567Rabbit 2024. 8. 26. 00:20

ν•¨μˆ˜μ˜ μ •μ˜

 

- ν•¨μˆ˜μ˜ 이름은 ν•¨μˆ˜κ°€ μˆ˜ν–‰ν•˜λŠ” κΈ°λŠ₯의 μ΅œμ’…(전체) κ²°κ³Όλ₯Ό λœ»ν•˜λ„λ‘ ν•œλ‹€.

- λ³€μˆ˜, ν•¨μˆ˜, enum, 클래슀 등은 μ‚¬μš©λ˜κΈ° 전에 μ„ μ–Έν•œλ‹€.

- μ •μ˜λŠ” 였직 1회만 κ°€λŠ₯ν•˜λ‹€(One Definition Rule) <-> 선언은 μ—¬λŸ¬ 회 ν—ˆμš©λœλ‹€

 

 

 

 

inline ν•¨μˆ˜

 

- inline ν•¨μˆ˜λŠ” 헀더 νŒŒμΌμ—μ„œ μ„ μ–Έν•˜κ³  μ •μ˜ν•΄μ•Ό ν•˜λ©°, 이λ₯Ό μ—¬λŸ¬ νŒŒμΌμ—μ„œ μ‚¬μš©ν•  수 μžˆλ‹€.

- inline ν•¨μˆ˜λŠ” ν•¨μˆ˜ ν˜ΈμΆœμ„ ν•˜μ§€ μ•Šκ³ , ν•¨μˆ˜μ˜ 본문을 호좜 μœ„μΉ˜μ— 직접 μ‚½μž…ν•˜λŠ” 방법을 μ œμ•ˆν•˜λŠ” C++의 μ΅œμ ν™” 기법

- μ»΄νŒŒμΌλŸ¬μ—κ²Œ ν•¨μˆ˜λ₯Ό 인라인 μ²˜λ¦¬ν•  κ°€λŠ₯성을 κ³ λ €ν•΄λ‹¬λΌλŠ” 힌트λ₯Ό μ£Όλ©°, ν•¨μˆ˜ ν˜ΈμΆœμ„ μ΅œμ ν™”ν•˜λ €λŠ” μ˜λ„λ₯Ό 전달

- 일반적으둜 ν•¨μˆ˜κ°€ 호좜되면, μŠ€νƒμ— μŠ€νƒν”„λ ˆμž„μ΄ μƒμ„±λ˜λŠ”λ° μŠ€νƒ ν”„λ ˆμž„μ„ μƒμ„±ν•˜κ³  μ œκ±°ν•˜λŠ” κ³Όμ •μ—λŠ” μ˜€λ²„ν—€λ“œκ°€ λ°œμƒν•œλ‹€. μ΄λŠ” 특히 μž‘μ€ ν•¨μˆ˜κ°€ 반볡적으둜 호좜될 λ•Œ μ„±λŠ₯에 뢀정적인 영ν–₯을 쀄 수 μžˆλ‹€.

-  inline ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄, μ»΄νŒŒμΌλŸ¬λŠ” ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” λŒ€μ‹  ν•΄λ‹Ή ν•¨μˆ˜μ˜ μ½”λ“œλ₯Ό 직접 호좜 μœ„μΉ˜μ— μ‚½μž…ν•˜κΈ° λ•Œλ¬Έμ— ν•¨μˆ˜ ν˜ΈμΆœμ„ μœ„ν•œ μŠ€νƒ ν”„λ ˆμž„ 생성이 λΆˆν•„μš”ν•΄μ§€λ―€λ‘œ, μŠ€νƒμ„ μ‚¬μš©ν•˜λŠ” μ˜€λ²„ν—€λ“œκ°€ 제거될 수 μžˆλ‹€.

- non-static 인라인 ν•¨μˆ˜κ°€ μ„œλ‘œ λ‹€λ₯Έ νŒŒμΌμ— μ—¬λŸ¬ 번 선언될 λ•Œ, λͺ¨λ‘ inline μ„ μ–Έν•΄μ•Ό ν•˜κ³ , λͺ¨λ“  μ •μ˜λŠ” 동일해야 ν•˜κ³ , λ™μΌν•œ μ£Όμ†Œλ₯Ό 가진닀

-  inline ν•¨μˆ˜κ°€ μ—¬λŸ¬ μ†ŒμŠ€ νŒŒμΌμ—μ„œ μ •μ˜λ˜λ”λΌλ„ λͺ¨λ“  μ •μ˜κ°€ λ™μΌν•˜λ‹€κ³  ν™•μΈν•˜λ©΄, 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚€μ§€ μ•ŠμŒ

- λͺ¨λ“  μ •μ˜κ°€ λ™μΌν•˜κΈ° λ•Œλ¬Έμ— 각 μ†ŒμŠ€ νŒŒμΌμ—μ„œμ˜ ν•¨μˆ˜ μ •μ˜λŠ” λ™μΌν•œ λ©”λͺ¨λ¦¬ μœ„μΉ˜λ₯Ό 가리킴

 

 

<λ§€ν¬λ‘œμ™€ 인라인 ν•¨μˆ˜>

 

 

 

 

 

μž¬κ·€μ  ν•¨μˆ˜

 

- μž¬κ·€μ  ν•¨μˆ˜λŠ” 자기 μžμ‹ μ„ ν˜ΈμΆœν•˜λŠ” ν•¨μˆ˜. factorial은 μž¬κ·€μ  ν•¨μˆ˜μ˜ 쒋은 μ˜ˆμ΄λ‹€.

- stack overflow의 μœ„ν—˜μ΄ μžˆμœΌλ―€λ‘œ 반볡문이 쒋을 수 있음 ( 잘λͺ»λœ μž¬κ·€ 호좜둜 인해 λ¬΄ν•œ 루프에 빠질 수 있기 λ•Œλ¬Έμ— )

 

long factorial(const int number){

    if (number == 1) return 1;
    return number * factorial(number-1);

}

 

 

 

 

 

Lambda ν•¨μˆ˜

 

λžŒλ‹€ ν•¨μˆ˜λŠ” μ΄λ¦„이 μ—†λŠ” ν•¨μˆ˜ 객체λ₯Ό μ˜λ―Έν•œλ‹€. μ΄λ¦„ 없이 κ°„λ‹¨ν•˜κ²Œ μ •μ˜ν•  수 μžˆλŠ” ν•¨μˆ˜λΌκ³  ν•  수 μžˆλ‹€.

ν•¨μˆ˜μ™€ λΉ„μŠ·ν•˜κ²Œ λ™μž‘ν•˜μ§€λ§Œ 읡λͺ… ν•¨μˆ˜(anonymous function)둜 μ‚¬μš©ν•  수 μžˆλ‹€.

 

 

 

 

Lambda ν•¨μˆ˜μ˜ ν•„μš”μ„±

 

 

(1)

λ¦¬μŠ€νŠΈλ‚˜ 배열을 μ •λ ¬ν•  λ•Œ, μ •λ ¬ 기쀀을 ν•¨μˆ˜λ‘œ λ§Œλ“€μ–΄μ„œ μ‚¬μš©ν•œλ‹€λ©΄ 보톡은 μ •λ ¬ ν•¨μˆ˜μ— 기쀀을 μ •ν•΄μ£ΌλŠ” ν•¨μˆ˜λ₯Ό λ”°λ‘œ μ •μ˜ν•΄μ•Ό ν•˜μ§€λ§Œ, λžŒλ‹€ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ μ •λ ¬ν•  λ•Œ κ°„λ‹¨ν•˜κ²Œ κ·Έ μžλ¦¬μ—μ„œ 기쀀을 μ •μ˜ν•  수 μžˆλ‹€. 즉, μ½”λ“œκ°€ 간결해지고, νŠΉμ • μž‘μ—…μ„ μœ„ν•΄ λΆˆν•„μš”ν•œ ν•¨μˆ˜ μ •μ˜λ₯Ό 쀄일 수 μžˆλ‹€. 즉, λžŒλ‹€ ν•¨μˆ˜λŠ” μ½”λ“œ λ‚΄μ—μ„œ μΌμ‹œμ μœΌλ‘œ κ°„λ‹¨ν•œ ν•¨μˆ˜λ₯Ό μž‘μ„±ν•  λ•Œ μœ μš©ν•˜κ²Œ μ‚¬μš©λœλ‹€.

 

(2)

λ˜ν•œ ν˜„μž¬ μŠ€μ½”ν”„μ— μžˆλŠ” λ³€μˆ˜λ“€μ„ 캑처(capture)ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆλ‹€λŠ” μ μ—μ„œ 일반적인 ν•¨μˆ˜μ™€ λ‹€λ₯΄λ‹€.

기쑴의 ν•¨μˆ˜ 포인터 λŒ€μ‹  μ‚¬μš©ν•˜κ±°λ‚˜, νŠΉμ • λ²”μœ„ λ‚΄μ˜ λ³€μˆ˜λ₯Ό μΊ‘μ²˜ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” κ²½μš°μ— κ°•λ ₯ν•œ κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.

캑처λ₯Ό μ‚¬μš©ν•˜λŠ” μ΄μœ λŠ” λžŒλ‹€ ν•¨μˆ˜κ°€ μ •μ˜λœ μ™ΈλΆ€ λ²”μœ„μ— μžˆλŠ” λ³€μˆ˜λ“€μ„ λžŒλ‹€ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•˜κΈ° μœ„ν•΄μ„œμ΄λ‹€. μ‰½κ²Œ 말해, λžŒλ‹€ ν•¨μˆ˜λŠ” 보톡 μ½”λ“œ λ‚΄λΆ€μ—μ„œ μ •μ˜λ˜λŠ”λ°, κ·Έ λžŒλ‹€ ν•¨μˆ˜κ°€ 외뢀에 μžˆλŠ” λ³€μˆ˜λ₯Ό ν•„μš”λ‘œ ν•  λ•Œ κ·Έ λ³€μˆ˜λ₯Ό μΊ‘μ²˜ν•˜μ—¬ μ‚¬μš©ν•œλ‹€.

 

 

 

<λ‚΄λ¦Όμ°¨μˆœ μ •λ ¬ λžŒλ‹€ν•¨μˆ˜ μ‚¬μš© 예제>

#include <algorithm>
#include <vector>
#include <iostream>

int main() {
    std::vector<int> numbers = {5, 2, 8, 1, 3};

    // λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ •λ ¬
    std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
        return a > b;
    });

    for (int n : numbers) {
        std::cout << n << " ";
    }
    // 좜λ ₯: 8 5 3 2 1

    return 0;
}

 

  • 캑처(Captures) [ ]:
    • λžŒλ‹€ ν•¨μˆ˜κ°€ μ •μ˜λœ μŠ€μ½”ν”„μ—μ„œ μ‚¬μš© 쀑인 λ³€μˆ˜λ“€μ„ μΊ‘μ²˜ν•˜μ—¬ μ‚¬μš©ν•  수 있게 ν•΄μ€€λ‹€.
    • 예λ₯Ό λ“€μ–΄ [&]λŠ” 참쑰둜 μΊ‘μ²˜ν•˜κ³ , [=]λŠ” κ°’μœΌλ‘œ μΊ‘μ²˜ν•œλ‹€.

 

  • λ§€κ°œλ³€μˆ˜(Parameters) ( ):
    • ν•¨μˆ˜μ™€ λ™μΌν•˜κ²Œ λžŒλ‹€ ν•¨μˆ˜κ°€ 호좜될 λ•Œ μ „λ‹¬λ˜λŠ” μΈμžλ“€μ„ μ •μ˜ν•œλ‹€
    • μ˜ˆμ‹œ: (int a, int b)λŠ” 두 개의 μ •μˆ˜ν˜• λ§€κ°œλ³€μˆ˜λ₯Ό λ°›λŠ” λžŒλ‹€ ν•¨μˆ˜λ₯Ό λ‚˜νƒ€λ‚Έλ‹€

 

  • λ°˜ν™˜ νƒ€μž…(Trailing-Return-Type) -> return type:
    • λžŒλ‹€ ν•¨μˆ˜μ˜ λ°˜ν™˜ νƒ€μž…μ„ μ§€μ •ν•©λ‹ˆλ‹€.
    • 이 뢀뢄은 μƒλž΅ν•  수 있으며, μ»΄νŒŒμΌλŸ¬κ°€ μžλ™μœΌλ‘œ λ°˜ν™˜ νƒ€μž…μ„ μœ μΆ”ν•  μˆ˜λ„ μžˆλ‹€.

 

  • ν•¨μˆ˜ κ΅¬ν˜„(Definition) { }:
    • ν•¨μˆ˜μ˜ 본체둜, μ‹€μ œλ‘œ μ‹€ν–‰λ˜λŠ” μ½”λ“œκ°€ λ“€μ–΄κ°„λ‹€.
    • μ˜ˆμ‹œ: { return a > b; }λŠ” aκ°€ b보닀 클 λ•Œ 참을 λ°˜ν™˜ν•˜λŠ” λžŒλ‹€ ν•¨μˆ˜λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.

 

 

 

 

 

κΈ°λ³Έ λ§€κ°œλ³€μˆ˜ κ°’ κ·œμΉ™

 

 

 

 

 

 

 

μ„ μ–Έκ³Ό μ •μ˜μ˜ 차이

 

  • μ„ μ–Έ: μ‹λ³„μžμ˜ 이름과 νƒ€μž…λ§Œ μ•Œλ €μ€€λ‹€ λ©”λͺ¨λ¦¬ 할당은 이루어지지 μ•ŠλŠ”λ‹€.
    • 예: extern int x; (μ—¬κΈ°μ„œ xκ°€ μ–΄λ–€ 곳에 μ •μ˜λ˜μ–΄ μžˆμŒμ„ μ•Œλ €μ€λ‹ˆλ‹€.)
  • μ •μ˜: μ‹€μ œλ‘œ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•˜κ³  값을 μ΄ˆκΈ°ν™”ν•¨
    • 예: int x = 10; (x의 λ©”λͺ¨λ¦¬κ°€ ν• λ‹Ήλ˜κ³  값이 μ΄ˆκΈ°ν™”λ©λ‹ˆλ‹€.)

 

 

 

 

ν•¨μˆ˜μ˜ λ°˜ν™˜ κ°’

 

 

- ν•¨μˆ˜λŠ” μ•½μ†λœ κΈ°λŠ₯을 μˆ˜ν–‰ν•˜κ³  κ·Έ μˆ˜ν–‰κ²°κ³Όλ₯Ό ν˜ΈμΆœν•¨μˆ˜μ—κ²Œ λ°˜ν™˜ν•˜λŠ” 것이 일반적

- λ°˜ν™˜ κ°’μ˜ 전달 : return으둜 결과값을 λ°˜ν™˜

- ν”Όν˜ΈμΆœ ν•¨μˆ˜μ—μ„œλŠ” return문을 μ΄μš©ν•΄μ„œ 호좜 ν•¨μˆ˜( ex   mainν•¨μˆ˜)μ—κ²Œ μžμ‹ μ˜ μˆ˜ν–‰ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•œλ‹€

- λ°˜ν™˜ν•œ 값이 정상적인 계산/처리 κ²°κ³Όκ°€ μ•„λ‹ˆλΌ 비정상적인 처리 즉 였λ₯˜λ₯Ό λœ»ν•˜λŠ” κ²½μš°μ—λŠ” ν˜ΈμΆœν•¨μˆ˜μ—μ„œ 이λ₯Ό μ²˜λ¦¬ν•¨

   ex) return -1  // 였λ₯˜ 상황이 λ°œμƒν–ˆμ„ 경우

 

λ°˜ν™˜κ°’μ΄ μ—†λŠ” **ν˜ΈμΆœν•¨μˆ˜** : return문을 쓰지 μ•Šμ•„λ„ λœλ‹€

(1) λ°˜ν™˜νƒ€μž…μ΄ void 인 ν•¨μˆ˜

(2) main ν•¨μˆ˜ : 이 ν˜ΈμΆœμ€ λ°˜ν™˜κ°’이 μ—†κΈ° λ•Œλ¬Έμ—, ν•¨μˆ˜κ°€ μ‹€ν–‰λœ ν›„ λ‹€μŒ μ½”λ“œλ‘œ λ„˜μ–΄κ°„λ‹€

 

 

 

 

 

 

ν•¨μˆ˜ μ˜€λ²„λ‘œλ”©

 

 

- cμ—μ„œλŠ” ν—ˆμš©λ˜μ§€ μ•Šμ•˜μ§€λ§Œ C++μ—μ„œλŠ” ν—ˆμš©λœλ‹€

 

 

 

 

 

 

 

ν•¨μˆ˜ 포인터(Function Pointer)

 

 

- ν•¨μˆ˜ ν¬μΈν„°λŠ” ν•¨μˆ˜μ˜ λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό μ €μž₯ν•  수 μžˆλŠ” 포인터.

- pFuncλŠ” 일반적으둜 ν•¨μˆ˜ 포인터λ₯Ό μ €μž₯ν•˜λŠ” λ³€μˆ˜μ˜ μ΄λ¦„μœΌλ‘œ μ‚¬μš©λœλ‹€ 이 μ΄λ¦„μ—μ„œ pλŠ” 포인터λ₯Ό μ˜λ―Έν•˜κ³ , FuncλŠ” ν•¨μˆ˜μ˜ μ•½μ–΄λ‘œ ν•΄μ„λœλ‹€. 즉, pFuncλŠ” ν•¨μˆ˜μ˜ μ£Όμ†Œλ₯Ό μ €μž₯ν•  수 μžˆλŠ” 포인터λ₯Ό 가리킨닀.

- ν•¨μˆ˜ 포인터λ₯Ό μ‚¬μš©ν•˜λ©΄ ν•¨μˆ˜μ˜ μ£Όμ†Œλ₯Ό λ³€μˆ˜μ— μ €μž₯ν•˜κ³ , λ‚˜μ€‘μ— 이 λ³€μˆ˜λ₯Ό 톡해 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  수 μžˆλ‹€.

 

 

#include <iostream>

// ν•¨μˆ˜ μ •μ˜
void printMessage() {
    std::cout << "Hello, World!" << std::endl;
}

// ν•¨μˆ˜ 포인터λ₯Ό 인자둜 λ°›λŠ” ν•¨μˆ˜
void executeFunction(void (*pFunc)()) {
    pFunc();  // ν•¨μˆ˜ 포인터λ₯Ό 톡해 ν•¨μˆ˜ 호좜
}

int main() {
    // ν•¨μˆ˜ 포인터λ₯Ό λ³€μˆ˜μ— μ €μž₯
    void (*pFunc)() = printMessage;
    
    // ν•¨μˆ˜ 포인터λ₯Ό 인자둜 전달
    executeFunction(pFunc);
    
    return 0;
}

 

 

 

 

 

 

인자의 μœ ν˜•

 

 

 

 

 

- constκ°€ λΆ™κ³ λ‚˜λ©΄ 값을 λ³€κ²½ν•  수 μ—†μœΌλ―€λ‘œ μˆ˜μ •μ΄ λΆˆκ°€λŠ₯해진닀.

 

 

 

 

 

ꡬ쑰체의 전달

 

 

 

 

 

 

인자 전달 방식

 

 

Call by Value (κ°’=μΌλ°˜λ³€μˆ˜μ— μ˜ν•œ 호좜)

 

- ν•¨μˆ˜μ— 인수의 값을 λ³΅μ‚¬ν•΄μ„œ 전달

- ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œλŠ” 이 λ³΅μ‚¬λœ κ°’μœΌλ‘œ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λ©°, μ›λž˜μ˜ 값은 λ³€κ²½λ˜μ§€ μ•ŠλŠ”λ‹€

- ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ 인수λ₯Ό 변경해도, μ›λž˜μ˜ 값에 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠλŠ”λ‹€.

- μ›λž˜ 값을 λ³€κ²½ν•˜μ§€ μ•Šμ•„μ•Ό ν•  λ•Œ μ‚¬μš©

 

- ex) ν•¨μˆ˜κ°€ λ‹¨μˆœνžˆ 데이터λ₯Ό μ²˜λ¦¬ν•˜κ³  결과만 λ°˜ν™˜ν•˜λŠ” 경우.

 

 

** 기본적으둜 ν”Όν˜ΈμΆœν•¨μˆ˜μ—μ„œ μƒμ„±ν•œ λ°˜ν™˜ 값은 ν˜ΈμΆœν•¨μˆ˜λ‘œ λ³΅μ‚¬λœλ‹€.(값에 μ˜ν•œ 전달이 λ°œμƒν•œλ‹€) **

κ·ΈλŸ¬λ‚˜ 값에 μ˜ν•œ μ „λ‹¬μœΌλ‘œ λ³΅μ‚¬λ˜λŠ” 방식은 λ°˜ν™˜ νƒ€μž…μ΄ ꡬ쑰체/ν΄λž˜μŠ€μ™€ 같이 λ§Žμ€ λ©”λͺ¨λ¦¬ μ‚¬μš©ν•  λ•Œ λΉ„μš©μ΄ 컀

=> μ„±λŠ₯ 문제λ₯Ό ν”Όν•˜κΈ° μœ„ν•΄ μ°Έμ‘°λ₯Ό λ°˜ν™˜ν•˜λŠ” 방법이 μ‚¬μš©λ  수 μžˆλ‹€ -> λ©”λͺ¨λ¦¬ μ‚¬μš©μ„ μ΅œμ†Œν™”ν•˜κ³  μ„±λŠ₯을 κ°œμ„ ν•  수 μžˆλ‹€.

 

 

 

Call by Reference (참쑰에 μ˜ν•œ 호좜)

 

 

- 인수의 값을 볡사x

- ν•¨μˆ˜μ— 인수의 μ°Έμ‘°(μ£Όμ†Œ)λ₯Ό 전달

- ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œλŠ” 이 μ°Έμ‘°λ₯Ό 톡해 μ›λž˜μ˜ 값을 직접 λ³€κ²½ν•  수 μžˆλ‹€.

- ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ 인수λ₯Ό λ³€κ²½ν•˜λ©΄, μ›λž˜μ˜ 값도 λ³€κ²½λœλ‹€.

 

- μ›λž˜ 값을 ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ λ³€κ²½ν•΄μ•Ό ν•  λ•Œ μ‚¬μš©

- ex) ν•¨μˆ˜κ°€ μž…λ ₯값을 μˆ˜μ •ν•˜κ±°λ‚˜, μ—¬λŸ¬ 값을 λ°˜ν™˜ν•΄μ•Ό ν•˜λŠ” 경우.

 

=> μ°Έμ‘° λ°˜ν™˜ μ‹œ μ£Όμ˜ν•  점: 참쑰둜 λ°˜ν™˜ν•˜λŠ” 경우, ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μƒμ„±λœ 지역 λ³€μˆ˜μ˜ μ°Έμ‘°λ₯Ό λ°˜ν™˜ν•˜λ©΄ μ•ˆ λœλ‹€.

ν•¨μˆ˜κ°€ μ’…λ£Œλ˜λ©΄ 지역 λ³€μˆ˜μ˜ λ©”λͺ¨λ¦¬κ°€ ν•΄μ œλ˜κΈ° λ•Œλ¬Έμ—, 이λ₯Ό μ°Έμ‘°ν•˜λŠ” 것은 μž˜λͺ»λœ λ©”λͺ¨λ¦¬ 접근을 μ΄ˆλž˜ν•  수 μžˆλ‹€.

 

 

(잘λͺ»λœ μ˜ˆμ‹œ, λΆˆμ•ˆμ „ν•œ μ°Έμ‘°) : μ§€μ—­λ³€μˆ˜μ˜ μ°Έμ‘°λ₯Ό λ°˜ν™˜ν•˜λ©΄ μ•ˆλœλ‹€.

int& badFunction() {
    int x = 10;
    return x;  // 잘λͺ»λœ μ½”λ“œ: xλŠ” ν•¨μˆ˜κ°€ λλ‚˜λ©΄ 사라짐

 

 

(μ•ˆμ „ν•œ μ°Έμ‘° 및 포인터 λ°˜ν™˜)

- global (μ „μ—­) λ³€μˆ˜μ— λŒ€ν•œ μ°Έμ‘°/포인터 λ°˜ν™˜

- static(정적 λ³€μˆ˜ μ‚¬μš©ν•œ) 지역 λ³€μˆ˜μ— λŒ€ν•œ μ°Έμ‘°/포인터 λ°˜ν™˜ : 정적 λ³€μˆ˜λŠ” ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ  λ•ŒκΉŒμ§€ 수λͺ…이 μœ μ§€λ˜λ―€λ‘œ μ•ˆμ „

- ν• λ‹Ήλœ 동적 λ©”λͺ¨λ¦¬(new ν‚€μ›Œλ“œ)에 λŒ€ν•œ 포인터 λ°˜ν™˜ : 동적 λ©”λͺ¨λ¦¬ ν• λ‹Ή μ‚¬μš©

- μ°Έμ‘° λ§€κ°œλ³€μˆ˜μ— λŒ€ν•œ μ°Έμ‘°/포인터 λ°˜ν™˜

 

 

 

 

Call by Reference Pointer (포인터에 μ˜ν•œ 호좜)     vs     μ°Έμ‘°μ— μ˜ν•œ 호좜

 

 

 

 

 

const μƒμˆ˜ λ§€κ°œλ³€μˆ˜

 

- λ§€κ°œλ³€μˆ˜λ₯Ό const둜 μ„ μ–Έν•¨μœΌλ‘œμ¨ ν•΄λ‹Ή λ§€κ°œλ³€μˆ˜μ˜ 값이 ν”Όν˜ΈμΆœν•¨μˆ˜μ—μ„œ λ³€κ²½λ˜λŠ” 것을 λΆˆν—ˆν•¨

- 기본적으둜 포인터와 μ°Έμ‘°λŠ” const둜 전달 (C++ Core Guidelines)

 

 

 

 

               κ°’에 μ˜ν•œ 호좜                                    포인터에 μ˜ν•œ 호좜                              참쑰에 μ˜ν•œ 호좜