[수정재업] C++언어를 처음으로 시작하는데, 몇가지 사항이 궁금합니다.

Note의 이미지

안녕하세요.

개발자 고민상담실에 똑같은 글을 올렸는데, 제가 현재 컴퓨터 공학과를 다니고 있는 재학생이기도 해서 자유게시판에도 똑같은 글을 한번 올려보았습니다. 혹시나, 중복 문제 때문에 글이 도배형식이라고 한다면 둘 중에 글 하나를 지워주셔도 괜찮습니다. 질문은 다름이 아니오라, 아래와 같습니다.

요즘 학교 수업을 들으면서 HTML이나 안드로이드 스튜디오를 사용해서 개발하는 수업들은 눈에 보이는 가시적인 성과부터 시작해서 바로바로 그 결과를 확인할 수 있어서 프로그램을 만드는데 흥미가 붙어서 재미있게 개발을 하고 있습니다.

하지만, 2년전쯤 C언어와 C++언어를 해보면서 제가 느낀 공통점은 항상 검은 화면에서 나타나는 결과들 이었습니다. 물론, 현재도 제 컴퓨터 실력이 너무나도 많이 부족하지만, 그때는 너무나 턱없이 부족해서 그 어떤 작업을 하더라도 검은화면에 나타나는 결과가 전부였습니다.

그러다보니, 의외로 C와 C++을 손놓은지가 2년이 다되어가는데 갑자기 몇가지 사항이 궁금해졌습니다. C와 C++을 사용해서 어떤 프로젝트들을 만들 수 있고, 이것이 어디에 활용되는지도 좀 궁금했습니다. 최근 은행에서 SW역량테스트를 보면서 머리의 한계를 느끼고 시험끝나고 시험 감독관이었던 차장님께 이것저것 여쭤보았습니다. 그 중에서 차장님께서 해주신 말씀중 가장 기억에 남는 말이 "차세대 시스템은 전부 C나 JAVA로 개발을 한다"고 하더라구요. 그중에서도 특히나 "C가 메인"이라고 하셨습니다..

물론 컴퓨팅 분야가 워낙 다양해서, 각각의 언어가 활용되는 분야로 가면 된다지만, 갑자기 호기심이 생겼습니다. 그래서 지금 재미를 느끼고있는 안드로이드 스튜디오를 잠시 접어두고, C++ 책을 하나 구매했습니다. 그리고, C++ 책을 한권 진득하게 독파해보면서 제가 공부했던 검은 화면에서만 뿌려지는 내용을 넘어서 C, C++ 분야가 같고 있는 잠재적인 매력도가 무엇인지 한번 확인해보고 싶어졌습니다.

하지만, 제가 검색능력이 많이 부족해서 검색을 해도 제가 컴퓨팅 소양이 낮은지라 여기계신 경력자분들처럼 C++가 가지고 있는 산업의 크기가 좀 가늠이 잘 되질 않습니다. 어떤 분 말씀으로는 C++는 그냥 알고리즘 전용 언어고 필요 없다고 하시는분이 있고, C의 아류작일 뿐이다 라고 말씀하시는 분들도 있고.. 언어에 국한되지 말고 한 언어를 파다보면 나머지 언어는 자연스레 습득된다고 하시는 분들도 있고 기타 등등..

그래서, 여기 계시는 C++을 어느정도 독파해보신분께 몇가지 여쭤보고 싶습니다.

1) 제가 수학과 알고리즘 능력이 보통에 비해 매우 떨어지는데, C++은 알고리즘에 국한된 언어가 정말 맞는지..?

2) C++ 언어를 보통 이상으로 갈고닦게 된다면 직업적으로 정할 수 있는 것은 어떠한 것이 있나요?
ex) 시스템 프로그래머.. 기타 등등..

3) 언어중에 주력언어가 C++ 하나라고 한다면, 공부해서 졸업하게 된다면 어떤 직업의 폭을 가질수 있는지도 알고
싶습니다.

하나만 답변해주셔도 좋고, 복수개의 질문에 답해주시면 정말 감사드리겠습니다. 기타 앞으로 C++을 진득하게 3년~5년, 필요하다면 밑창 드러날때까지 파볼생각인데, 조언이 되는 말씀도 해주시면 정말 더없이 감사드리겠습니다.

나빌레라의 이미지

윈도우즈의 커널은 C고 GUI는 C++ 이지요. (일부는 c#)

----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

jiny199109의 이미지

C++을 배우며 화려한 그래픽을 보고 싶다면 Unreal Engine으로 간단한 게임을 만들어보는 방법이 있습니다. 너무 하이프로그래밍(?)이라고 생각되시면 Cocos 2d-x 도 있구요. 더 아래로 내려가면 DirectX도 있습니다. 참고로 다른 업계는 모르겠지만 게임업계는 C++이 필수에 가깝습니다.

Note의 이미지

아하.. c++을 공부하다보면, 그렇게 연계가 될 수도 있네요.
아직은, 너무나 초보단계라 미숙한데 게임분야까지 가능하다는 사실을 알게되었네요.
감사합니다.

아이온@Naver의 이미지

"차세대 시스템은 전부 C나 JAVA로 개발을 한다고 하더라구요. 그중에서도 특히나 C가 메인이라고 하셨습니다.."
"어떤 분 말씀으로는 C++는 그냥 알고리즘 전용 언어고 필요 없다고 하시는분이 있고, C의 아류작일 뿐이다 라고 말씀하시는 분들도 있고.."

뭘 잘 모르시는 분들 같고요.

c++은 일반적으로 성능을 잃을 수 없거나 저수준에 대한 컨트롤이 필요하거나 둘 다인 응용 영역에서 c를 쓰자니 엔지니어링 코스트 측면에서 비효율적이라고 생각될 때 선택되는 것 같습니다. 이런 유인으로 c에서 c++으로 넘어간, 잘 알려진 프로젝트로 gcc와 gdb를 들 수 있겠네요.

1)은 질문이 명료하지 않은데, 최대한 추측해서 대답해 드리면, C가 저수준에서 할 수 있는 대부분은 C++로 가능합니다. 같은 얘기가 JAVA나 python에는 적용되기 어렵구요.

2), 3)은 잡 마켓의 환경 따라 다를 텐데, 미국에서는 수요가 있을 만큼 있습니다.

언어도 중요하고 언어를 그 언어답게 쓰는 것도 중요하다고 생각합니다만, 그래도 높은 추상 수준에서 문제를 어떻게 풀지가 더 중요하며 언어는 수단이라고 봅니다. 그리고.. c++로 학생 때 해보실 만한 것으로 저는 간단한 shell을 추천합니다.

Note의 이미지

아하.. 답변 감사드립니다.
C로 할수 있는 것들은 C에 객체지향적인 개념이 들어가서 업그레이드 된 C++로 마찬가지로 대체가 가능하다.
하지만, JAVA나 PYTHON 같은 언어는 C의 대체를 완벽히 할 수는 없겠다고 이해하였습니다.

언어를 언어답게 쓰는거.. 이거 정말 지금의 제 단계로써는 매우 이해하기 힘드네요.. 수련이 너무 부족합니다.
어느 한 언어를 깊게 사용해본적은 없고, 이것저것 두루두루 사용을 해봤었는데, 님이 말씀하신 말을 이해하려고
지금 C++를 아주 깊게 파보려 합니다. 머리가 부족해서 중간에 이해 못해서 못따라갈까봐 너무 걱정이네요..
안그래도 요즘 백준이나 알고리즘 문제 풀면서.. 너무 많이 막힙니다.. 흑 ㅜ

언어를 공부할때는 그래도 재미있는데, 알고리즘을 공부할때 어떻게 해야할지 모를때는 정말 벽을 많이 느끼네용..

아이온@Naver의 이미지

C로 할 수 있는 것들로 제가 의미한 것은 주로 register를 직접 컨트롤 한다거나(pointer나 inline assembly 등을 이용해서), memory management를 직접 한다거나(예컨대 malloc이나 new, 그 아래 있는 library routine에 의존하는 대신 미리 큰 메모리 받아놓고, 객체 생성 때마다 그 안에서 직접 메모리를 할당했다 반납했다 한다거나), 이런 것들입니다. 저수준의 컨트롤이요. 그런데 그건 C++로도 거의 다 가능하고, C++ 프로그래머도 C 프로그래머와 마찬가지로 그런 부분들을 이해해야 합니다.

C++은 C에 객체지향 개념이 들어가서 업그레이드 된 것이 '아닙니다.' C++은 객체 지향 뿐만 아니라 generic, meta-programming, 보는 이에 따라서 functional programming 등 다양한 프로그래밍 패러다임이 한 언어 안에 망라되어, 프로그래머가 문제에 따라 적절히 섞어 쓸 수 있도록 설계된 언어입니다.

JAVA나 python이 C를 대체하기 어려운 건 프로그래밍 언어의 특징 때문은 아니라고 생각합니다. 그보다는 그 두 언어의 번역 및 실행 환경 때문에 C만큼의 성능이 나오지는 않고, 둘째 (이게 제가 말씀드린 것인데) 두 언어 내에서 저수준 컨트롤은 제한적입니다. 예컨대 JAVA는 object 생성 시 메모리 할당하고 할당된 메모리를 명시적으로 즉시 반납할 방법(C의 free나 C++의 delete)이 없습니다. Garbage collector가 지워줄 때까지 기다려야 되겠죠. 한 번 16비트의, 메모리가 KB 단위의 임베디드 머신이라고 상상해 보세요. 작은 오브젝트도 때에 따라서는 즉시 반납하고 싶어 질 것입니다. JAVA로는 그게 안 되죠. C++로는 됩니다. 그런 면에서 C가 하는 일을 C++로도 할 수 있다고 말씀드린 거에요. 이제는 C++이 C의 superset은 아니지만 그래도 여전히 C와 매우 유사한 문법을 포함하고 있기도 하고요.

"언어를 언어답게 쓰려면" 이하 제가 얘기한 부분의 반대편 극단은 언어는 전혀 중요하지 않다는 관점입니다. 중요한 건 더 높은 추상 수준에서 문제를 푸는 거고, 언어는 그 응용 영역에 따라 그때그때 선택하게 된다는 관점이요. 어떤 분들은 언어는 어차피 모르면 그때 금방 배워서 할 수 있다고도 하는데, 저는 거기까지는 좀 지나치다고 생각합니다. 예컨대 python이든 JAVA든 잘 다루려면 그 언어(와 그 언어로 개발할 때 사용하는 도구)를 연습하고 공부하는 데 일정 정도의 시간은 들어야 된다고 생각해요.

그럼에도 불구하고 "c++을 몇 년 공부"할 만큼 c++ 자체가 중요하진 않다고 생각합니다. 중요한 건 높은 추상 수준에서 문제를 해결하는 데 필요한 지혜와 지식입니다. 어떤 것을 지칭하냐면, 예컨대 학교 과목 안에 포함된 토픽들이겠죠.자료구조, 알고리즘, 설계 패턴, (응용 영역에 따라) 컴파일러, OS, 데이터 베이스, 시스템 프로그래밍, 컴퓨터 구조 같은 것들이요. c나 c++, java 등 언어 자체보다 그런 것들이 더 공부할 거리가 많고 중요하다고 봅니다. 언어만 다뤄서 할 수 있는 건 매우 제한적일 것 같은데요.

Emdjdjr의 이미지

으으.. 몇날몇일을 ㅆ써주신 글을 읽어보았는데..

초보자인 제게 있어서 이런 질문들을 하면 답변자분과 같이 고수분들께서 비슷한 말씀들을 많이 해주시는데..
역시 제게 너무나도 아직까지는 추상적이면서 어렵네요.. 안드로이드 프로그래밍이나 웹을 할때는 눈에 보이는 가시적인 부분때문에 하는 맛이라도 났었는데..

지금은 C++ 자체를 기초부터 공부하면서도 포인터 제어 하나하나가 너무 어렵고 메모리 할당 해제부터 내용들이 너무 딱딱하기도 하고.. 눈에 보이는건 검은화면 뿐이고 .. 공부를 좀 다르게 해야하나 봐요.. 아예 컴퓨터의 원론적인 부분을 공부하는 느낌이 들어서 솔직히 .. 잘 이해가 되지도 않아서 힘드네용..

정말 좋은 답변 감사드립니다 ㅠ_ ㅠ

나빌레라의 이미지

사실 C/C++의 포인터 개념은 computer architecure의 memory addressing을 거의 그대로 형상화 해 버린 것이라 언어 문법이나 스팩만 보고서 이해하기가 어렵습니다. (이해 하는 사람들도 있긴 있습니다.)

게다가 포인터를 함수의 파라메터로 넘기고 포인터로 값을 돌려받고 하는것은 프로그래밍 언어론 혹은 컴파일러 이론의 함수와 스택 구조가 메모리에서 어떻게 만들어지는지를 알아야 이해 되거든요.

파이썬이든 자바스크립트든 PHP든 다른 언어들도 내부적으로는 모두 같습니다.

학교에서 전공 수업으로 가르치는 computer architecture, comiler, system programming, programming language 수업을 듣고 나면 완벽하게 이해 할 수 있습니다.

----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

Emdjdjr의 이미지


안드로이드 수업이나 HTML같은 수업은 이것저것 하나하나 만들어보면서 만들어 가는 과정이 눈에 보이는 맛이라도 있었습니다. 물론 제가 많이 미숙하고 못하는 원인이 100%이지만, c++ 과목은 제가 만들면서도 항상 검은 화면에서 무엇인가를 만드니 비주얼적으로도 그렇고 실제 만드는 프로그램의 질도 그렇고 흥미를 느끼기가 조금은 제게 버겁고, 더군다나 어렵기까지 해서 참.. 착잡합니다 ㅜ

안드로이드 스튜디오 과목에서는 어플을 만들어보고 웹 수업에서는 웹과 관련된 프로젝트를 만들어보고 c# 기반에서는 윈폼을 사용해서 이것저것 만들어보았는데, 유난히 도스 환경에서 돌아가는 프로그램인 c/c++ 의 경우에는 도데체 이 과목에서 뭘 어떻게 만들어야 퀄리티가 살지 도무지 안보이네요 ㅜ

근데 왠지 그런만큼, 이 과목을 더욱 정복하고 싶긴 하더라구요.. 요즘 이것저것 검색해본 결과 C/C++ 자체가 하드웨어까지 컨트롤 할 수 있으며 많은 언어의 기반이 된다는 것은 알았지만, 공부하기는 엄청 빡세다는걸 요즘 많이 느낍니다..

나중에 회사생활 하기 전 기술면접을 볼때, 비록 언어가 다른 개발자를 뽑는다고 하더라도, 제가 지금 C++을 공부하는것이 빛을 발하는 날이 올까요..? 그래도 베이직 언어는 C++을 계속 공부하고는 싶습니다만, 효율이 너무나도 안나오니 참 걱정입니다.

pynoos의 이미지

비쥬얼이 화려하지 않고, 화려한 비쥬얼을 위해서는 많은 공수가 들어가죠.
알고리즘, 데이터 구조 등이 다 그렇습니다.
추상화된 개념이 멈추지 않고 동작하는 재미가 있잖습니까.

누군가에게 보여주기 위한 노력을 조금 버려두세요.

Emdjdjr의 이미지

답변 정말 감사드립니다..

joone의 이미지

https://cs.chromium.org/chromium/src/

요즘과 같은 개발 환경에서 C++ 공부를 시작하셨다니 대단합니다.
Chrome browser 소스코드를 한번 보세요.. 대부분 C++입니다..

Emdjdjr의 이미지

컥.. 국비교육이 기준은 아니지만, 요즘 왠만한 국비교육들은 보통 다 웹으로 시작하더군요..

거의 전부 JAVA로 시작해서, 웹쪽으로 퍼져나가던데..

말씀해주신 "요즘과 같은 개발 환경에서"는 웹을 겨냥하신게 혹시 맞을까용..?

C++을 잘해서 관련된 곳으로 취업하고 싶은데 이게 쉽지 않네요..

보통 채용싸이트에서도 거의 90% 이상이 웹으로 나가고, C나 C++은 그냥 프로그래밍 맛만 보고

넘어가는 수준인지라..

임베디드는 C로 구현되니 별개라고 쳐도.. C++을 쭉 파서 관련 직장으로 나가고싶은데 게임이나

결국은 유닉스/리눅스로 나가야 하는것 같아..서요.. ㅜ