디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

어떡해 일기 스핀오프 :: 어떡해식 프로그래밍 언어를 습득하는 방법

어떡해갤로그로 이동합니다. 2010.09.10 23:24:35
조회 655 추천 0 댓글 11


이건 어떡해 일기와는 다른 이야기.
다만 새로운 언어를 습득함에 있어서 꽤 힘든 과정을 겪고 있는 학부생이나
기타 입문자를 위해서 작성 된 글입니다.
저의 경우에는 C언어는 비교적 쉽게 이해했으나, JAVA의 경우 상당한 진통을 겪으며 습득했습니다.
결과적으로 방법의 문제였던 것 같습니다.
JAVA가 객체지향이고 C언어와 다르다는 인식을 너무 강하게 한 나머지 JAVA언어 자체에 겁을 먹고 있던 것이죠.
그리고 이 언어를 어느정도 손에 익게 되었을 때, 프로그래밍 언어를 익히는 일종의 레파토리가 생겨나게 되었습니다.
습득 속도는 느리지만, 결과적으로 느리지만, 종착 할때에 가장 많이 얻게 되는 방법입니다.
저 스스로도 상당히 괜찮은 방법이라 생각되어 이렇게 글을 올립니다.

일단 하나의 교재가 있어야 합니다.
그리고 그 교재를 가지고 아래 6가지 과정을 순서대로 밟으면 됩니다.

1. 배울 언어의 특성 파악하기.
아예 프로그래밍 언어 자체를 처음 습득하는 뉴비라면,
그저 C언어는 절차지향언어 혹은 위에서 아래로 흘러가는 언어라고 이해하는 것만으로 충분합니다.

기존에 다른 언어를 습득하셨던 분이라면, 지금 배우려고 하는 언어가 이미 알고 있던 언어와 무엇이 다른가 정도로 충분합니다.
예를 들면 절차지향<->객체지향, 혹은 JAVA와 C#은 이런 미묘한 차이가 있다더라 정도면 충분합니다.
이것은 어떤 교재든 머릿말에 간략하게나마 적혀있는 것이 보통입니다.

이것은 자기자신이 언어를 습득하면서, 항시 기존의 언어와 비교해보면서 언어를 이해하는데에 필요한 구심점과 같은 도움을 줍니다.

2. main에 모아서 코딩하기
언어를 처음 접하는 분들의 경우에는 교재의 순서대로 따라가기 때문에 대부분은 이 main에 넣어서 코딩하는 과정을 거쳐서 흘러갑니다.
그러나 기존의 언어를 습득하신 분들 특히 객체지향 언어에서 객체지향으로 가는 경우.
클래스의 개념과 객체지향의 개념이 존재하는 상태에서 언어를 습득하게 되면 제일 먼저 main에 적게 코딩하고,
되도록 코드를 클래스나 함수로 나눠야 한다는 부담감을 가지게 됩니다. 나아가서는 메모리 구조나 기타 로우한 사항을 신경쓰기에 이르지요.
이것은 분명 맞는 말이지만, 결과적으로 해당 언어에 대한 친숙함을 익힐 과정을 뛰어넘게 되는 결과를 낳습니다.
C#에서는 광속 코딩을 하는데, 비슷한 모양새인 JAVA에서는 main 띄워놓고 벙쪄 있는 현상 같은 경우가 이 경우입니다.
구현할 수는 있는데 다른 언어를 하고 있다는 인식 자체가 부담감 + 어색함이 작용해서 무엇부터 시작할지 모르는 경우입니다.

이럴때에는 아무것도 신경쓰지 말고, 눈 딱감고 무조건 main에 코드를 구현해보세요.

예제 10개 정도를 구현하면, 아- 갑작스럽지만 이 언어로 슥슥 코딩할 수 있을 것 같다는 생각이 들기 시작하고
이 정도 코드면 나눠도 될 것 같다는 생각이 들 때가 있습니다.
그렇다면 언어에 충분히 친숙해진것입니다.

3. 코드를 쪼개서 함수나 클래스로 구현해보기, main에는 의도적으로 최소한의 코드만을 남겨보기.
기존의 언어를 습득하신 분들은 자연스레 이 경우로 넘어가게 되지만,
처음 객체지향을 습득한 사람이나, 수동적으로 언어를 습득하는 사람들에게 의외로 많이 일어나는 현상으로
Only main 코딩 포에버 라는 현상이 있습니다.
모든 코드를 메인 코드에 넣고, 함수로 깔짝 깔짝 빼는 현상입니다.
이런 경우, 나누기 싫어서 나누지 않았다기 보다는 이전에 해보지 않아서 애써서 하기 어색하고 굳이 하지 않아도 된다는 생각을 가진
분들이 대부분입니다.
그렇다면 한번 의식적으로 코드를 쪼갤 수 있는 대로 최대한 쪼개봅시다.
우선은 기능 순으로 한번 쪼개봅시다. 가령 간단한 덧셈을 구현하는 코드라면 1+1; 과 같이 출력케 하지말고
굳이 sum(1,1)과 같은 방식으로 함수로 넘겨봅시다.
그리고 더 나아가서 calcu(1,1,+) 과 같은 것도 한번 구현해봅시다.
자연스레 함수로 나누는 습관, 그리고 함수와 함수의 관계에 대해서 신경쓰게 됩니다.

4. 두개이상의 예제를 혼합하여 코딩해보기.
책에는 많은 예제가 있습니다.
대부분 하나의 기능을 소개하고, 그 기능을 사용하는 식의 예제입니다.
하지만 그런 예제는 많은 부분에서 단조롭습니다. 그리고 막상 그때 구현한다고 해도, 뒤돌아서면 구현을 어떻게 했는지 기억도 잘 나지 않고
다시 사용하려면, 음음 하는 신음만 흘리게 됩니다. (느끼는 것은 아닙니다)
이것은 예제를 코딩해봤지만, 막상 그 예제를 책에 있는 그대로 혹은 기계적으로 코딩했기 때문입니다.
그다지 머리속에 남지 않았다는 것이죠.

이럴때에는 예제 2개를 혼합하여 코딩을 해봅니다.
가령 번호를 입력하면 물건이 구입되고 지갑에서 돈이 빠져나가는 자판기 프로그램과
랜덤 숫자를 출력하는 프로그램 예제가 있다면

이것을 물건을 구입하면 지갑에서 돈이 빠져나가고, 복권도 한장 나와서 그 복권이 당첨되면 해당 당첨금액을 반환해주는 프로그램을 짜봅시다.

해당 기능을 사용하는 것과 구현하려는 생각이 더해지면서, 코딩하는 내내 이것저것 시험해보고 고민해보게 됩니다.
결과적으로 다시 그 기능을 코딩할 때, 자신도 모르게 그 기능이 키보드를 통해 놀라운 속도로 코딩되는 것을 알게 됩니다.
혹자는 이것을 본능 코딩이라고 합니다.

5. 중소규모의 프로젝트 진행해보기
커다란 규모가 아니어도 좋습니다. 책을 완독하고 스타크래프트 같은 프로그램을 짜라는 이야기가 아닙니다.
이 이야기는 위의 4번의 확장형으로 예제를 두개를 합치듯이 한 파트를 끝내고 기존에 예제들이 설명한 기능을 모두 사용할 수 있는
작은 프로젝트를 진행하라는 이야기입니다.
가령 화면에 헬로 출력, 배열, if문, switch문 for문 등의 과정을 종료했다면 이 모든 기능을 포함하는 프로그램을 작성해보라는 의미입니다.
이상한 것이더라도 좋습니다. 단. 반드시 배웠던 파트의 내용 모두를 포함하여야 합니다.
가령 쉬프트 연산을 왼쪽으로 한번 했을 시, x2가 되지만, *2를 해도 똑같이 x2가 됩니다.
하지만 의도적으로 쉬프트 연산을 이용해서 코딩을 해봅니다.
주변에서 뭐라고 해도 일단은 귀를 닫으십시오. 배움을 위한 코딩과 실무를 위한 코딩은 엄연히 다릅니다.
어처구니 없는 억지 코딩일지라도, 이 코딩하는 방식은 결국 실무적인 코딩을 할 때 상당히 다른 모습을 갖게 해줄 것입니다.

6. 5를 통해 작성한 프로그램을 그림으로 그려보기.
이 과정은 시간이 지남에 따라 5와 순서가 바뀔 수 있습니다.
하지만 누락해서는 안될 것입니다. 본격적인 설계와 관련된 부분입니다.
가령 처음 코딩을 시작할 때는 별 고민을 하지 않게 됩니다.
예를 하나 들어봅시다. 액션 게임입니다. 주인공이 칼을 들고 몬스터를 칩니다. 몬스터는 억 소리를 내고 쓰러집니다.

그럼 이렇게 되겠네요

타격 -> 억 사운드 재생 -> 몬스터 쓰러짐 -> exp업 -> 이겼다

그렇다면 이것은 어떨까요?

타격 ->몬스터 쓰러짐 -> 억 사운드 재생 -> 이겼다 -> exp업

첫번째의 경우에는 억 사운드 재생을 반복함으로서 몬스터가 타격받고 있다는 것을 표시할 수 있는 장점이 있네요.

그렇지만 두번째의 경우 타격시에는 아무런 효과도 없고, 비로소 몬스터가 쓰러져야 억 소리를 내게 됩니다.

사용자 입장에서는 타격이 들어가는 지 아는 것이 쉽지 않겠네요, 하지만 이겼다는 메시지가 출력된 후, exp업이 됨으로 통해

심리적으로 승리에 따른 보상이라는 느낌이 exp업이 된후 이겼다는 메시지를 받은 것보다 큰 것 같네요.

그럼 이 장점을 합쳐봅시다.

타격 -> 억 사운드 재생 -> 몬스터 쓰러짐 -> 이겼다! -> exp업


이 그림으로 자신이 작성한 프로그램을 그려보는 과정은 바로 가장 효과적이고 상황에 가장 적절한 프로그램 설계를 할 수 있도록 도와줍니다.
이것이 익숙해지면, 코딩을 시작하기 전에 연습장에 그림을 끄적인 후, 그 끄적인 그림을 그대로 코딩으로 옮기는 습관이 생기게 됩니다.
그리고 결과적으로 이것이 속도도 빠르고 에러율도 낮다는 생각도 하게 됩니다.
매우 중요합니다, 이 뿐만이 아니라도 자기가 짝 프로그램을 전체적으로 파악하여 문제점을 추출하는 데에도 상당한 도움이 됩니다.
혼자 작성한 프로그램이라도 100줄이 넘어가면 소스 보기가 힘들어집니다.
아무리 주석이 달려있고, 되도록 쉽게 코딩을 했더라도 아무래도 전체적인 형상을 파악하기는 힘이 듭니다.
이럴 때는 이렇게 그림을 그려봅시다.

7. 가장 확실한 습득 방법은 삽질이라는 것을 잊지 않습니다.
스터디를 하면서 앞에서 가르쳐보기도 하고, 소스 코드를 설명해주어서 얻게 된 결론인데,
막상 언어를 습득하는 사람들은 대부분 그 언어를 습득하고자 하면서도 반복적인 실패를 굉장히 꺼려하는 경향이 있습니다.
흔히 우리가 이야기하는 삽질이죠.
"이것은 어떻게 합니까?" 이렇게 물을 때 질문자가 원하는 것은 정답입니다.
하지만 언어를 습득하는데 있어서 실질적으로 이 정답은 별로 도움이 되지 않습니다.
언어라는 것은 일종의 테크닉이라고 생각합니다. 프로그래밍에 알고리즘이라는 문제를 해결하는 방법이 존재한다면
프로그래밍 언어라는 것은 그 방법을 코드로 구현하는 일종의 도구 사용법입니다.
그렇기 때문에 많이 써보고 많이 실패해서 그 도구에 익숙해져야 코드 구현이 능숙해집니다.
이렇게 한번 물어보세요.
"만약에 이걸 이렇게 쓰면 어떤 문제가 있을까요?"
아, 그전에 검색은 한번 해봅시다.


제가 언어를 습득하는 방법은 이렇습니다.
아무쪼록 저와 같이 입문을 하시는 분들에게 많은 도움이 되기를 바랍니다.


추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 SNS로 싸우면 절대 안 질 것 같은 고집 있는 스타는? 운영자 24/05/06 - -
214238 형들 떡밥임 물어봐 [4] 116.44(116.44) 10.10.25 117 0
214236 땁땁하구만.... 씨발라드세요갤로그로 이동합니다. 10.10.25 54 0
214235 우리 회사에서 사람을 좀 많이 뽑는데... 지원할 사람 있나? [14] 물속의다이아갤로그로 이동합니다. 10.10.25 230 0
214234 책사러 서점갔다가 빡처서 그냥 왓다 고칼로리갤로그로 이동합니다. 10.10.25 69 0
214233 졸업시험이냐 졸업논문이냐 씨발라드세요갤로그로 이동합니다. 10.10.25 73 0
214231 벡스코 ITS 세계대회 유리한갤로그로 이동합니다. 10.10.25 105 0
214230 Linux에서 C코딩할 때 간단한 질문있는데... [25] 엽기토깽이갤로그로 이동합니다. 10.10.25 286 0
214228 국민학교 6학년 때 맘에 드는 여자애 한테 읽던 책을 빌려달라고 했는데 [2] 물속의다이아갤로그로 이동합니다. 10.10.25 131 0
214226 Java 스위치 질문점 [4] 지옥의신병(210.119) 10.10.25 88 0
214225 리눅스에 서버돌리면서 웹좀 쓸라햇더니 [4] 아오빡쳐(182.208) 10.10.25 88 0
214224 어제 KBS 다큐보니까, 스티브잡스 자서전 쓰고있덴다; [3] .3(124.137) 10.10.25 135 0
214223 컴파일러 사용할떄 질문좀.. [2] ㄴㅇㄹ234갤로그로 이동합니다. 10.10.25 65 0
214222 횽들 string클래스에 remove메소드가 존재함? [5] ㅁㄴ(220.66) 10.10.25 83 0
214220 이러니 욕처먹지... [5] rntjr갤로그로 이동합니다. 10.10.25 253 0
214219 미치고 환장하고 돌아가시겠다... [2] 아주아슬갤로그로 이동합니다. 10.10.25 78 0
214218 소셜 개발자 모십니다. 대박아이디어 있음. [3] 씬입사원갤로그로 이동합니다. 10.10.25 164 0
214216 계절마다 찾아오는 몹쓸 병들 [2] DMW갤로그로 이동합니다. 10.10.25 92 0
214213 플갤횽들에게는 엄청쉬운 간단한키입력매크로 질문이여!! [2] 뉴비(210.178) 10.10.25 112 0
214209 형아들 면접에서 다음과 같이 질문한다면 대답 어떻게 할거임?? [3] 테님(165.132) 10.10.25 120 0
214207 노래한곡. 翼をください [1] 개쉛기갤로그로 이동합니다. 10.10.25 47 0
214205 내 사진 올린다- 이거보고 나보다 못생긴 사람은 좆잡고 반성해라 [6] 개쉛기갤로그로 이동합니다. 10.10.25 203 0
214204 기분 좋은 월요일이야... [1] 물속의다이아갤로그로 이동합니다. 10.10.25 60 0
214203 씨발 아침에 출근해서 컴터를 키니 보드가 나갔어.... [1] 햏햏했갤로그로 이동합니다. 10.10.25 80 0
214201 졸라 이상하다 [1] ㅇㅇㅃ갤로그로 이동합니다. 10.10.25 54 0
214200 여러분의 덕력은 안녕하십니까? 개쉛기갤로그로 이동합니다. 10.10.25 89 0
214199 에고.. 자고싶은데 ㅜ.ㅜ [6] Minryu갤로그로 이동합니다. 10.10.25 104 0
214198 2:8의 법칙 ㅇㅇㅃ갤로그로 이동합니다. 10.10.25 84 0
214197 신용평가에 영향을 주는 요인은? [5] cyluss갤로그로 이동합니다. 10.10.25 143 0
214196 po휴강wer [3] ㅇㅇㅃ갤로그로 이동합니다. 10.10.25 100 0
214194 으아니 ... [7] ㅋㅋ(121.50) 10.10.25 103 0
214192 덕짤이 와써열 ' ω')r [5] 땡칠도사갤로그로 이동합니다. 10.10.25 143 0
214191 re)횽들 도와주세요ㅠㅠ [6] 하후하오하갤로그로 이동합니다. 10.10.25 84 0
214190 시험 끝났는데........ [1] ∫ 2t dt=t²+c갤로그로 이동합니다. 10.10.25 57 0
214186 오늘 서점 갈껀데 머머 사는게 좋겟나 [2] 고칼로리갤로그로 이동합니다. 10.10.25 101 0
214185 밑에 시험보는 새끼는 내가 아무리 봐도 이해불가다 [3] 111(218.55) 10.10.25 93 0
214184 C 구조체 정렬 도와주세요. [2] ㅁㄴㅇㄹ(210.115) 10.10.25 169 0
214183 Constructor 사용법좀 갈켜주세요 ㅠㅠ [1] knu(155.230) 10.10.25 123 0
214180 여성학듣는데 와 대박........ [7] Minryu갤로그로 이동합니다. 10.10.25 353 0
214179 노트북 다시 세팅 cyluss갤로그로 이동합니다. 10.10.25 49 0
214177 지금 씨언어 시험보고있는데 급해 얼른답해줘제발 [8] 안녕(114.70) 10.10.25 172 0
214176 인터넷진흥원에서 하는 비지니스 지원프로그램 면접갑니다. 호이호호이(175.197) 10.10.25 64 0
214175 (멀티부팅관련)openSuse를 설치할 때 시스템에 악영향을 안 끼치도록 [4] 슬프다ㅠㅠ갤로그로 이동합니다. 10.10.25 99 0
214173 물리학에 보면 작용/반작용의 법칙 이라는거 있지? [1] rntjr갤로그로 이동합니다. 10.10.25 94 0
214172 페북 친추해라. [5] yundream(115.91) 10.10.25 119 0
214171 횽들 자바 출력 예쁘게 하는것좀 알려주세요 [5] 학부생(165.229) 10.10.25 185 0
214170 음 결국 대세는 웹이 되지 않을까 ? [2] yundream(115.91) 10.10.25 126 0
214169 서버에 파일 업로드 [2] AutuMn(115.94) 10.10.25 81 0
214168 마이 빌더 쓸줄 아는 님 있음요? ㄴㅇㄹ(112.223) 10.10.25 180 0
214165 마 출근했으면 일해야되지 시퍼요 담배는팔팔갤로그로 이동합니다. 10.10.25 96 0
214162 늦엇다.. 이런개쉥키들 [2] ㅇㅁㅁㄴ(210.178) 10.10.25 99 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2