c++의 간단한 개괄
c++은 이름 그대로, 후처리 증가연산자(++)를 붙인 것처럼 c언어의 확장/진화형으로 탄생한 언어이다.
c의 절차지향성과 객체지향성을 동시에 지닌다.
비야네 스트롭스트룹이라는 독특한 이름의 덴마크 할배에 의해, c언어의 연고지인 벨연구소에서 만들어졌는데(1983년) 저분은 아직 생존중이다.
c++이 기존의 c언어와 차별화되는 가장 강력한 특성은 추상성이 높으면서도 성능에 크게 손해를 보지 않는다는 점이다.
생산성에 유리한 객체지향성을 이용하면서도 c처럼 성능을 쥐어짤 수가 있다.
추상성은 간단히 말하면 '간결함'이라고 할 수도 있겠다.
어떤 기능의 구성을 자세히 알지 못해도, 그 기능을 잘 쓸 수 있다면 그건 추상화가 잘 되어있는 것이다.
이것을 (기능의)'구현'과 '사용'의 분리라고도 한다.
다른 언어들은 대부분 추상성이 높을수록 성능이 떨어지는 편인데 c++은 오히려 c보다 근소하게 성능이 달리는 편이다.
근데 정말 더럽게 어렵다.
분명히 c보다 생산성도 늘고 기능도 빵빵해졌는데 그 반대급부로 문법적 함정도 더 많고 공부할 것도 더 많아졌다.
그리고 언제나 꼿꼿이 변함없는 c와는 달리 표준 개선도 몹시 활발하다.
2011년에 c++11으로 대격변을 겪었고, c++14, c++17에서 작지않은 변화를 또 겪었다.
c언어는 입력과 출력에 있어서, 서식문자를 통해 형을 명시해야 하지만 c++에서는 그런것이 필요없다.
그렇기 때문에 이런 식으로 타입을 막 섞어놓아도
#include
......
std::cout<<111<<"hello"<<'₩n';
......
모든 변수값이 그대로 출력이 된다.
입력도 마찬가지이다.
그리고 c++에서는 구조체와 클래스가 같은 방식으로 작용하는데, c++에서의 구조체와 클래스의 차이는 그저 접근제어의 디폴트값밖에 없고(클래스는 private, 구조체는 public), 그것도 접근지시자를 통한 명시가 있으면 별 차이가 없겠다.
또한 동적할당도 굉장히 간소하게 실행할 수 있다.
int pnum=(int)malloc(sizeof(int));
이렇게 귀찮게 형을 지정하던 것을
int *pnum=new int;
이런식으로 줄일 수 있다.
게다가 이외에도 오리지널c에는 없는 다양한 기능들이 첨가되어있다.
일단 class와 객체라는 개념 덕분에 뚜렷하고 가독성 좋은 코딩이 가능하고,
포인터보다 편리한 '참조자'는 귀찮게 &연산을 하던 수고를 덜어줬다.
오버로딩은 정말 끝내주는 기능이다. 같은 이름에 다른 파라미터를 받는 여러개의 함수를 정의할 수도 있고, + - 같은 기본 연산자의 기능을 확장해서, 클래스나 구조체의 객체에도 사용할 수가 있다.
일례로 위의 cout<<...<<... 로 이어붙인 것도 연산자 오버로딩과 노멀 오버로딩으로 구현된 것이다.
게다가 템플릿이라는 기능 덕에 동적 타입 비스무리한 느낌도 받을 수 있다.
근데 사실은 타입을 정해놓지 않다가 컴파일할때 타입을 박아넣는 형식이다.