개념적인 차이


1. 패러다임


C는 절차지향적 언어(Procedural). 

C++은 흔히 객체지향언어(Multi paradigm).


하지만 C++은 엄연히 말해서 멀티패러다임 언어이며 객체지향이건, 절차지향이건 구현이 가능하며 C의 확장팩이라고 생각하면 편합니다. 

(엄밀히 말하면 그렇지 않습니다. C++은 C의 문법처럼 사용할수 있을 뿐이지 이미 오랜시간 C도 확장을 해왔고 C++도 확장을 해왔습니다. 마치 C의 문법처럼 쓰지만... 내부 동작은 전혀 다를 수도 있습니다. 마치 C++배워 놓고 C는 쉽게 배울 수 있을 거라 생각하지만 깊이 들어가면 역시... 끝도 없습니다.)

마찬가지도 C에서도 객체지향적으로 구현을 할 수가 있지만 C++은 그를 구현하기 위한 수많은 문법적 기능이 마련되어 있고

객체지향 중심적이지만 얼마든지 C로 회귀하여 C처럼 프로그래밍을 할 수도 있고 함수 프로그래밍등 다양한 프로그래밍을 소화할 수 있습니다.

하지만 굳이 C로 객체지향적인 코딩을 해야하는가가 문제가 됩니다.

마찬가지로 C++을 말할 때 마치 객체지향프로그래밍 언어의 대명사인 것처럼 말하지만 C++은 멀티패러다임 언어이다.

만약 객체지향형식 언어라고 c++을 정의했다면 저는 절대로 friend같은 키워드는 절대로 만들지 않았을 겁니다.

또한 더욱 깊이 들어간다면 객체지향언어니 절차지향언어니 따지는 것도 소용없다고 봅니다. 

말씀드렸듯이 언어는 언어이고 엄연히 말하자면 객체지향이나 절차적언어 같은 것은 일반적으로 통용되는 개발방식에 대한 내용입니다. 

즉 언어 자체를 그런 단어로 단정짓기는 힘들다는 이야기 입니다.


2. 개발방식


C는 하향식 접근 방법[각주:1]

C++는 상향식 접근 방법[각주:2]


C는 절자척 언어이기 때문에 기본 요소간의 순차적 수행이 되도록 서로간의 연결이 중요하다 단계별 공식화(linked-together) 이후 세부 사항으로 나눠집니다.
하지만 C++은 시작부터 추상적인 개념을 통해서 구성을 한 후 그 다음 그것들을 조합하는 방식으로 만들어 집니다.
이는 클래스와 객체를 통한 프로그래밍이 C++ 에서 주를 이루면서 생겨난 특징입니다.

물론 C++도 하향식 접근방식으로 개발이 될 수도 있고 혹은 그때그때 다를 수도 있지만 기본적으로 C++을 배우게 되면 상향식 접근 방법을 먼저 접하게 될겁니다.

왜냐하면 그게 편하니까요. 당신이 창조주로 세상을 만들어 낼수 있다고 할때 세상 만물이 창조되는 물리법칙, 전자기력, 핵력, 중력, 자기력등을 먼저 만들겠 습니까. 

아니면 태양을 만들고 바람을 만들고 사람을 먼저 만들겠습니까. 물론 프로그래밍 실력이 나아질수록 원론과 근본에 손을 먼저 쓰겠지만 그보다는 우리에게 친숙한 추상적인 객체에서부터 C++ 프로그래밍을 시작하는 것이 일반적입니다.

또한 이점은 구조적 프로그래밍과 객체 지향 프로그래밍의 큰 차이라고 볼 수도 있습니다.


문법적인 차이


1. class


c++ 에서는 class 가 생겼다!

class라는 것은 C++에서 감초 같은 역할을 합니다.

항상 사람들은 c++을 하면서 class 기존 C에서 부터 존재하던 struct와의 차이를 물어보는데 이에 대해서 좀 이야기를 해야할것 같다.


부록이에용~ C++에서의 CLASS와 STRUCT, 그리고 C의 STRCUT에 대해서 설명해 보겠음다.


1. C++의 CLASS는 CLASS내의 함수를 가질 수 있다. STRCUT도 함수를 가질 수 있다. C의 STRCUT는 함수호출을 할수 있다.

2. C++의 CLASS는 CLASS 맴버가 기본적으로 private. STRCUT는 public. C의 STRCUT 접근 지정자 자체가 없다.

3. C++의 CLASS는 상속이 가능하다, STRCUT 또한 상속이 가능하다, C는 개념 자체가 없다.

4. C++의 CLASS는 템플릿 사용 가능, STRCUT 또한 가능, C는 개념 자체가 없다.


음 차이가 없다. 정말 없다... 딱하나 2번 항목을 제외하고 나는 차이를 못느껴봤다.

어느정도로 차이가 없냐고?

심지어 이런짓도 가능하다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
struct 생물
{
 
};
 
class 휴먼 : public 생물
{
    int a;
 
public:
    휴먼()
    {
        a = 0;
    }
};
 
template<class T>
struct 로봇 : public 휴먼
{
 
};

구조체를 클래스가 상속받고 그것을 다시 템플릿을 사용하는 구조체가 다시 상속 받는다. 객체화 다 잘된다.

현재까지 내가 파악한 파악한걸로는... 음... 

1. 어떤 의견으로는 구조체는 값타입 클래스는 참조타입이라는데 C#의 클래스와 구조체의 차이이다. C++에서 그런가? 확인할 수 없었다.

2. 어던 의견으로는 구조체는 new 동작시 디폴트 생성자가 없다면 묵시적으로 생성되는 디폴트 생성자가 호출이 안된다는데... 역시 명확하지 않다. 아니 모든 기능이 똑같은데 구조체라고 다를까 하는 생각이 있다. 


2. 오버로딩을 지원하지 않는다.


C++에서는 같은 함수명은 같지만 함수파라미터는 다른 오버로딩을 지원하지 않는다.


3. C는 참조변수 혹은 레퍼런스변수를 지원하지 않는다..


레퍼런스는 C++에서 생겨난 개념이다. 마찬가지로 C에서는 지원하지않는다.

C만 전문적으로 보신분들이 본다면 포인터와 비슷한 개념이지만 실제 값처럼 취급되는것이 레퍼런스이다.

& 기호를 사용하며 다음과 같습니다.

int a = 10;

int &A = a; 이와 같이 변수만 받을수 있으며 실제 a의 값처럼 사용된다.


---------------------------------


1. 글을 쓰면서 알게된 점 1. C++ 에서는 배열이나 함수가 포인터로 변환되는 것을 Decay(부식: 그러니까 모든 정보를 온전히 갖지 못한다는 이야기)라고 한다.

2. 템플릿으로 이런짓이 가능하다 허허허.... 항상 배운다. 정말...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
template<typename T, size_t n>
void foo(T (&p)[n])
{
    int size = sizeof(p) / sizeof(p[0]);
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    int temp[] = {1, 3, 3};
 
    foo(temp);
 
    return 0;
}

3. 배열의 이름과 포인터는 비슷한 동작을 하지만 절대로 같지는 않다. 물론 알고 있는 내용이지만 명확하게 다시한번 확인했다.

  1. 어떤 의사를 결정하거나 어떤 일을 수행하는 과정의 개괄적인 측면에서 시작하여 점차 세분화해 가며 처리하는 방식. 상향식 접근 방식(bottom-up approach)과 대별된다. [본문으로]
  2. 작은 부분부터 개발하고 후에 그것을 조합하여 하나로 만드는 것을 의미한다. [본문으로]
Posted by JJOREG