정보공간_1

[6기 수원 최웅엽] 궁금한 c++ 문법들 본문

IT 놀이터/Elite Member Tech & Talk

[6기 수원 최웅엽] 궁금한 c++ 문법들

알 수 없는 사용자 2014. 8. 7. 15:46

C++을 공부하며 궁금했던 점과 애매하게 알던 부분을 더 명확히 알아둬야 할 필요성을 느껴 조사해 보았습니다.

 


1.     Call by pointer Call by reference


보통 c++의 함수 param으로 reference를 넘기게 코드를 짜는 것을 기본으로 알고 있었습니다값 복사에 대한 처리나 개발자가 원하는 방향이라 것 등 여러 가지 이유가 있었기 때문인데 그렇다면 reference pointer의 차이는 무엇일까?



간단히 두 가지 예제를 보면 실제 문법 사용에는 큰 차이가 없는 것으로 보입니다그리고 여러 방면으로 찾아본 결과 두 차이점에 대한 언어 개발자의 대답 또한 “큰 차이가 없다” 였습니다.

대신 몇 가지 사용상의 차이점이 있는데

1.     Operation overloading에서는 reference를 사용해야 일반적인 문법으로 사용할 수 있다
(
여기서 일반적인 사용이란, 두 클래스에 대한 + overloading을 사용할 경우 a+b가 실제 + 문법과 비슷하다는 것입니다. Pointer을 사용하면 a+&b로 사용해야 합니다.)

2.     Null을 대입할 수 없습니다.

이 외에도 몇 가지 이유가 있지만 결국 사용상의 이슈일 뿐 속도나 문법적 오류에 대한 이슈는 없습니다.

 


2.     Namespace


보통은 using namespace std라는 문법으로 사용하게 되는 namespace입니다. 코드를 적으면서 namespace를 실제 어떻게 사용하는 것인지 고민했던 적이 있습니다.



여기 namespace class 그리고 struct를 간단하게 코드로 써 보았습니다

namespace도 결국 struct와 비슷한 용도로 사용할 수 있다는 것을 알 수 있으며

1.     Using namespace로 변수나 함수를 골라서 사용할 수 있으며

2.     Namespace를 새로운 이름으로 바꿀 수 있으며

3.     같은 이름으로 확장이 가능하고

4.     namespace안에 또 다른 namespace도 적는 것이 가능합니다.

5.     단 이미 적용된 namespace를 취소하는 방법은 문법적으로 제공하지 않습니다.

6.    각자 맡은 파트를 합치는 과정에서 변수나 함수클래스 등의 이름이 겹치는 것을 방지하는데 사용할 수 있습니다

정도를 알 수 있었습니다



3.     Inline


보통 header에 많이 사용하는 inline함수 입니다.  중요한 것은 

1.    개발자가 inline으로 선언한다고 해서 컴파일러가 반드시 inline화를 시키는 것은 아니라는 점

2.    짧은 코드는 컴파일러가 알아서 inline화를 한다는 점.

3.    무분별한 inline을 사용하면 큰 함수는 캐시나 페이징의 hit 확률을 떨어뜨려서 오히려 느려질 수 있다는 점

을 알 수 있었습니다.



4.     Smart_ptr


스마트 포인터란, java의 가비지 컬랙터의 장점을 가져온 c++의 새 기능을 말합니다. 이 특별한 포인터는 참조 수를 카운트하여 카운트가 0이되면(사용을 하지 않으면) 스스로 메모리를 해제하게 됩니다

보통 shared_ptr unique_ptr을 사용하고 이를 관리하기 위해 weak_ptr도 사용하게 됩니다.

1.    unique_ptr은 포인터를 공유하지 않습니다. 값의 전달이나 복사가 불가능하고 이동만 가능합니다. 

2.    shared_ptr은 포인터를 공유할 수 있습니다. 단 unique_ptr의 기능만을 원할 경우에는 unique_ptr을 사용하는 것이 속도면에서 좋습니다.

 


5.    Thiscall


Class 내부에 구현한 static 함수를 함수포인터로 지정하면서 애를 먹었던 적이 있습니다

이 때 어떤 방법으로 member함수가 구현되는지 궁금했습니다.



위의 함수를 보면 멤버 함수가 실제로는 this가 파라미터로 전달되는 것을 알 수 있습니다. 그렇기 때문에 함수에서 자기 class의 변수들에 접근이 가능한 것입니다. 

static은 this가 전달되지 않기 때문에 static으로 지정되지 않은 변수에는 접근이 불가능한 것입니다.