처음 접하는 프로그래밍



처음 프로그래밍을 접할 때 어렵다고 느낄 수 있습니다.





x
프로그래밍을 하려면 컴퓨터에 명령하기 위해 프로그래밍 언어(C++, JAVA, 파이썬 등)를 배워야 하고, 이는 영어, 독일어 등 외국어를 배우는 것과 비슷하지만 문법적으로 조금만 틀려도 컴퓨터는 못 알아 듣고 에러를 출력하죠.




영어를 잘 못해도 외국인과 이야기 할 때는 표정이나, 손짓, 등을 통해 얼마든지 내 뜻을 표현 할 수 있지만, 컴퓨터는 이런 융통성이 부족합니다.

조금만 프로그래밍 언어의 문법에 어긋나면 (예를 들어 마침표를 찍지 않는다던지..) 바로 알아 듣지 못합니다.

사실 조금만 프로그래밍 언어에 익숙해 지면 위에서 말한 코드의 문법적 오류는 쉬운 범주에 속하는 오류라는 걸 알게되죠.

프로그래밍 언어로 만든 코드는 컴파일 과정을 거쳐 기계어에 가까운 형태로 변경되어 실행되는데 , 이 컴파일 과정에서 실수로 잘 못 작성된 코드의 문법적 오류는 컴파일러가 바로 알려주므로 조금만 익숙해지면 금방 찾을 수 있습니다.



찾기 어려운 오류는 코드 작성 시 (컴파일타임 이라고 합니다)에서 일어나는 오류가 아니라, 실행 시 (런 타임이라고 합니다) 일어나는 오류입니다.


단순한 문법적 오류가 아니라 의미상 오류(문법이 맞았지만 결과가 틀렸다)에 가깝다고나 할까요.


문법, 구문 오류(Syntax error) 찾기 쉬움

예) helo (X), hello(O)


논리, 의미상 오류(Semantic error) 찾기 어려움

예) cow meeting  room (소 회의실)



프로그래밍 언어를 배우며 문법이 어렵게 느껴지는건 나만 그런 것이 아니라, 배우는 누구나 겪는 일입니다. 해결방법은 모든 배우는 과정이 그러하듯이 의지를 갖고 시간을 투자해 차근차근 코드를 쳐 나가는 것 뿐이죠.


이제 어느 정도 프로그래밍 언어의 문법에 익숙해 져서 책이 없어도 간단한 코드를 작성할 수 있다면, 자료 구조에 대해 고민해봐야 합니다. 


자료 구조는 컴퓨터에 저장되는 데이터의 효율성(컴퓨터가 데이터를 저장, 추가, 검색, 삭제하는 등의 방법)에 대해 깊이 공부하는 분야입니다.


예를 들면 냉장고에 넣는 식품을 저장이 많이 되도록 종류별 구분 없이 차곡차곡 넣을지 (이 경우 자주 먹는 음식이 뒤쪽에 있는 경우 찾으려면 모두 꺼내야 함), 아니면 자주 먹는 것 부터 바로 찾을 수 있게 앞쪽에 둘지 고민하는 것과 같습니다.  


프로그래밍 언어의 문법만 알면 누구나 소프트웨어를 만들 수 있지만, 자료구조를 모른다면 효율적이고 최적화된 결과물이 나오지 않습니다.


A가 만든 소프트웨어는 크기가 10MB, 답은 얻는 시간은 1초가 걸린다면, B가 만든 결과물은 100MB, 10초가 걸릴 수 도 있습니다.




제가 많이 듣는 질문중에 하나가 "어떤 프로그래밍 언어가 가장 좋은가?" 인데, 무엇을 배우든 언어의 종류는 중요하지 않습니다.


왜나하면 프로그래밍 언어의 종류가 중요한 것이 아니라, 얼만큼 내가 배운 언어의 문법을 깊이 구사(마치 시를 표현하듯이)할 줄 알고, 자료구조에 대해 이해하고 있는가가 더 중요합니다.


특히 자료구조는 프로그래밍 언어의 종류와는 무관합니다. 즉, 어떤 언어에 의존, 종속적인 지식이 아니라 일종의 전산학을 의미합니다. C++에는 다양한 자료구조 타입을 언어 차원에서 지원하는 표준 컨테이너 클래스(STL)가 존재합니다.


자료구조라는 전산학의 이해가 중요한 중요한 이유는 컴퓨터라는 존재가 자료를 저장하고, 불러오는 절차, 방법이 인간과 다르기 때문입니다.


우리 인간은 자료를 머리에도 저장하고, 종이에 쓰기도 합니다. 그리고 수 체계는 주로 10진법을 쓰죠.


컴퓨터는 메모리에 자료를 저장하고 불러옵니다.

수의 진법은 메모리라는 반도체의 특성 때문에 2진법(전기의 있음 : 1, 없음 : 0)을 사용합니다.

그래서 "컴퓨터는 0과 1만 아는 바보다" 라고 이야기하기도 합니다.



요즘 '컴퓨팅 사고력'이란 단어가 코딩교육에서 많이 등장하는데, 그 뜻은 바로 인간과 컴퓨터가 데이터를 다루는 방법의 차이를 인간이 이해한 후, 컴퓨터에게 인간 영역의 문제를 어떻게 하면 작은 용량으로 빠르게 처리하도록 명령할 수 있는지 그 방법을 배우는 것 입니다.

재미있을 것 같지 않나요?

댓글

이 블로그의 인기 게시물

Qt Designer 설치하기

C++ 예제 (소켓 서버, 이미지, 파일전송)