개인적으로 존경하는 '리누스 토르발즈' 는 C++ 을 '끔찍한 언어' 라고 지칭했다.
나도 개발 시작한지 6개월도 안 되었을 때는 이를 이해하기 힘들었으나, 각종 기교에 대해서 많이 익히면 익힐수록..
'와... 진짜 더럽다'
라고 욕하고 있더라.. ㅠㅠ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#include <iostream>
using namespace std;
void hi(int temp_)
{
cout << "hi(int)" << endl;
}
void hi(const char* temp_)
{
cout << "hi(char)" << endl;
}
int main()
{
void hi(int x);
hi(10);
// hi("ABC"); //Error
::hi("ABCD");
}
|
cs |
이런 간단한 예시만 봐도 쉽게 알 수 있다.
메소드 오버로딩을 이용할 때, 우리가 main() 영역에 선언해 준 void hi(int x); 라는 녀석때문에
{ } 내에 있는 hi 를 우선적으로 인식하게 된다.
여기서 컴파일러의 원리를 살펴볼 수 있는데.
스스로 사고해 보면 많은 도움이 될것이다.
저 main() 내의 선언부가 없으면 주석 처리해 둔 hi("ABC") 는 정상 작동한다.
즉, 우리는 hi 라는 메소드를 작동시키기 위해 고려해야 할 점이 3개가량 더 늘어난 것이다.
C++ 의 제작 철학은
'사람들이 사용하기 편하게 만들자', '일관성 있게 만들자' 가 아닌.
'C++ 이라는 도구의 한계를 없애자' 이기 때문이다.
즉, 곡괭이, 검, 창 등은 서로 각각의 역할이 있다.
Python, Java, C# 등을 각각 이러한 '역할이 부여된 언어' 라고 한다면
C++ 은 '곡괭이이면서, 검이면서, 창이다'
C++ 로 불가능한 설계는 거의 없지만, 그 C++ 을 잘 다루는것은 다른 언어 하나를 마스터 하는데에 비해
시간이 곱절로 소모된다.
이러한 점 때문에 많은 개발자들 / 학생들이 C++ 을 가장 어려운 언어로 꼽는 것이다.
또 다른 간단한 예시를 들어 보면.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#include <iostream>
using namespace std;
class A final
{
};
class B : A // 에러
{
};
int main()
{
int final = 10;
int override = 20;
}
|
cs |
final, override 는 모두 '키워드' 지만, 또 뭔 ㅈ같은 '특수 키워드' 라는 의미로
이를 '변수 이름' 과 같이 사용할 수 있다. (물론 권장되는 방법은 아니다)
템플릿 관련해서 혼란스런 예제가 또 있는데,
아래 코드는 Vs 2019 기준 작동하지 않는다.
1
2
3
4
5
6
7
|
#include "헤더.h"
int main()
{
nameS::Task task;
task.print<int>(10);
}
|
cs |
1
2
3
4
5
6
7
8
9
10
11
|
#include "헤더.h"
// this is 헤더.cpp
namespace nameS
{
template<typename T>
void Task::print(T t)
{
printf("blahblah" + t);
}
}
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#pragma once
#include <iostream>
// this is 헤더.h
namespace nameS
{
class Task
{
public:
template<typename T>
void print(T t);
};
}
|
cs |
헤더.cpp 영역에 template 에 관한 선언식을 기재해 줘야지만 에러가 발생하지 않는다.
이런것들 하나 하나가 전부 '함정' 인것이다.
숙련자 입장에선 별 거 아닐지도 모르지만,
이런 함정 하나하나가 진입장벽을 높이는 허들인 셈이다.
물론,
숙련자 입장에선 : 에이 뭐 그게 어려움? 그것도 할줄모르면 프로그래머 하면 안되지 ㅋㅋㅋ
할 수 있겠지만, 그래서 Python 같은 다른 언어들이 C++ 보다 부각이 되는 것이다.
물론 위에서 설명하고 있는 예제들은 대다수가 '속도' 를 높이기 위해 강제되는 측면이 있다.
'Programming > C++' 카테고리의 다른 글
[C++] constexpr 사용하기. (0) | 2020.11.22 |
---|---|
[C++] 함수 포인터 (0) | 2020.11.01 |
[C++] system, WinExec 함수 출력값 받는법. (0) | 2020.08.17 |
어떻게 특정 .h 가 dll, lib 와 매칭되는지 알 수 있나? (0) | 2020.07.14 |
[C++] 템플릿 특수화에 관해서 (0) | 2020.07.03 |