42seoul/projects

[CPP Module] 02

moaoh 2023. 7. 25. 00:02

ํ•„์š”ํ•œ ๊ฐœ๋…์ •๋ฆฌ

New rules

cpp02๋ฅผ ์ง„ํ–‰ํ• ๋•Œ๋Š” ๋”ฐ๋กœ ๋ช…์‹œ๊ฐ€ ๋˜์ง€์•Š์€ ๊ฒฝ์šฐ์—๋Š” 4๊ฐ€์ง€๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ํฌํ•จํ•˜๊ณ  ์žˆ์–ด์•ผํ•œ๋‹ค๊ณ  ๋ช…์‹œ๊ฐ€ ๋˜์–ด์žˆ๋‹ค.

 

Default constructor ( ๊ธฐ๋ณธ ์ƒ์„ฑ์ž )

ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๊ฐ€ ์ธ์Šคํ„ด์Šคํ™”๋  ๋•Œ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ํŠน์ˆ˜ํ•œ ์ข…๋ฅ˜์˜ ๋ฉค๋ฒ„ ํ•จ์ˆ˜

(์ƒ์„ฑ์ž๋กœ ์ง€์ •์„ ํ• ๋ ค๋ฉด class๋ช…๊ณผ ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•ด์•ผํ•œ๋‹ค. ๋ฐ›๋Š”์ธ์ž x)

class Fixed
{
private:
	int		value;
	static const int integer = 8;
public:
	// **Default constructor**
	Fixed();
}

๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์งˆ๋•Œ Default constructor๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  ๊ทธ๊ฒƒ์— ํ•ด๋‹น๋˜๋Š” ๋‚ด์šฉ์ด ์‹คํ–‰๋œ๋‹ค.

 

Copy constructor ( ๋ณต์‚ฌ ์ƒ์„ฑ์ž )

๊ธฐ์กด์— ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ์ƒ์„ฑ ํ•˜๋Š” ํ•จ์ˆ˜

class Fixed
{
private:
	int		value;
	static const int integer = 8;
public:
	// **Copy constructor**
	Fixed( const Fixed& fixed );
};
Fixed a;
Fixed b(a);

์œ„์™€ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ a๋ฅผ ์ธ์šฉํ•˜์—ฌ b๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•

Copy assignment operator ( ๋ณต์‚ฌ ํ• ๋‹น ์ƒ์„ฑ์ž )

์ด๋ฏธ ์ƒ์„ฑ๋œ ๊ฐ์ฒด์— ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜

class Fixed
{
private:
	int		value;
	static const int integer = 8;
public:
	// Copy assignment operator
	Fixed &operator = (const Fixed &other);

	~Fixed();
};
c = b;

์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๊ธฐ์กด์— ์ด๋ฏธ ์ƒ์„ฑ์ด ๋˜์–ด์žˆ๋Š” ๊ฐ์ฒด์— ๊ฐ’์„ ๋ฎ์–ด์”Œ์šฐ๋Š” ๋ฐฉ์‹

Destructor ( ์†Œ๋ฉธ์ž )

๊ฐ์ฒด๊ฐ€ ์†Œ๋ฉธ๋ ๋•Œ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ์ด ๋˜๋Š” ํ•จ์ˆ˜

(class๋ช…๊ณผ ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ํ•จ์ˆ˜์ด๋ฆ„์œผ๋กœ ํ•ด์•ผํ•˜์ง€๋งŒ ์†Œ๋ฉธ์ž์˜ ๊ฒฝ์šฐ์—๋Š” ์•ž์— “~”์„ ๋ถ™์—ฌ์•ผํ•œ๋‹ค)

class Fixed
{
private:
	int		value;
	static const int integer = 8;
public:
	// **Destructor**
	~Fixed();
};

๊ฐ์ฒด๊ฐ€ delete fixed; ํ˜•์‹์œผ๋กœ ์‚ญ์ œ๋˜๊ฑฐ๋‚˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ํ•จ์ˆ˜๊ฐ€ ๋์ด๋‚˜๋ฉด ์†Œ๋ฉธ์ž ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.


ex00

์ง€๊ธˆ ๊นŒ์ง€ ์‚ฌ์šฉํ–ˆ๋˜ ์ •์ˆ˜ํ˜•์ด๋‚˜ ๋ถ€๋™ ์†Œ์ˆ˜์ ๊ณผ๋Š” ๋‹ค๋ฅธ ๊ณ ์ • ์†Œ์ˆ˜์ ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ex00์˜ ๋ชฉํ‘œ

cpp์—์„œ๋Š” ๊ณ ์ • ์†Œ์ˆ˜์ ์ด๋ผ๋Š” ๊ฐœ๋… ์ง€์›์ด ์•ฝํ•ด์„œ ์ง์ ‘ ๊ตฌํ˜„์„ ํ•˜๋Š” ๊ณผ์ •์„ ์‹œํ‚จ๋‹ค.

ex00์—์„œ๋Š” ๊ณ ์ • ์†Œ์ˆ˜์ ์„ ๊ตฌํ˜„ํ•˜๊ธฐ์ „์— ๊ธฐ๋ณธ ๋ฐ”ํƒ•์ด ๋˜๋Š” ํ•จ์ˆ˜๋“ค์˜ ๊ตฌํ˜„์ด ํ•„์š”ํ•˜๋‹ค.
New rules์— ์žˆ๋Š” 4๊ฐœ์˜ ํ•จ์ˆ˜๊ฐ€ ๊ตฌํ˜„์ด ๋˜์–ด์•ผํ•œ๋‹ค.

 

const

int getRawBits( void ) const;

์œ„์™€ ๊ฐ™์€ ํ˜•์‹๊ฐ™์ด ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ํ•จ์ˆ˜์—๋Š” const ๋ถ™์„ ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. ์œ„์™€ ๊ฐ™์ด ํ•จ์ˆ˜์˜ const๊ฐ€ ๋ถ™์€ ์˜๋ฏธ๋Š” ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค ๋ผ๋Š” ์˜๋ฏธ๋กœ const๋ฅผ ๋ถ™์ด๊ณ , ****์‹ค์ œ๋กœ๋„ const๊ฐ€ ๋ถ™์€ ํ•จ์ˆ˜์—์„œ๋Š” ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋‹ค.

static

ex00์—์„œ ๋น„ํŠธ ์ˆ˜๋ฅผ ์ €์žฅ์„ ํ•  integer๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•˜๋Š”๋ฐ ๊ณผ์ œ์—์„œ๋Š” integer๋ฅผ static์œผ๋กœ ๋งŒ๋“ค๋ผ๊ณ  ์ œ์‹œ๊ฐ€ ๋˜์–ด์žˆ๋‹ค.

๊ทธ๋ž˜์„œ class์—์„œ ์‚ฌ์šฉ๋˜๋Š” static์ด ๋ฌด์—‡์ด๊ธธ๋ž˜ static์œผ๋กœ ๋งŒ๋“ค๋ผ๊ณ  ํ•˜๋Š”๊ฑธ๊นŒ ๋ผ๋Š” ์˜๋ฌธ์ ์ด ์ƒ๊ฒจ ์ฐพ์•„๋ณด๋‹ˆ class๋‚ด๋ถ€์— ์ƒ์„ฑ๋œ static ๋ณ€์ˆ˜๋Š” ํ•ด๋‹นํด๋ž˜์Šค์—์„œ ๊ณต์œ ๊ฐ€ ๋˜๋Š” ๋ณ€์ˆ˜๋ผ๊ณ  ํ•œ๋‹ค.

// class 
class Test
{
private:
		static int	num;
};

// ----------------------------------------------------------------------------

Test a;
Test b;

์œ„์™€ ๊ฐ™์ด static์œผ๋กœ ์„ ์–ธ์ด ๋˜์–ด์žˆ๋‹ค๋ฉด a์— ์žˆ๋Š” ๊ฐ’๊ณผ b์˜ ์žˆ๋Š” ๊ฐ’์ด ์„œ๋กœ ๊ณต์œ ๊ฐ€ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด๋œ๋‹ค.

๋Œ€์ž… ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ

 

operator overloading - cppreference.com

Customizes the C++ operators for operands of user-defined types. [edit] Syntax Overloaded operators are functions with special function names: operator op (1) operator type (2) operator new operator new [] (3) operator delete operator delete [] (4) operato

en.cppreference.com

class A;
class B;

A = B;

์œ„์™€ ๊ฐ™์ด class์— class๋ฅผ ‘=’ ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด์„œ ๋ฎ์–ด ์”Œ์šฐ๋ ค๊ณ  ํ•  ๊ฒฝ์šฐ A์™€ B ๋ชจ๋‘ classํ˜•ํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€์ž…์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ทธ๋ž˜์„œ ์œ„์™€ ๊ฐ™์€ ๊ฒฝ์šฐ ํ•ด๊ฒฐ์„ ํ• ๋ ค๋ฉด

Class &Class::operator = ( const Class& Class )
{
}

์œ„์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ operator๋ฅผ ์„ ์–ธ์„ ํ•ด์ค˜์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ‘=’ ์ด๋ผ๋Š” ์—ฐ์‚ฐ์ž๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜๋กœ ๋“ค์–ด์˜ค๊ฒŒ๋˜์–ด ์–ด๋– ํ•œ ๋™์ž‘์„ ํ• ๊ฒƒ์ธ์ง€ ์ง€์ •์„ ํ•ด์ค„ ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ ๊ณผ์ œ์—์„œ๋Š” ๋Œ€์ž… ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ์„ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค.

class a( 10 );
class b = a;

์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ์—์„œ class b์— a๋ฅผ ๋Œ€์ž…ํ•˜๋Š” ๊ฒฝ์šฐ์ด๋ฉด b๋ผ๋Š” class๊ฐ€ ์ฃผ์ฒด๊ฐ€ ๋˜๊ณ  a๋ผ๋Š” ํด๋ž˜์Šค๋Š” ๋งค๊ฐœํ•จ์ˆ˜์— ๋“ค์–ด์˜ค๋Š” ์ธ์ž๊ฐ€ ๋œ๋‹ค๊ณ  ์ƒ๊ฐ์„ ํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ์ฆ‰ b == this ์ด๊ณ  a == Class ๋ผ๊ณ  ์ƒ๊ฐ์„ ํ•ด์•ผํ•œ๋‹ค.

 

์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ (operator overloading)

์˜ค๋ฒ„๋กœ๋”ฉ

๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„์€ 1๊ฐœ๋กœ ์ฃผ๊ณ  ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋‹ค๋ฅด๊ฒŒ ํ•˜๋Š” ํ˜•์‹์œผ๋กœ ๋ฉ”์„œ๋“œ๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ ๋งŒ๋“œ๋Š” ๊ฒƒ

int sum(int a, int b)
{
	return a + b;
}

double sum(double a, double b)
{
	return a + b;
}

์œ„์™€ ๊ฐ™์ด ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž๋ฃŒํ˜•์— ๋งž๊ฒŒ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰์ด ๋œ๋‹ค๊ณ  ํ•œ๋‹ค.

์‹ ๊ธฐํ•˜๋„ค..


*this์™€ this

this : ์ž๊ธฐ ์ž์‹ ์˜ ๊ฐ์ฒด

*this : ์ž๊ธฐ ์ž์‹ ์˜ ํด๋ž˜์Šค ๊ทธ ์ž์ฒด

 

C++ this ํฌ์ธํ„ฐ?? ๊ทธ๋Ÿผ *this ๋Š” ๋ญ์ง€?

โ€ป *this์— ๋Œ€ํ•œ ์„ค๋ช…์€ ๋งจ ์•„๋ž˜์— ์„ค๋ช…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋งจ ์•„๋ž˜๋งŒ ๋ณด๋ฉด ์ดํ•ด๊ฐ€ ์ž˜ ๊ฐ€์ง€ ์•Š์„ํ…Œ๋‹ˆ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ฐจ๊ทผ์ฐจ๊ทผ ์ฝ์–ด์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.^^ ๋˜ํ•œ ์„ค๋ช… ์ค‘ C++์˜ '์ฐธ์กฐ์ž'์™€ ํฌ์ธํ„ฐ์˜ '๊ฐ’์˜ ์ฐธ์กฐ' ๋ถ€

hwan-shell.tistory.com

 

 

C++ 09.10 - this ํฌ์ธํ„ฐ

this ํฌ์ธํ„ฐ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๊ฐ€์žฅ ๋งŽ์€ ์งˆ๋ฌธ ์ค‘ ํ•˜๋‚˜๋Š” "ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ C++๋Š” ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœํ•  ๊ฐ์ฒด(์ธ์Šคํ„ด์Šค)๋ฅผ ์ฐพ๋Š”๊ฐ€?" ์ด๋‹ค. ์ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ์ •๋‹ต์€ this๋ผ๋Š” ์ˆจ๊ฒจ์ง„

boycoding.tistory.com

์œ„์— ๊ธ€๋“ค์— ์ž์„ธํ•˜๊ฒŒ ์„ค๋ช…์ด ๋˜์–ด์žˆ๋Š” ๊ฑฐ ๊ฐ™๋‹ค.

๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌํ•˜์ž๋ฉด

this๋Š” ์ž๊ธฐ ์ž์‹ ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฑฐ๊ณ 

*this๋Š” ์ž๊ธฐ ์ž์‹ ์˜ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.


ex01

ex00์—์„œ ์กฐ๊ธˆ ๋” ๋ฐœ์ „๋˜์–ด์„œ ์ถœ๋ ฅ๊ณผ ๊ณ ์ •์†Œ์ˆ˜์ ์— ๋Œ€ํ•ด์„œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ๋‹ค๋ฃจ๋Š” ํŒŒํŠธ

roundf (from <cmath>)

float roundf(float __x);

๋“ค์–ด์˜จ ์ธ์ž๊ฐ’์„ ๋ฐ˜์˜ฌ๋ฆผํ•ด์ฃผ๋Š” ํ•จ์ˆ˜

operator «

 

operator overloading - cppreference.com

Customizes the C++ operators for operands of user-defined types. [edit] Syntax Overloaded operators are functions with special function names: operator op (1) operator type (2) operator new operator new [] (3) operator delete operator delete [] (4) operato

en.cppreference.com

์œ„์— ์žˆ๋Š” cpp๊ณต์‹๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์ง„ํ–‰์„ ํ•˜์˜€๋‹ค.

operator << ๋„ operator = ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ class์˜ ์ถœ๋ ฅ์„ ๋”ฐ๋กœ ์ง€์›ํ•˜์ง€์•Š๋‹ค๋ณด๋‹ˆ ๊ตฌํ˜„์ด ํ•„์š”ํ•˜๊ฒŒ๋œ๋‹ค.

// operator << ๊ธฐ๋ณธํ˜•ํƒœ
std::ostream& operator<<(std::ostream& os, const T& obj)
{
    // write obj to stream
    return os;
}

์—ฌ๊ธฐ์—์„œ std::ostream ์€ ๋ฌด์—‡์ธ๊ฐ€ ์ฐพ์•„๋ณด๋‹ˆ

**ostream : ์ถœ๋ ฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํด๋ž˜์Šค**

**istream : ์ž…๋ ฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํด๋ž˜์Šค** ๋ผ๊ณ  ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๊ฐ€ ๊ตฌํ˜„์„ ํ•ด์•ผํ•˜๋Š” ๋ถ€๋ถ„์ด

std::cout << "a is " << a << std::endl; ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ถœ๋ ฅ์„ ํ•ด์ฃผ๋Š” ํด๋ž˜์Šค์ธ std::ostream์„ ์‚ฌ์šฉํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐ์„ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ์—ฐ์‚ฐ์ž์˜ ๊ฒฝ์šฐ **std::ostream**์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค๋ณด๋‹ˆ class๋‚ด๋ถ€์—์„œ๋Š” ์„ ์–ธ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋ž˜์„œ ํด๋ž˜์Šค ๋ฐ–์ธ ํ—ค๋”ํŒŒ์ผ์— ๋”ฐ๋กœ ์ •์˜๋ฅผ ํ•ด์ฃผ์—ˆ๋‹ค.

๊ณ ์ •์†Œ์ˆ˜์ 

 

 

์ปดํ“จํ„ฐ์—์„œ์˜ ์‹ค์ˆ˜ ํ‘œํ˜„: ๊ณ ์ •์†Œ์ˆ˜์  vs ๋ถ€๋™์†Œ์ˆ˜์ 

์–ด์ œ ํŠธ์œ„ํ„ฐ ํƒ€์ž„๋ผ์ธ์„ ๋ณด๋‹ค๊ฐ€, '๋ถ€๋™์†Œ์ˆ˜์ ' ์ด๋ผ๋Š” ๋‹จ์–ด๋ฅผ ๋ณด๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์„ํ•˜๊ฒŒ ๋˜๋А๋ƒ๋Š” ๊ทธ๋Ÿฐ ํŠธ์œ—์ด RT๋กœ ๋„˜์–ด์™”๋‹ค. ์ƒ๊ฐํ•ด๋ณด๋‹ˆ๊นŒ ๊ต‰์žฅํžˆ ๋น„์ง๊ด€์ ์ธ ๋‹จ์–ด๋‹ค.์›๋ž˜ ์˜์–ด๋‹จ์–ด๋Š” floating point

gsmesie692.tistory.com

์œ„์— ๊ธ€์— ์ƒ๋‹นํžˆ ์ •๋ฆฌ๊ฐ€ ์ž˜ ๋˜์–ด์žˆ๋‹ค.

๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌํ•˜์ž๋ฉด

์ •์ˆ˜๋ถ€์™€ ์†Œ์ˆ˜๋ถ€๋ฅผ 2์ง„์ˆ˜๋กœ ์ €์žฅ์„ ํ• ๋•Œ์—๋Š” ์ •์ˆ˜๋ถ€๋Š” % 2 ํ˜•ํƒœ๋กœ ๋” ์ด์ƒ ์•ˆ๋‚˜๋ˆ ์งˆ๋•Œ๊นŒ์ง€ 2์ง„์ˆ˜๋กœ ์ „ํ™˜์„ ํ•˜๊ณ  ์†Œ์ˆ˜๋ถ€๋Š” * 2 ํ˜•ํƒœ๋กœ 0์ด ๋‚˜์˜ฌ๋•Œ๊นŒ์ง€ ์ง„ํ–‰์„ ํ•˜๋ฉฐ 2์ง„์ˆ˜๋กœ ์ „ํ™˜ํ•˜์—ฌ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

10์ง„์ˆ˜๋ฅผ 2์ง„์ˆ˜๋กœ ๋ฐ”๊ฟ€ ๋•Œ ์ •์ˆ˜๋ถ€๋Š” / 2 ํ˜•ํƒœ๋กœ ์ง„ํ–‰์„ ํ•˜๊ณ  ์‹ค์ˆ˜๋ถ€๋Š” * 2 ํ˜•ํƒœ๋กœ ์ง„ํ–‰์„ ํ•˜๋ฉด ๋œ๋‹ค.

ํ•˜์ง€๋งŒ ์ด ๊ณผ์ œ๋ฅผ ์ง„ํ–‰ํ• ๋–„๋Š” ์œ„์— ์ ์€ ๊ธ€์ฒ˜๋Ÿผ ์ง„ํ–‰์ด๋˜์ง€๋Š” ์•Š๊ณ  10์ง„์ˆ˜๋ฅผ ๋น„ํŠธ์—ฐ์‚ฐ์œผ๋กœ ํฌ๊ธฐ๋งŒํผ ๊ณฑํ•˜์—ฌ value์— ์ €์žฅํ•˜๊ณ , ๊ฐ’์„ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ฌ๋•Œ๋Š” ์ €์žฅํ• ๋•Œ ๊ณฑํ•˜์—ฌ ์ €์žฅํ•˜์˜€์œผ๋‹ˆ ํฌ๊ธฐ๋งŒํผ ๋‚˜๋ˆ ์„œ ๋‹ค์‹œ ๊ฐ’์„ ๋นผ์˜ค๋Š”ํ˜•ํƒœ๋กœ ์ง„ํ–‰์„ ํ•˜๊ฒŒ ๋œ๋‹ค.

num << 1 // ๊ณฑํ•˜๊ธฐ 2
num >> 1 // ๋‚˜๋ˆ„๊ธฐ 2

๋น„ํŠธ์—ฐ์‚ฐ์„ ํ•˜์—ฌ ์ €์žฅํ•  ๋•Œ๋Š” ๊ณฑํ•˜์—ฌ ์ €์žฅํ•˜๊ณ , ์ถœ๋ ฅํ•  ๋•Œ์—๋Š” ๋‚˜๋ˆ„์–ด ์ถœ๋ ฅํ•˜๋ฉด ํ•ด๋‹น ๋‚ด์šฉ์„ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.

๋น„ํŠธ์—ฐ์‚ฐ์€ floatํ˜•ํƒœ์—๋Š” ์ง์ ‘์ ์œผ๋กœ ํ•  ์ˆ˜ ์—†๊ธฐ๋•Œ๋ฌธ์— float์— ๋น„ํŠธ์—ฐ์ƒ์ด ํ•„์š”ํ•œ๊ฒฝ์šฐ์—๋Š” **value * (1 << size)** ํ˜•ํƒœ๋กœ ์ €์žฅ์„ ํ•˜๊ณ  value / (1 << size) ํ˜•ํƒœ๋กœ ๋‹ค์‹œ ๋นผ์˜ค๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์‹ค์ˆ˜๋ถ€๊ฐ€ ๊ฐ€์ง€๋Š” ๋น„ํŠธ์ž๋ฆฌ์˜ ์ˆ˜

std::cout์˜ ๊ธฐ๋ณธ ์ •๋ฐ€๋„๋Š” 6์ด๊ธฐ๋•Œ๋ฌธ์— ๊ณ„์‚ฐ์„ํ–ˆ์„๋•Œ ์†Œ์ˆ˜์  ์ž๋ฆฌ๊ฐ€ ์•„๋ฌด๋ฆฌ ๋งŽ์ด ๋‚˜์˜จ๋‹ค๊ณ  ํ•ด๋„

์ •์ˆ˜์ž๋ฆฌ์ˆ˜ + ์‹ค์ˆ˜์ž๋ฆฌ์ˆ˜ = 6 ์ด ๋˜์–ด์•ผ๋งŒํ•œ๋‹ค. ( ๊ทธ๋ž˜์„œ ์˜ˆ์ œ์—๋„ ๋‹ค 6์ž๋ฆฌํ˜•์‹์ธ ๊ฒƒ )

์ €์žฅ๋˜๋Š” ๊ฐ’ : 2^8 * N


ex02

ex01๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ex02์—์„œ๋Š” ๋”์šฑ ๋” ๋งŽ์€ ๋ถ€๋ถ„๋“ค์˜ ๊ตฌํ˜„์„ ์š”๊ตฌํ•˜๋Š” ํŒŒํŠธ์ด๋‹ค.

comparison operators์™€ arithmetic operators์˜ ๊ตฌํ˜„์„ ์ถ”๊ฐ€๋กœ ์š”๊ตฌํ•˜๋Š” ํŒŒํŠธ

 

operator overloading - cppreference.com

Customizes the C++ operators for operands of user-defined types. [edit] Syntax Overloaded operators are functions with special function names: operator op (1) operator type (2) operator new operator new [] (3) operator delete operator delete [] (4) operato

en.cppreference.com

๊ทธ๋ž˜์„œ ์ „๊ณผ ๊ฐ™์ด ์œ„์—์žˆ๋Š” ๋‚ด์šฉ๋“ค์„ ๋ฐ”ํƒ•์œผ๋กœ ๊ตฌํ˜„์„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

comparison operators

ํ•จ์ˆ˜์˜ ์›ํ˜•์€ ์œ„์— ๋˜‘๊ฐ™์ด ๋‚˜์™€์žˆ์—ˆ๊ณ , class๋‚ด๋ถ€์— public ํŒŒํŠธ์— ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•  ๊ฒƒ์ด๊ธฐ๋•Œ๋ฌธ์— inside๋ถ€๋ถ„์„ ์ฐธ๊ณ ํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

int a = 5;
int b = 10;

class c( 5 );
class d( 10 );

std::cout << (a > b) << "\\n"; // print : 0
std::cout << (a < b) << "\\n"; // print : 1

class๋ฅผ ๋Œ€์†Œ๋น„๊ตํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋‚ด๋ถ€์— ๋‹ด๊ธฐ๋Š” ์ˆซ์ž๊ฐ’์˜ ํฌ๊ธฐ๋ฅผ ๋น„๊ตํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ๊ฐ€ ๋˜๋ฏ€๋กœ ๊ทธ๋ƒฅ ๋ณ€์ˆ˜๋ฅผ ๋Œ€์†Œ๋น„๊ตํ–ˆ์„๋•Œ ๋‚˜์˜ค๋Š” ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

arithmetic operators

comparison operators์™€ ์ดํ•˜๋™๋ฌธ์œผ๋กœ inside๋ถ€๋ถ„์„ ์ฐธ๊ณ ํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

int a = 5;
int b = 10;

class c( 5 );
class d( 10 );

std::cout << (a + b) << "\\n"; // print : 15
std::cout << (c + d) << "\\n"; // print : 15

์ด๊ฒƒ๋„ ๋Œ€์†Œ๋น„๊ต์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ class ๋‚ด๋ถ€์— ๋“ค์–ด๊ฐ€๋Š” ๊ฐ’์„ ์„œ๋กœ ๋”ํ•ด์„œ ๊ทธ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜์ด๋ฏ€๋กœ ๋‘ ๊ฐ’์„ ์„œ๋กœ ํ•ฉ์น  ์ˆ˜ ์žˆ๋Š” ์—ฐ์‚ฐ์ž๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ๋˜๋Š” ํŒŒํŠธ์˜€์—ˆ๋‹ค.

๋Œ€์†Œ๋น„๊ต ์—ฐ์‚ฐ์ž์™€์˜ ์ฐจ์ด์ ์ด๋ผ๋ฉด ๋Œ€์†Œ๋น„๊ต ์—ฐ์‚ฐ์ž๋Š” ๋ฉค๋ฒ„ํ•จ์ˆ˜ ์ž์ฒด์˜ ๋ฐ˜ํ™˜๊ฐ’์ด bool ํ˜•ํƒœ์ด์ง€๋งŒ comparison operators์˜ ๋ฐ˜ํ™˜๊ฐ’์€ ํด๋ž˜์Šค ๊ทธ ์ž์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผํ•˜๋ฏ€๋กœ
**์ฃผ์ฒด๊ฐ€ ๋˜๋Š” class (this)**์˜ ๊ฐ’์„ ๋ณ€ํ™˜ํ•˜์—ฌ์•ผํ•œ๋‹ค.

T T::operator+(const T2 &b) const
{
	T temp = (this->num + b.num) >> n;
	return (temp);
}

๊ทธ๋ž˜์„œ ๊ฐ’์„ ๋”ฐ๋กœ ๋‹ด์ง€์•Š๋Š” ์ด์ƒ a์™€ b๋Š” ์ž„์‹œ๋กœ๋งŒ ๊ฐ’์ด ๋‹ด๊ธฐ๋Š” ๊ด€๊ณ„์ด๋ฏ€๋กœ a์™€ b์˜ ๊ฐ’์ด ์ง์ ‘์ ์œผ๋กœ ๋ณ€ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์—†์œผ๋ฏ€๋กœ ๋งค๊ฐœํ•จ์ˆ˜์— const๋ฅผ ๋ถ™์—ฌ์ฃผ๊ณ  ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ๋”ฐ๋กœ temp๋ฅผ ๋„ฃ์–ด ๊ฐ’์„ ๋ณ€ํ™”ํ•ด์ฃผ์—ˆ๋‹ค. (๋‹ค๋ฅธ ์—ฐ์‚ฐ์ž๋„ ์ดํ•˜๋™๋ฌธ)

์ถ”๊ฐ€์ ์œผ๋กœ ์œ„์˜ ํ˜•์‹์ฒ˜๋Ÿผ T temp์— ๋”ํ•œ ๊ฐ’์„ ๋‹ด์„ ๊ฒฝ์šฐ์—๋Š”

T::T( const int b )
{
	this->num = (b << n);
}

์œ„์—์žˆ๋Š” ๋งค๊ฐœํ•จ์ˆ˜ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ๊ฐ’์ด ๋“ค์–ด๊ฐ€๊ธฐ๋•Œ๋ฌธ์— ๋”ํ•œ ๊ฐ’์„ ๋‹ค์‹œ ํ’€์–ด ์ˆซ์ž๋ฅผ ์›ํ˜• ๊ทธ๋Œ€๋กœ ๋„ฃ์–ด์ฃผ์–ด์•ผํ•œ๋‹ค.

increment/decrement

์ฆ๊ฐ์—ฐ์‚ฐ์ž์—๋Š” ์ „์œ„์—ฐ์‚ฐ์ž์™€ ํ›„์œ„์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ๋‹ค.

์ € ์ค‘์— T T::operator++(int); ๋Š” ๊ทธ๋ƒฅ int๊ฐ€ ๋ถ™์–ด์žˆ๊ธธ๋ž˜ ๋ญ”๊ฐ€ํ•˜๊ณ  ๊ถ๊ธˆํ•ด์„œ ๊ฒ€์ƒ‰์„ ํ•ด๋ณด๋‹ˆ

โ€ป ํ›„์œ„ ์—ฐ์‚ฐ์ž๋ฅผ ์˜ค๋ฒ„๋กœ๋”ฉ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ int๋ฅผ ๋„˜๊ธฐ๋Š”๋ฐ ์ด๋•Œ int๋Š” ํŠน๋ณ„ํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ „์œ„/ํ›„์œ„ ์—ฐ์‚ฐ์ž์˜ ๊ตฌ๋ถ„์„ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค.

๋ผ๋Š” ๋‹ต๋ณ€์ด ์žˆ์—ˆ๋‹ค.

int a = 5, b = 5;
std::cout << ++a; // print : 6
std::cout << b++; // print : 5

์ „์œ„ ์—ฐ์‚ฐ์ž์™€ ํ›„์œ„์—ฐ์‚ฐ์ž์˜ ์ฐจ์ด์ ์€ ์ฆ๊ฐ๋˜๋Š” ์‹œ๊ฐ„๋Œ€๊ฐ€ ์ „์œ„๋Š” ์ถœ๋ ฅ์„ ํ• ๋•Œ ์ฆ๊ฐ์ด ๋œ ๋‹ค์Œ ๋ฐ”๋กœ ์ถœ๋ ฅ์ด ๋˜๊ณ , ํ›„์œ„์˜ ๊ฒฝ์šฐ ์ฆ๊ฐ์ด ๋˜๊ธฐ์ „ ์ถœ๋ ฅ์ด ๋˜๊ณ  ๊ทธ ์ดํ›„์— ์ฆ๊ฐ์ด ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ๊ตฌํ˜„์„ ํ• ๋•Œ ๊ทธ ๋ถ€๋ถ„์„ ์‹ ๊ฒฝ์จ์„œ ๊ตฌํ˜„์„ ํ•ด์คฌ์–ด์•ผํ•œ๋‹ค.

max & min

class a;

a.function();

class::max(a, b);

max๋‚˜ min ๋งค๊ฐœํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ ๋ฉ”์„œ๋“œ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ์•„์˜ˆ ๋”ฐ๋กœ ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉ์„ ํ•ด์•ผํ•˜๊ธฐ๋•Œ๋ฌธ์— static์„ ์‚ฌ์šฉํ•ด์„œ ๋งค๊ฐœํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค.

const max ์™€ ๊ทธ๋ƒฅ max๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์•ผํ•˜๋Š” ์ด์œ ๋Š” const๊ฐ์ฒด๊ฐ€ max ํ•จ์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ๊ฒฝ์šฐ์—๋Š” const max๊ฐ€ ๋ถˆ๋Ÿฌ์™€์ง€๊ณ  ๊ทธ๋ƒฅ ๊ฐ์ฒด๊ฐ€ max ํ•จ์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๊ฒฝ์šฐ์—๋Š” max ํ•จ์ˆ˜๊ฐ€ ๋ถˆ๋Ÿฌ์™€์ง„๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ 2๊ฐœ๋ฅผ ๋”ฐ๋กœ ๋”ฐ๋กœ ๊ตฌํ˜„