정보공간_1

[2기 대구 최진원] C++ - Better C 본문

IT 놀이터/Elite Member Tech & Talk

[2기 대구 최진원] C++ - Better C

알 수 없는 사용자 2012. 8. 18. 22:43

 

 안녕하세요.

 대구 멤버십 21-1기 최진원입니다.     

 요즘 멤버십회원 분들은 평가 준비에 바쁘실 텐데요, 이럴 때 일수록 기본이 참 중요하다는 것을 알게 됩니다. 그래서 저는 ‘C++ Language’ 에 대해서 글을 쓰게 되었습니다. C++ LanguageC Language와 함께 아주 기본적이고 중요한 Language인데요. 이번 기회에 함께 C++ Language를 정리해보도록 하죠.

     

 먼저 객체지향적인 C++ Language 는 절차지향적인 C Language 와 분명 비슷하지만 다릅니다. 우선 객체 지향에 대해서 먼저 알아보고 시작을 하겠습니다.

  OOP(객체지향)의 특징으로는 Encapsulation, Information Hiding, Abstraction, Inheritance 그리고 Polymorphism을 들 수 있습니다.

    

         

     

 

그럼 오늘의 주제 ‘Better C’ 에 대해 알아보겠습니다.

     

 

1. 함수 오버로딩(Function Overloading)

 

         

 

 위의 예제에서 function 함수가 두 번이나 선언이 되었죠. C 컴파일러는 함수를 호출할 때 함수의 이 정보만 가지고 찾기 때문에 위의 경우를 허용하지 않습니다.

 하지만 C++ 컴파일러는 함수의 이름 + 매개 변수의 정보을 참조하여 함수를 찾기 때문에 위의 경우를 허용합니다. 이렇게 함수의 이름은 같지만 매개 변수의 타입이나 개수가 다른 함수를 여러개 선언하는 것을 함수 오버로딩이라고 합니다.          

 

     

 그렇다면 이와 같이 리턴 타입이 다르면 어떻게 될까요?

     

함수의 이름이 같고 리턴 타입이 달라 언뜻 보기에는 오버로딩처럼 보일 수 있지만 함수의 이름이 같더라도 리턴 타입만으로는 알 수 없기 때문에 오버로딩이라고 말할 수 없습니다.

그 외에 다른 예로 다음과 같은 예제들이 있습니다.

 

    

          

 

     

2. Default Argument Values

 

 전달되지 않는 인자를 대신하기 위한 기본 값이 설정되어 있는 변수입니다.

 

    

 

 위의 예제와 같이 default 변수를 선언해 놓음으로 인자를 전달하지 않아도 지정된 값으로 초기화를 해줄 수 있습니다. Default Argument Values 사용시에 주의해야 할 점이 있다면 앞에서 설명드렸던 1. 함수 오버로딩입니다.

     

    

 

 위와 같이 function함수를 호출하면서 인자를 전달하지 않게 되면 기본 매개 변수가 사용된 첫 번째 function 함수와 두 번째 function 함수 모두 호출이 가능하게 되어 버리고, 에러를 발생시키게 되므로 조심해야 합니다.

     

          

 

3. Tag of Struct

 

위 그림의 C StyleC++ Sytle의 구조체 선언 코드를 보면 C++ Language에서 enum, struct, union tagtype name으로 사용된다는 것을 알 수 있습니다.     

    

         

 

 

4. Const

 

const 키워드는 변수를 상수화 하는 것 인데, 같은 코드라도 위치에 따라 다른 의미를 나타내고 있습니.

 

    

     

 위의 예제에서 에러가 발생을 한다면 몇 번째 Line에서 발생을 할까요?

     

     

     

 2:  const int* p; 에서 const int* p 의 값을 상수화 시키게 됩니다. 그래서 4번 라인에서와 같p의 값을 변경을 하게 될 경우 에러를 발생시키게 됩니다.

     

 그럼 다음과 같이 p 앞에 const 키워드가 붙게 되면 어떻게 될까요?

 

    

 

이러한 경우, const 키워드 다음에 나오는 p 를 상수화 시키게 됩니다. 그래서 4번 라인에서 에러가 발생하게 되죠.

     

     

 그렇다면 다음과 같은 경우는 예측할 수 있겠죠?

 

    

     

 const 키워드가 int* p 앞에 있기 때문에, p, *p 값 모두를 상수화 시켜 3, 4 라인 모두 에러가 발생하게 됩니다. 또한 const 멤버 변수의 초기화는 선언 때 이루어 져야 한다고 알고 계실 것입니다.

 

 그렇다면 아래 예제의 결과를 예측할 수 있겠죠?

 

    

     

 결과는 Compile Error입니다. 객체의 생성은 메모리 할당을 하고, 생성자 호출 순으로 이루어 집니다. 위의 예제의 경우, 메모리 공간을 할당하면서 이미 val 값이 쓰레기 값으로 초기화가 되었고 그 값을 바꾸려고 하기 때문에 에러가 나타나게 됩니다. 이러한 문제로 인해 값을 변경할 수 없게 되는데요. 러한 경우 멤버 MIL(Member Initializer List)로 해결을 할 수 있습니다.

     

     

5. Reference

 

Reference는 메모리 공간에 이름을 하나 더 추가해주는 행위로 별명이라고도 합니다.

 

    

 

위의 예제의 결과 ab는 같은 값 5가 있는 주소를 함께 공유하고 있습니다. 그리고 다음의 예제와 같call-by-reference의 역할을 하게 됩니다.

    

 

 이렇게 reference를 이용하게 되면 포인터 연산이 필요없게 되므로 보다 안정적으로 사용할 수 있게 됩니다. 하지만 호출시 call-by-value와 혼동이 될 수 있다는 단점도 함께 가지고 있으니 주의해야겠죠?

 

Reference를 사용할 때 주의해야 할 점이 있다면

 

    

 

 위와 같이 초기화하지 않았거나, 상수를 사용할 수 없다는 점입니다.

     

     

6. new & delete

 

Cmalloc() / free() 함수 대신 아래와 같이 C++에서는 new, delete 연산자를 사용하게 됩니다.

 

    

     

 

7. Reference

- Kang, Byung-Wook, Introduction to C++, YeungNam Univ. SE Lab, 2005

- 윤성우, C++ 프로그래밍, FREELEC, 2004

 

 

 

C++ 언어는 C 언어를 포함합니다. 그렇기 때문에 C언어로 작성된 대부분의 프로그램이 C++컴파일러로도 컴파일이 가능하죠. 그래서 이번 포스팅에서는 기본적인 특성 몇 가지를 살펴보았는데요. 가볍게 읽고 확실히 알 수 있었으면 합니다.