c & c++

[C++] ν•¨μˆ˜, 참쑰자, λ””ν΄νŠΈ 인수, ν•¨μˆ˜ μ˜€λ²„λ‘œλ”©, ν•¨μˆ˜ μ˜€λ²„λΌμ΄λ”©, 인라인 ν•¨μˆ˜

쑰밈밍 2022. 9. 20. 15:19

πŸ’‘ ν•¨μˆ˜ 포인터 

: ν•¨μˆ˜μ˜ 이름 == λ©”λͺ¨λ¦¬μ— μ˜¬λΌκ°„ ν•¨μˆ˜μ˜ μ‹œμž‘ μ£Όμ†Œλ₯Ό κ°€λ¦¬ν‚€λŠ” 포인터 μƒμˆ˜

void (*ptr_func)(int, int);

: ν•¨μˆ˜λ₯Ό 또 λ‹€λ₯Έ ν•¨μˆ˜μ˜ 인수둜 μ „λ‹¬ν• λ•Œ 유용

 

πŸ’‘ 참쑰자 reference

: 크기가 큰 ꡬ쑰체와 같은 데이터λ₯Ό ν•¨μˆ˜μ˜ 인수둜 전달할 λ•Œ μ‚¬μš©

: 참쑰자λ₯Ό μ΄μš©ν•΄ 연산을 μˆ˜ν–‰ -> μ°Έμ‘° λ³€μˆ˜ 뿐만 μ•„λ‹ˆλΌ λŒ€μƒ λ³€μˆ˜λ„ λ³€κ²½

int x = 10; // λ³€μˆ˜μ˜ μ„ μ–Έ
int& y = x; // 참쑰자 μ„ μ–Έ

cout << "x : " << x << ", y : " << y << endl;
y++;        // 참쑰자λ₯Ό μ΄μš©ν•œ 증가 μ—°μ‚°
cout << "x : " << x << ", y : " << y << endl;
cout << "x의 μ£Όμ†Œκ°’ : " << &x << ", y의 μ£Όμ†Œκ°’ : " << &y;

: & νƒ€μž…μ„ μ‹λ³„ν•˜κΈ° μœ„ν•΄ μ‹λ³„μžλ‘œ μ‚¬μš©

ex) int& : intν˜• λ³€μˆ˜μ— λŒ€ν•œ μ°Έμ‘°

❗ 참쑰자의 νƒ€μž…μ€ λŒ€μƒμ΄ λ˜λŠ” λ³€μˆ˜μ˜ νƒ€μž…κ³Ό μΌμΉ˜ν•΄μ•Όν•œλ‹€.

❗ μ„ μ–Έκ³Ό λ™μ‹œμ— μ΄ˆκΈ°ν™”κ°€ λ˜μ–΄μ•Όν•œλ‹€.

❗ ν•œλ²ˆ μ΄ˆκΈ°ν™”λ˜λ©΄, μ°Έμ‘°ν•˜λŠ” λŒ€μƒμ„ λ³€κ²½ν•  수 μ—†λ‹€.

 

πŸ’‘ 참쑰자 : ν•¨μˆ˜μ˜ μΈμˆ˜λ‘œμ„œ 전달

: ν•¨μˆ˜κ°€ 참쑰자λ₯Ό 인수둜 μ „λ‹¬λ°›μœΌλ©΄, μ°Έμ‘°μžκ°€ μ°Έμ‘°ν•˜κ³  μžˆλŠ” μ‹€μ œ λ³€μˆ˜μ˜ 값을 ν•¨μˆ˜ λ‚΄μ—μ„œ μ‘°μž‘ν•¨

int main(void)
{
    int num1 = 3, num2 = 7;
    cout << "λ³€κ²½ μ „ num1의 값은 " << num1 << "이며, num2의 값은 " << num2 << "μž…λ‹ˆλ‹€." << endl;
    Swap(num1, num2);
    cout << "λ³€κ²½ ν›„ num1의 값은 " << num1 << "이며, num2의 값은 " << num2 << "μž…λ‹ˆλ‹€." << endl;

    return 0;
}

void Swap(int& x, int& y)
{
    int temp;

    temp = x;
    x = y;
    y = temp;
}

 

πŸ’‘ ꡬ쑰체의 μ°Έμ‘°

: μ°Έμ‘°λ₯Ό μ‚¬μš©ν•˜λŠ” μ΄μœ κ°€ ꡬ쑰체의 μ°Έμ‘°κ°€ λ§Žλ‹€

struct Book
{
    string title;
    string author;
    int price;
};

void Display(const Book&);

int main(void)
{
    Book web_book = {"HTMLκ³Ό CSS", "홍길동", 28000};
    Display(web_book);

    return 0;
}

void Display(const Book& bk)
{
    cout << "μ±…μ˜ 제λͺ©μ€ " << bk.title << "이고, ";
    cout << "μ €μžλŠ” " << bk.author << "이며, ";
    cout << "가격은 " << bk.price << "μ›μž…λ‹ˆλ‹€.";
}

 

πŸ’‘ λ””ν΄νŠΈ 인수 

: 기본값이 미리 μ •μ˜λ˜μ–΄ μžˆλŠ” 인수

1. ν•¨μˆ˜μ˜ μ›ν˜•μ—λ§Œ μ§€μ •ν•  수 μžˆλ‹€.

2. κ°€μž₯ 였λ₯Έμͺ½λΆ€ν„° μ‹œμž‘ν•˜μ—¬ μˆœμ„œλŒ€λ‘œλ§Œ μ§€μ •ν•  수 μžˆλ‹€

3. κ°€μš΄λ° μΈμˆ˜λ“€λ§Œ λ³„λ„λ‘œ λ””ν΄νŠΈ 인수λ₯Ό μ§€μ •ν•  μˆ˜λŠ” μ—†λ‹€.

: ν•¨μˆ˜λ‘œ μ „λ‹¬λœ μΈμˆ˜λŠ” μ™Όμͺ½λΆ€ν„° μˆœμ„œλŒ€λ‘œ λ§€κ°œλ³€μˆ˜ λͺ©λ‘μ— λŒ€μž…λœλ‹€

: 인수의 전달을 κ±΄λ„ˆλ›Έ 수 μ—†λ‹€ 

void Display(int x, int y, char ch = 'a', int z = 4); // ν•¨μˆ˜μ˜ μ›ν˜•

1. Display(1, 2);         // κ°€λŠ₯함 -> display(1, 2, 'a', 4)와 κ°™μŒ.
2. Display(3, 4, 'b');    // κ°€λŠ₯함 -> display(3, 4, 'b', 4)와 κ°™μŒ.
3. Display(5, 6, 'c', 9); // κ°€λŠ₯함 -> display(5, 6, 'c', 8)와 κ°™μŒ.
4. Display(7, 8, , 9);    // 였λ₯˜ : 인수 전달은 κ±΄λ„ˆλ›Έ 수 μ—†μŒ.

 

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

: 같은 μ΄λ¦„μ˜ ν•¨μˆ˜λ₯Ό μ€‘λ³΅ν•˜μ—¬ μ •μ˜ -> 각 ν•¨μˆ˜λ§ˆλ‹€ λ§€κ°œλ³€μˆ˜κ°€ λ‹€λ₯΄λ‹€

: μ—¬λŸ¬ ν•¨μˆ˜λ₯Ό ν•˜λ‚˜μ˜ μ΄λ¦„μœΌλ‘œ μ—°κ²°

: 같은 일을 μ²˜λ¦¬ν•˜λŠ” ν•¨μˆ˜λ₯Ό λ§€κ°œλ³€μˆ˜μ˜ ν˜•μ‹μ„ μ‘°κΈˆμ”© λ‹¬λ¦¬ν•˜μ—¬, ν•˜λ‚˜μ˜ μ΄λ¦„μœΌλ‘œ μž‘μ„±ν•˜κ²Œ 함

: == λ‹€ν˜•μ„±μ˜ ꡬ성

: μ˜€λ²„λ‘œλ”©λœ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ 같은 μ‹œκ·Έλ‹ˆμ²˜λ₯Ό κ°€μ§€λŠ” ν•¨μˆ˜μ˜ μ›ν˜•μ„ μ°Ύμ•„ ν˜ΈμΆœν•œλ‹€.

1. void Display(const char* str, int n);             // λ¬Έμžμ—΄ str을 n번 좜λ ₯함.
2. void Display(const char* str1, const char* str2); // λ¬Έμžμ—΄ str1κ³Ό str2λ₯Ό 연달아 좜λ ₯함.
3. void Display(int x, int y);                       // x * yλ₯Ό 좜λ ₯함.
4. void Display(double x, double y);                 // x / yλ₯Ό 좜λ ₯함.

Display("C++", 3);              // 1번 Display() ν•¨μˆ˜ 호좜 -> "C++C++C++"
Display("C++", " Programming"); // 2번 Display() ν•¨μˆ˜ 호좜 -> "C++ Programming"
Display(3, 4);                  // 3번 Display() ν•¨μˆ˜ 호좜 -> 12
Display(4.2, 2.1);              // 4번 Display() ν•¨μˆ˜ 호좜 -> 2
Display(4.2, 3);                // 3번과 4번 λͺ¨λ‘ 호좜 κ°€λŠ₯ -> 컴파일 였λ₯˜κ°€ λ°œμƒν•¨.

 

πŸ’‘ ν•¨μˆ˜ μ˜€λ²„λΌμ΄λ”©

: 이미 μ •μ˜λœ ν•¨μˆ˜λ₯Ό λ¬΄μ‹œν•˜κ³ , 같은 μ΄λ¦„μ˜ ν•¨μˆ˜λ₯Ό μƒˆλ‘­κ²Œ μ •μ˜ν•˜λŠ” 것

: 멀버 ν•¨μˆ˜μ˜ λ™μž‘λ§Œμ„ μž¬μ •μ˜ν•˜λŠ” 것, ν•¨μˆ˜μ˜ μ›ν˜•μ€ κΈ°μ‘΄ 멀버 ν•¨μˆ˜μ˜ μ›ν˜•κ³Ό κ°™μ•„μ•Όν•œλ‹€.

☞ νŒŒμƒ ν΄λž˜μŠ€μ—μ„œ 직접 μ˜€λ²„λΌμ΄λ”©

void Person::ShowPersonInfo()	// Person 클래슀
{
    cout << name_ << "의 λ‚˜μ΄λŠ” " << age_ << "μ‚΄μž…λ‹ˆλ‹€." << endl;
}

...

void Student::ShowPersonInfo()	// StudentλŠ” Person의 νŒŒμƒν΄λž˜μŠ€
{
	// μž¬μ •μ˜ν•œ ν•¨μˆ˜
    cout << "이 ν•™μƒμ˜ ν•™λ²ˆμ€ " << student_id_ << "μž…λ‹ˆλ‹€." << endl;
}

Student kim(20220920, "μ‚¬λžŒ", 20);
kim.ShowPersonInfo();
// νŒŒμƒ ν΄λž˜μŠ€μ—μ„œ 기초 클래슀의 μ›λž˜ 멀버 ν•¨μˆ˜ 호좜
kim.Person::ShowPersonInfo();

* Student κ°μ²΄λŠ” μžμ‹ μ΄ μž¬μ •μ˜ν•œ ShowPersonInfo() + 기초 클래슀의 μ›λž˜ ν•¨μˆ˜ λ‘˜λ‹€ 호좜

 

 

πŸ’‘ 인라인 ν•¨μˆ˜

: ν•¨μˆ˜ 호좜 -> (μŠ€νƒ) λ§€κ°œλ³€μˆ˜, 호좜 λλ‚œλ’€ λŒμ•„κ°ˆ μ£Όμ†Œκ°’ μ €μž₯ -> (μŠ€νƒ)μ§€μ—­ λ³€μˆ˜ μ €μž₯ -> 호좜 λλ‚œλ’€ μ €μž₯된 μ£Όμ†Œκ°’μœΌλ‘œ λŒμ•„κ°„λ’€ -> μŠ€νƒμ— μ €μž₯된 ν•¨μˆ˜ 정보 제거

 : 호좜될 λ•Œ ν•¨μˆ˜μ˜ λͺ¨λ“  μ½”λ“œλ₯Ό 호좜된 μžλ¦¬μ— λ°”λ‘œ μ‚½μž…ν•˜λŠ” 방식

: ν•¨μˆ˜ ν˜ΈμΆœμ‹œκ°„ μ ˆμ•½, 호좜 κ³Όμ •μœΌλ‘œ μƒκΈ°λŠ” μ—¬λŸ¬κ°€μ§€ 이점 포기

inline int Sub(int x, int y) 
{ 
	return x - y; 
}

inline void Print(int x) 
{ 
	cout << "계산 κ²°κ³ΌλŠ” " << x << "μž…λ‹ˆλ‹€."; 
}

int main(void)
{
    int num1 = 5, num2 = 3;
    int result;
    result = Sub(num1, num2);
    Print(result);

    return 0;
}

 

πŸ’‘ 맀크둜 ν•¨μˆ˜

: #define ν•¨μˆ˜μ˜ μ •μ˜

: λͺ¨λ“  인수λ₯Ό κ΄„ν˜Έ({})둜 κ°μ‹Έμ•Όν•œλ‹€.

#include <stdio.h>
#define SQR(X) X*X

int main(void)
{
    int result;
    int x = 5;

    puts(SQR(10));	// 100
    puts(SQR(x));	// 25
    puts(SQR(x+3));	// 23
    
    return 0;
}