λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
C++ 기초

[C++] 11. ν•¨μˆ˜(feat. μ „μ—­ν•¨μˆ˜, λ©€λ²„ν•¨μˆ˜, μ •μ ν•¨μˆ˜, λžŒλ‹€ν•¨μˆ˜)

by μ„œμ•„λž‘πŸ˜ 2023. 4. 28.

 

 

  ν•¨μˆ˜λŠ” ν”„λ‘œκ·Έλž˜λ°μ˜ 핡심이닀. λ³€μˆ˜λŠ” 데이터고 ν•¨μˆ˜λŠ” λ™μž‘μ„ μ˜λ―Έν•œλ‹€. μš°λ¦¬λŠ” ν”„λ‘œκ·Έλž˜λ°μ„ ν†΅ν•΄μ„œ μ›ν•˜λŠ” 것을 κ΅¬ν˜„ν•΄μ•Ό ν•˜λ©°, κ΅¬ν˜„ν•˜λŠ” 방법이 ν•¨μˆ˜μΈ 것이닀. ν”„λ‘œκ·Έλž˜λ°μ€ ν•¨μˆ˜λ‘œ μ‹œμž‘ν•΄μ„œ ν•¨μˆ˜λ‘œ λλ‚œλ‹€. μ˜€λŠ˜μ€ ν•¨μˆ˜μ— λŒ€ν•΄ μ•Œμ•„λ³΄μž.

 

 

βœ… ν•¨μˆ˜μ˜ μ€‘μš”μ„±

  ν•¨μˆ˜λ₯Ό 생각할 λ•Œ, μ»΄ν“¨ν„°μ˜ κ΄€μ μ—μ„œλŠ” μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” 흐름을 λ‹΄κ³ μžˆλŠ” 곳이 ν•¨μˆ˜λ‹€. 개발자의 κ΄€μ μ—μ„œλŠ” μ½”λ“œμ˜ 가독성과 μž¬μ‚¬μš©μ„±μ„ μœ„ν•΄ μ§μ ‘λ§Œλ“œλŠ” 것을 ν•¨μˆ˜λΌκ³  μƒκ°ν•œλ‹€. λ‘˜ λ‹€ μ€‘μš”ν•˜λ‹€. 운영체제의 μ‹œμŠ€ν…œ ν•¨μˆ˜, μ–Έμ–΄μ—μ„œ μ œκ³΅ν•˜λŠ” main ν•¨μˆ˜μ™€ 같이 ν•„μˆ˜μ μΈ ν•¨μˆ˜λ“€μ΄ μžˆλ‹€. 이 ν•¨μˆ˜λ“€μ€ μ •μ˜ν•˜μ§€ μ•Šκ±°λ‚˜ 잘λͺ» κ΅¬ν˜„λ˜μ–΄ μžˆλ‹€λ©΄ 치λͺ…적인 κ²°ν•¨μœΌλ‘œ 이어지기 λ•Œλ¬Έμ— 맀우 μ€‘μš”ν•˜λ‹€κ³  ν•  수 μžˆλ‹€. ν•˜μ§€λ§Œ κ±±μ •ν•˜μ§€ 말자. μš°λ¦¬κ°€ 이런 ν•¨μˆ˜λ“€μ˜ μž‘λ™λ°©μ‹κ³Ό μ›λ¦¬κΉŒμ§€ μ•Œ ν•„μš”λŠ” μ—†λ‹€. 운영체제 컀널단을 λ§Œλ“œμ‹  ν›Œλ₯­ν•œ 뢄듀이 있기 λ•Œλ¬Έμ— μš°λ¦¬λŠ” νŽΈν•˜κ²Œ κ·Έ μœ„μ—μ„œ 뛰어놀면 λ˜λŠ” 것이닀. λ˜ν•œ μš°λ¦¬λ„ κ³ μˆ˜κ°€ 되기 μœ„ν•΄μ„œλŠ” μ‚¬μš©μž 지정 ν•¨μˆ˜(μš°λ¦¬κ°€ λ§Œλ“œλŠ” ν•¨μˆ˜)λ₯Ό 잘 λ§Œλ“€μ–΄μ•Ό ν•œλ‹€. μ•žμ„œ μ–˜κΈ°ν–ˆλ“―μ΄ ν”„λ‘œκ·Έλž¨μ€ ν•¨μˆ˜λ‘œ μ‹œμž‘ν•΄μ„œ ν•¨μˆ˜λ‘œ λλ‚˜κΈ° λ•Œλ¬Έμ— ν•¨μˆ˜λ₯Ό λ§Œλ“€ λ•Œλ„ 'μ œλŒ€λ‘œ' λ§Œλ“€ 쀄 μ•Œμ•„μ•Ό ν•œλ‹€.

 

 

βœ… ν•¨μˆ˜ 넀이밍

  이전에 κ°œλ°œμžλ“€μ—κ²Œ μ½”λ”©ν•˜λ©΄μ„œ κ°€μž₯ νž˜λ“  것이 무엇이냐고 μ‘°μ‚¬ν•œ κ²°κ³Όλ₯Ό 본적이 μžˆλ‹€. 50% κ°€κΉŒμš΄ λ‹΅λ³€μœΌλ‘œ '넀이밍'을 κΌ½μ•˜λ‹€. κΈ°λŠ₯κ΅¬ν˜„μ˜ λ³΅μž‘ν•¨μ΄λ‚˜ μ•Œ 수 μ—†λŠ” μ—λŸ¬κ°€ μ•„λ‹Œ ν•¨μˆ˜, λ³€μˆ˜μ˜ 이름짓기가 κ°€μž₯ νž˜λ“€λ‹€κ³  λ‹΅λ³€ν•œ 것이닀. ν•¨μˆ˜ 이름을 λ‚΄κ°€ μ›ν•˜λŠ” λ°©μ‹μ΄λ‚˜ μ‹¬ν”Œν•˜κ²Œ 지을 μˆ˜λ„ μžˆλ‹€. ν•˜μ§€λ§Œ 코딩은 혼자 ν•˜λŠ” 게 μ•„λ‹ˆλ‹€. λŒ€λΆ€λΆ„μ˜ κ°œλ°œμžλ“€μ€ λ‹€λ₯Έ μ‚¬λžŒμ΄ 보기에도 이 ν•¨μˆ˜μ˜ 역할이 무엇이고 λͺ©μ μ΄ 무엇인지 ν•œ λˆˆμ— 봐도 μ•Œ 수 μžˆλŠ” μ΄λ¦„μœΌλ‘œ μ§€μœΌλ €κ³  λ…Έλ ₯ν•œλ‹€. λ•Œλ¬Έμ— 넀이밍이 μ–΄λ ΅λ‹€λŠ” 것이닀.

  μš°μ„  ν•¨μˆ˜μ˜ 이름은 λ™μ‚¬λ‘œ μ‹œμž‘ν•΄μ•Ό ν•œλ‹€. ν•¨μˆ˜κ°€ ν–‰μœ„λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 것이기 λ•Œλ¬Έμ— 그에 λ§žλŠ” λ™μ‚¬λ‘œ μ‹œμž‘ν•˜λ©° 뒀에 λͺ©μ μ–΄κ°€ 였면 λœλ‹€. 예λ₯Ό λ“€μ–΄, μˆ˜μ΅μ„ κ³„μ‚°ν•˜λŠ” ν•¨μˆ˜λΌλ©΄ calcProfit 이라고 지을 수 μžˆλ‹€. λ°˜λ©΄μ— λ³€μˆ˜λŠ” λͺ…μ‚¬λ‘œ μ‹œμž‘ν•œλ‹€. μ΄μœ λŠ” κ°„λ‹¨ν•˜λ‹€. λ³€μˆ˜μ΄μž 데이터이기 λ•Œλ¬Έμ— νŠΉμ • ν–‰μœ„λ₯Ό ν•˜λŠ” 것이 μ•„λ‹ˆλ‹€. μˆ˜μ΅μ„ λœ»ν•˜λŠ” λ³€μˆ˜λŠ” 단지 profit 이라고 μ§€μœΌλ©΄ λœλ‹€. λ§Œμ•½ λ―Έμ‹€ν˜„ 손읡을 λ³€μˆ˜λ‘œ λ‚˜νƒ€λ‚΄λ €λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Όν• κΉŒ? λ‚΄ κ²½μš°λŠ” unrealizedProfit 이라고 μ§“λŠ”λ‹€. 정닡은 μ—†μ§€λ§Œ ν•¨μˆ˜λŠ” ν–‰μœ„λ₯Ό κ°•μ‘°ν•˜κ³  λ³€μˆ˜λŠ” 데이터λ₯Ό κ°•μ‘°ν•˜λ©΄ λœλ‹€.

 

 

βœ… ν•¨μˆ˜ μ’…λ₯˜

  C++μ—μ„œ ν•¨μˆ˜μ˜ μ’…λ₯˜λŠ” μ „μ—­ν•¨μˆ˜, μ •μ ν•¨μˆ˜, λ©€λ²„ν•¨μˆ˜, λžŒλ‹€ν•¨μˆ˜κ°€ μžˆλ‹€. μ „μ—­ν•¨μˆ˜μ™€ μ •μ ν•¨μˆ˜λŠ” 전역적인 νŠΉμ„±μ„ κ°–λŠ” ν•¨μˆ˜λ‹€. λ©€λ²„ν•¨μˆ˜λŠ” 클래슀의 λ©”μ†Œλ“œλ₯Ό μ˜λ―Έν•œλ‹€. λ‹€μŒ 예제λ₯Ό 톡해 μ΄ν•΄ν•΄λ³΄μž.

void calcProfit(double* profit)	// μ „μ—­ ν•¨μˆ˜
{
    *profit = *profit * 1.1;
}

class Account
{
public:
    Account();		// μƒμ„±μž
    void calcAccountProfit();	// 멀버 ν•¨μˆ˜

    static int getAccountsNum();	// 정적 ν•¨μˆ˜
}

int main()	// 메인 ν•¨μˆ˜
{
    int var = 5;
    int result = [] (int var)	// λžŒλ‹€ ν•¨μˆ˜
    {
        return var % 2 == 0 ? : var : var + 1;
    }(var);
}

  μ „μ—­ ν•¨μˆ˜μ™€ 정적 ν•¨μˆ˜, 멀버 ν•¨μˆ˜μ™€ λžŒλ‹€ ν•¨μˆ˜λ₯Ό κ°„λ‹¨ν•˜κ²Œ μž‘μ„±ν–ˆλ‹€. calcProfit은 μ „μ—­ ν•¨μˆ˜λ‘œ 동일 파일 λ‚΄μ—μ„œλŠ” μ–΄λ””μ„œλ“ μ§€ 접근이 κ°€λŠ₯ν•˜λ‹€. ν—€λ”νŒŒμΌμ„ ν™œμš©ν•œλ‹€λ©΄ λ‹€λ₯Έ νŒŒμΌμ—μ„œλ„ μ†μ‰½κ²Œ μ „μ—­ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  수 μžˆλ‹€. main ν•¨μˆ˜ λ˜ν•œ μ „μ—­ ν•¨μˆ˜λ‹€. κ°œμΈμ μœΌλ‘œλŠ” μ™„μ „ 객체 지ν–₯(λͺ¨λ“  데이터와 λ©”μ„œλ“œκ°€ ν΄λž˜μŠ€μ— 속해 μžˆλŠ” κ°œλ…)을 μΆ”κ΅¬ν•˜κΈ° λ•Œλ¬Έμ— μ „μ—­ λ³€μˆ˜λ‚˜ ν•¨μˆ˜λŠ” μ§€μ–‘ν•˜λŠ” νŽΈμ΄λ‹€.

  멀버 ν•¨μˆ˜λŠ” μ•žμœΌλ‘œ 마λ₯΄κ³  닳도둝 λ‹€λ£° μ˜ˆμ •μ΄λ‹ˆκΉŒ μ—¬κΈ°μ„œλŠ” κ°„λ‹¨ν•˜κ²Œλ§Œ λ„£μ—ˆλ‹€. Account 클래슀의 calcAccountProfitμ΄λΌλŠ” 멀버 ν•¨μˆ˜μ΄λ‹€. Account()λΌλŠ” μƒμ„±μž λ˜ν•œ 멀버 ν•¨μˆ˜μ΄λ‹€.

  정적 ν•¨μˆ˜λŠ” static으둜 뢙은 ν΄λž˜μŠ€μ— μ†ν•œ ν•¨μˆ˜μ΄λ‹€. ν΄λž˜μŠ€μ— μ†ν•˜μ§€λ§Œ μΈμŠ€ν„΄μŠ€μ™€ λ¬΄κ΄€ν•˜κ²Œ μž‘λ™ν•˜λ―€λ‘œ 클래슀 ν•¨μˆ˜λΌκ³ λ„ λΆˆλ¦°λ‹€. 정적 ν•¨μˆ˜μ—μ„œλŠ” 정적 λ³€μˆ˜λ‚˜ μ „μ—­ λ³€μˆ˜λ§Œ μ‚¬μš©ν•  수 있고 λ©€λ²„λ³€μˆ˜λŠ” μ‚¬μš©ν•  수 μ—†λ‹€.

  λžŒλ‹€ ν•¨μˆ˜λŠ” 읡λͺ… ν•¨μˆ˜λ‘œλ„ 뢈리며, ν•¨μˆ˜ λ‚΄μ—μ„œλ„ μ¦‰μ‹œ ν•„μš”ν•œ ν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄ λ‚Ό λ•Œ μœ μš©ν•˜λ‹€. 보톡 functionμ΄λ‚˜ ν•¨μˆ˜ 포인터λ₯Ό λ„˜κ²¨ 쀄 κ²½μš°κ°€ λ§Žλ‹€. 예λ₯Ό λ“€μ–΄ callbackν•¨μˆ˜λ₯Ό λ“±λ‘ν•œλ‹€κ±°λ‚˜ κ°„λ‹¨ν•œ μŠ€λ ˆλ“œλ₯Ό λ§Œλ“œλŠ” κ²½μš°μ— ꢅ이 ν•¨μˆ˜λ₯Ό λ”°λ‘œ λ§Œλ“€μ§€ μ•Šκ³  λ°”λ‘œ μ‹€ν–‰ κ°€λŠ₯ν•œ ν•¨μˆ˜λ₯Ό λ§Œλ“€ λ•Œ 쓰인닀. μ‹€μ œ μ‚¬μš© μ˜ˆμ œλŠ” 반볡문 심화 μ±•ν„°μ˜ find_if에 λ“€μ–΄κ°€λŠ” λžŒλ‹€ ν•¨μˆ˜λ₯Ό μ°Έκ³ ν•˜μž.

 

 

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

  ν•¨μˆ˜ μ˜€λ²„λ‘œλ”©μ΄λž€ 같은 ν•¨μˆ˜ 이름을 μ“°λ©΄μ„œ λ§€κ°œλ³€μˆ˜μ˜ κ°œμˆ˜λ‚˜ νƒ€μž…μ„ λ‹€λ₯΄κ²Œ ν•΄μ„œ 마치 λ‹€λ₯Έ ν•¨μˆ˜μ²˜λŸΌ μΈμ‹ν•˜κ²Œ ν•˜λŠ” 것이닀. μ»΄νŒŒμΌλŸ¬κ°€ ν•¨μˆ˜ 뢀뢄을 컴파일 ν•  λ•Œ λ‚΄λΆ€μ μœΌλ‘œ ν•¨μˆ˜μ΄λ¦„κ³Ό λ§€κ°œλ³€μˆ˜μ˜ κ°œμˆ˜μ™€ νƒ€μž…μ„ λ¬Άμ–΄μ„œ μœ λ‹ˆν¬ν•œ ν•¨μˆ˜ μ΄λ¦„μœΌλ‘œ λ§Œλ“€μ–΄ λ‚Έλ‹€. 이λ₯Ό ν™œμš©ν•˜μ—¬ ν•¨μˆ˜ 이름은 κ°™μ§€λ§Œ λ§€κ°œλ³€μˆ˜λ₯Ό λ‹€λ₯΄κ²Œ ν•΄μ„œ λ‹€λ₯΄κ²Œ λ™μž‘ν•˜λŠ” ν•¨μˆ˜λ“€μ„ λ§Œλ“€ 수 μžˆλ‹€. 

#include <iostream>

void printArguments(int var1)
{
	std::cout << "you call fisrt func => " << var1 << endl;
}
void printArguments(int var1, var2)
{
	std::cout << "you call second func => " << var1 << ", " << var2 << endl;
}
void printArguments(double var1)
{
	std::cout << "you call third func => " << var1 << endl;
}

void printArguments(double var1, int var2);
{
	std::cout << "you call fourth func => " << var1 << ", " << var2 << endl;
}

int main()
{
	printArguments(4);
    printArguments(4,7);
    printArguments(3.3);
    printArguments(3.3,12);
}
// μ‹€ν–‰κ²°κ³Ό
// you call fisrt func => 4
// you call second func => 4, 7
// you call third func => 3.3
// you call fourth func => 3.3, 12

  ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„°μ˜ νƒ€μž…κ³Ό κ°œμˆ˜μ— 따라 ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜κ°€ λ‹€λ₯Έ 것을 μ•Œ 수 μžˆλ‹€. 이처럼 ν•¨μˆ˜ μ˜€λ²„λ‘œλ”©μ„ 톡해 ν•¨μˆ˜ 이름은 κ°™μ§€λ§Œ λ‹€λ₯΄κ²Œ μΈμ‹ν•˜λŠ” ν•¨μˆ˜λ“€μ„ μ—¬λŸ¬κ°œ λ§Œλ“€ 수 μžˆλ‹€. 참고둜 ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λ₯Ό νŒŒλΌλ―Έν„°λΌκ³  ν•˜κ³  μ‹€μ œλ‘œ ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„°λ‘œ λ“€μ–΄κ°€λŠ” λ³€μˆ˜λ₯Ό 인자(Argument)라고 ν•œλ‹€.

 

  ν•¨μˆ˜λŠ” μ•žμœΌλ‘œλ„ 계속 λ“±μž₯ν•  것이닀. 가상 ν•¨μˆ˜, ν•¨μˆ˜ν¬μΈν„°μ™€ 같은 쑰금 더 μ–΄λ €μš΄ κ°œλ…λ“€λ„ μžˆλ‹€. ν•¨μˆ˜λŠ” 좔후에도 이야기 ν•  뢀뢄이 많기 λ•Œλ¬Έμ— μ°¨κ·Όμ°¨κ·Ό μ§„ν–‰ν•΄λ³΄μž. 

λŒ“κΈ€