๋ฐ์ํ
Language
[C++] keyword: explicit
[C++] keyword: explicit
2020.07.221. ์ค๋ช
explicit ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํ์ผ๋ฌ์ ์์์ ํ๋ณํ์ ๋ง์ ์ ์๋ค. class A { public: int num; explicit A(int num) : num(num) {} }; 2. ์์ 2.1) explicit ํค์๋๋ฅผ ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ(์์์ ํ๋ณํ์ด ์ผ์ด๋ ๊ฒฝ์ฐ) #include using namespace std; class A { public: int num; A(int num) : num(num) {} }; void print_a(A a) { cout
[C++] keyword: inline, __inline, __forceinline
[C++] keyword: inline, __inline, __forceinline
2020.07.221. ์ค๋ช
1.1) inline inline ํค์๋๋ ํจ์ ํธ์ถ ์ ๋ฐ์ํ๋ ์ค๋ฒํค๋๋ฅผ ์ค์ด๊ธฐ ์ํด ํจ์๋ฅผ ํธ์ถํ๋ ๋์ ํจ์๊ฐ ํธ์ถ๋๋ ๊ณณ๋ง๋ค ํจ์์ ์ฝ๋๋ฅผ ๋ณต์ฌํด ๋ฃ์ด์ฃผ๋ ๋ฐฉ๋ฒ์ด๋ค. ๊ทธ๋ ๋ค๋ฉด ํจ์ ํธ์ถ ์ ๋ฐ์ํ๋ ์ค๋ฒํค๋๋ ๋ญ๊น? ์ค์ ๋ก ํจ์๊ฐ ํธ์ถ๋๋ ๊ณผ์ ์ ์์ฝํ๋ฉด 1. ํจ์์ ์ธ์๋ฅผ ์คํ์ ์ ์ฅ 2. ํจ์๊ฐ ๋ฆฌํด๋ ๋ ๋์์ฌ ์ฃผ์๋ฅผ ์คํ์ด๋ ๋ ์ง์คํฐ์ ์ ์ฅ 3. ํจ์์ ์์ ์ฃผ์๋ก ์ ํ 4. ํจ์์ ์ฝ๋ ์คํ 5. ํจ์์์ ๋ง๋ค์ด์ง ์ง์ญ๋ณ์, ์คํ์ ์ ์ฅ๋ ์ธ์ ํด์ , ๋ฆฌํด ๊ฐ์ ๋ ์ง์คํฐ์ ์ ์ฅ 6. ํจ์๋ฅผ ํธ์ถ ํ ๋ ์ ์ฅํด๋ ์ฃผ์๋ก ๋๋์๊ฐ ์์ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์น๋๋ฐ ๊ฐ๋จํ ํจ์๋ฅผ ํธ์ถํ๊ธฐ ์ํด์ ์ ๋ฐ ๋ช
๋ น์ด๋ค์ ์ํํด์ผ ํ๋ค๋ฉด ์ค๋ฒํค๋๊ฐ ๋ ์๋ฐ์ ์๋ค. ์ด๋ฐ ์ค๋ฒ ํค๋๋ฅผ ์ค์ด๊ธฐ ์ํด C..
[C++] keyword: const
[C++] keyword: const
2020.07.221. ์ค๋ช
const ํค์๋์ ํจ๊ป ์ ์ํ ๋ณ์์ ๊ฐ์ ์์ ์ด ๋ถ๊ฐ๋ฅํ๋ค. ์ฆ, ์์ํ ๋์ด๋ฒ๋ฆฌ๋๋ฐ ํ๋ก๊ทธ๋๋ฐ ์ ๋ฐ๋๋ฉด ์ ๋ ๊ฐ์ด ์์ ๊ฒฝ์ฐ ์ ์ฉํ๋ค. ์ฝ๋๊ฐ ๊ธธ์ด์ง ์ค์๋ก ๋ณ์์ ๊ฐ์ด ๋ฐ๋์ด ์ง๋ ๊ฒ์ ๋ฐฉ์งํ ๊ฒฝ์ฐ ํ์ฉํ ์ ์๋ค. 2. ์์ 2.1) ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ const int a = 1; a = 5; // error! ํ๋ฒ ์ค์ ๋ a๋ read-only memory์ ์ฌ๋ผ๊ฐ๊ฒ ๋๊ณ ๋ณ๊ฒฝํ ์ ์๊ฒ ๋๋ค. 2.1) ํจ์ ๋ด ์ธ์๊ฐ์์ ํ์ฉํ๋ ๊ฒฝ์ฐ class Child { public: int age; string name; string address; Child() = default; Child(int age, string name, string address) : age(age), name..
[C++11] keyword: final
[C++11] keyword: final
2020.07.221. ์ค๋ช
final ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋์ค๋ ๋ฉค๋ฒ ํจ์์ ์์์ ๋ง์ ์ ์๋ค. class Parent final // ํด๋์ค์ final ํค์๋๋ฅผ ์ฌ์ฉ ํ ๊ฒฝ์ฐ 2. ์์ 2.1) final๋ก ์ ์ธ ๋ ํด๋์ค๋ฅผ ์์ํ์ ์ #include using namespace std; class Parent final { public: Parent() { cout
[C++11] keyword: override
[C++11] keyword: override
2020.07.221. ์ค๋ช
์ค์๋ก ๊ฐ๋ฐ์๊ฐ ์ค๋ฒ๋ผ์ด๋ฉ(overriding)ํด์ผ ํ๋ ํจ์์๋ ๋ถ๊ตฌํ๊ณ ์ค๋ฒ๋ผ์ด๋ฉ์ ํ์ง ์์์ ๊ฒฝ์ฐ ์ปดํ์ผ ํ์์ ์๋ฌ๋ฅผ ๋ฐ์์์ผ ๋ฏธ์ฐ์ ์ค์๋ฅผ ๋ฐฉ์งํ ์ ์๋ค. void override_func() override { cout
[C++] keyword: virtual
[C++] keyword: virtual
2020.07.221. ์ค๋ช
์์ ํด๋์ค๊ฐ ๋ถ๋ชจ ํด๋์ค๋ฅผ ์์ํ๊ณ , ๋ถ๋ชจ ํด๋์ค์ ํจ์๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํ๋ค๊ณ ๊ฐ์ , ๋คํ์ฑ์ ์ด์ฉํด ๋ถ๋ชจ ํด๋์ค์ ํฌ์ธํฐ๋ก ์์ ์ธ์คํด์ค ์ฃผ์ ๊ฐ์ ์ง์ ํ๊ณ ์ค๋ฒ๋ผ์ด๋ฉ ํ ํจ์๋ฅผ ํธ์ถํ์ ๋ virtual ํค์๋์ ์ ๋ฌด์ ๋ฐ๋ผ ์คํ๋๋ ํจ์๊ฐ ๋ฌ๋ผ์ง๋ค. virtual ํค์๋๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๊ฐ์ ํจ์ ํ
์ด๋ธ์ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ์ฝ๊ฐ์ ์ค๋ฒํค๋๊ฐ ์กด์ฌํ๋ค. ๋ฐ๋ผ์ virtual ํค์๋๋ C++์์ default๊ฐ ์๋๊ณ ๊ฐ๋ฐ์๊ฐ ์ง์ ์ง์ ํด์ค์ผํ๋ค. virtual void speak() = 0; ์์ ๊ฐ์ด virtual ํค์๋ ๋งจ ์ฐ์ธก์ = 0; ์ ์ง์ ํด์ฃผ๋ฉด ํด๋น ํจ์๋ ์์ ๊ฐ์ ํจ์(pure virtual function)๊ฐ ๋๋ค. ์์ ๊ฐ์ ํจ์๋ ์ง์ ํธ์ถ์ด ๋ถ๊ฐ๋ฅํ๋ฉฐ ๋ฐ๋์ ์ค๋ฒ๋ผ์ด๋ฉ(ov..
[C++] keyword: public, protected, private
[C++] keyword: public, protected, private
2020.07.221. ์ค๋ช
public: ์ด๋๊ณณ์์๋ ์ ๊ทผ ๊ฐ๋ฅ protected: ์์๋ฐ๋ ํด๋์ค์ ํํด์๋ง ์ ๊ทผ ๊ฐ๋ฅ private: ์๊ธฐ ์์ ๋ง ์ ๊ทผ ๊ฐ๋ฅ ๋ฉค๋ฒ ๋ณ์๋ ๋ฉค๋ฒ ํจ์ ๊ฐ์ ๊ฒฝ์ฐ ์ ๊ทผ ์ ์ด์๋ ์์ ๊ฐ์ ๊ท์น์ ๋ฐ๋ฅธ๋ค. ํด๋์ค์ธ ๊ฒฝ์ฐ default๋ก private, ๊ตฌ์กฐ์ฒด์ธ ๊ฒฝ์ฐ default๋ก public์ด๋ค. class Parent : (์ ๊ทผ์ ์ด์) Child ์์ ๊ฐ์ด ์์์ ์ ๊ทผ ์ ์ด์๊ฐ ์ฌ์ฉ๋ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ ๊ท์น์ด ์ ์ฉ๋๋ค. public: ๊ธฐ๋ฐ ํด๋์ค์ ์ ๊ทผ ์ ์ด์์ ์ํฅ ์์ด ๊ทธ๋๋ก ์๋ํ๋ค. ์ฆ public์ ๊ทธ๋๋ก public, protected๋ ๊ทธ๋๋ก protected, private๋ ๊ทธ๋๋ก private protected: ํ์ ํด๋์ค ์
์ฅ์์ public์ protected๋ก ..
[Go] ์คํ์ค์ธ ํ๋ก์ธ์ค์ ๋ํด memory dump ํ์ผ์ ๋จ๊ธฐ๊ณ GoLand๋ก ๋ถ์ํ๊ธฐ
[Go] ์คํ์ค์ธ ํ๋ก์ธ์ค์ ๋ํด memory dump ํ์ผ์ ๋จ๊ธฐ๊ณ GoLand๋ก ๋ถ์ํ๊ธฐ
2019.11.05Memory Dump ํ์ผ ๋จ๊ธฐ๊ธฐ - Linux ํ๊ฒฝ(Virtual Machine - CentOS7 ๊ธฐ์ค) 1. gdb ์ค์น(๋์ด์๋ค๋ฉด ์๋ต) yum install gdb 2. ๋์์ด ๋๋ ํ๋ก์ธ์ค ์ถ์ $ ps -ef | grep socket root 7896 18386 0 Nov04 ? 00:01:47 /game/server/socketServer/20191104_175539/dev_socket/dev_socket -ServerType=Dev root 29534 29485 0 16:34 pts/1 00:00:00 grep --color=auto socket 3. memory dump ๋จ๊ธฐ๊ธฐ $ gcore 7896 warning: File "/usr/lib/golang/src/runtime/runtim..
[C/C++] Socket Send/Receive Buffer์ ๋ํ ๊ณ ์ฐฐ
[C/C++] Socket Send/Receive Buffer์ ๋ํ ๊ณ ์ฐฐ
2019.07.08๋ชฉ์ฐจ Socket Buffer? (Send Socket Buffer / Receive Socket Buffer) Socket Buffer ์ฌ์ด์ฆ ๋ณ๊ฒฝ, ์ฌ์ด์ฆ ํ์ธ, ๋ฒํผ ๋ฐ์ดํฐ ํ์ธ Socket Buffer ๋์ ํ
์คํธ Socket Buffer? (Send Socket Buffer / Receive Socket Buffer) ์์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด TCP ํต์ ์์ Application์ด ๋ฉ์์ง๋ฅผ write๋ฅผ ํ๋ค๊ณ ๋ฐ๋ก ๋ฉ์ธ์ง๊ฐ ์ ์ก๋๋ ๊ฒ์ด ์๋๋ค. ์์ผ ๋ฒํผ(Send socket buffer)๋ผ๋ ๋ฒํผ์ ์์ธ ํ ์ ์ ํ ์๊ธฐ์ ์๋๋ฐฉ์๊ฒ ๋ฉ์์ง๊ฐ ์ ์ก๋๊ณ ๋ฒํผ๊ฐ ์ง์์ง๋ค. ๋ฐ๋ ์ชฝ์์๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฉ์์ง๊ฐ ์ค๋ฉด ์ผ๋จ, ์์ผ ๋ฒํผ(Receive socket buffer)์ ์ ์ฅ ๋ ํ Application..
Go์์ ์์ฃผ ์ฌ์ฉํ๋ reflect ๊ตฌ๋ฌธ (Golang reflect)
Go์์ ์์ฃผ ์ฌ์ฉํ๋ reflect ๊ตฌ๋ฌธ (Golang reflect)
2019.06.21๊ตฌ์กฐ์ฒด ๋ฐ ์ธํฐํ์ด์ค ์ ์ type Animal interface{ Move(int) bool } type Cat struct { Name string `custom:"name"` Age int `custom:"age"` Child []string `custom:"child"` } func (c *Cat) Move(distance int) bool { fmt.Println("Cat Move ", distance) return true } type Dog struct{ Name string `custom:"name"` Age int `custom:"age"` Child []string `custom:"child"` } func (d *Dog) Move(distance int) bool { fmt.Print..
Go์์ ์ค์ํ๊ธฐ ์ฌ์ด ์ผ์ด์ค - defer, panic, recover
Go์์ ์ค์ํ๊ธฐ ์ฌ์ด ์ผ์ด์ค - defer, panic, recover
2019.04.242์ค ์์ฝ recover ๋ deferํจ์์ ์ํด ์ง์ ์ ์ผ๋ก ํธ์ถ๋๋ฉด ์๋๋ค. panic์ ์ค๋จ์ํฌ ํจ์์ depth๊ฐ n์ด๋ผ๋ฉด recover๋ n+1 ์์ ํธ์ถ๋์ด์ผ ํ๋ค. ์ฐฉ๊ฐํ๊ธฐ ์ฌ์ด ์ผ์ด์ค ๋ค๋ฅธ ์ธ์ด์ try-catch๋ฌธ๊ณผ ๋น์ทํ๊ฒ go์์๋ defer, panic, recover ํจํด์ ์ด์ฉํด์ ๋ฐ์ํ๋ ์์ธ ์ํฉ์ ์ ์ด ํ ์ ์๋ค. package main import ( "fmt" ) func main() { defer a() panic("panic!") } func a() { r := recover() fmt.Println("recoverd: ", r) fmt.Println("a called") } recoverd: panic! a called Program exited. ๋ง์ฝ ์ง์ฐ ํธ์ถ ..