디시인사이드 갤러리

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

갤러리 본문 영역

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

어떡해갤로그로 이동합니다. 2010.09.10 23:24:35
조회 657 추천 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
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 어떤 상황이 닥쳐도 지갑 절대 안 열 것 같은 스타는? 운영자 24/05/20 - -
218018 c언어 관련한 소스코드나 예제 자료 많은곳 없을까요? [7] 돌멩이(220.70) 10.11.15 168 0
218015 자바로 배열 테스트를 해봤어 [5] 금호족기(61.75) 10.11.15 80 0
218014 토익쳤는데 850 나옴 스피킹은 7급 .. 찬양하라.NET갤로그로 이동합니다. 10.11.15 90 0
218012 쓰레드들의 대기시간 어떻게 구하나요??.ask [3] 자사또갤로그로 이동합니다. 10.11.15 75 0
218011 이함수 어디가 잘못됬는지 봐주세여ㅎ [6] 회전매니아갤로그로 이동합니다. 10.11.15 97 0
218009 아 미치겠네. [2] Kr_RedJ(218.154) 10.11.15 50 0
218008 클래스에서 인라인 함수에 대해 궁금한거; [8] 로아(121.132) 10.11.15 97 0
218006 er-win 이라는 툴이 이상한거야? 내가 이상한거야? 교수가 이상한거야 [3] ㅇㅇ(168.131) 10.11.15 72 0
218005 덕업일치 [3] cyluss갤로그로 이동합니다. 10.11.15 78 0
218003 아무도 안 알려줘서 다시 질문할게 자바야 [5] HERMES갤로그로 이동합니다. 10.11.15 92 0
218002 컴퓨터로 게임할 때 여자랑 하면 그게 과연 더 재밌을 거 같냐??.jpg [3] ㅇㅇ(222.107) 10.11.15 241 0
218001 근데 군대라기도 애매한게 [9] cyluss갤로그로 이동합니다. 10.11.15 131 0
218000 코딩할때 신나는 키보드 있지않음? [4] 카스가노소라갤로그로 이동합니다. 10.11.15 125 0
217999 지금 병특 1년차중인 늅늅이인데 [3] 캐발자갤로그로 이동합니다. 10.11.15 111 0
217998 늬들은 VCS 뭐쓰냐 [2] 딸기맛딸기(211.202) 10.11.15 66 0
217996 까꿍 [1] Alkyl갤로그로 이동합니다. 10.11.15 66 0
217993 cyluss 존나 언어 전문가인 척하네 [14] 딸기맛딸기(211.202) 10.11.15 220 0
217990 자바 코드가 간결하긴 얼어죽을 [3] 딸기맛딸기(211.202) 10.11.15 115 0
217989 자바 if문 질문인데 이건 간단한거야 [3] HERMES갤로그로 이동합니다. 10.11.15 168 0
217988 자바 프로그래밍을 짯는데 모르는 부분이 이썽 알려줭 [7] HERMES갤로그로 이동합니다. 10.11.15 96 0
217987 연산자 오버로딩에 관해서 설명해 줄 사람 없으심? [17] 프rog램ing갤로그로 이동합니다. 10.11.15 156 0
217986 예전에 내 친구가 잠깐 온라인 사행성 게임 만들었는데... [3] 한강구조견갤로그로 이동합니다. 10.11.15 202 0
217985 자바 코드 넘후 알흠답네.. [6] 스카페이스(218.51) 10.11.15 148 0
217982 포트란 프로그래밍점 엉엉 [4] Necoken갤로그로 이동합니다. 10.11.15 97 0
217981 3일 남으니까 [8] cyluss갤로그로 이동합니다. 10.11.15 116 0
217979 깊은 감명을 받고 노래를 들으니 참 좋다. [5] Gromit갤로그로 이동합니다. 10.11.15 112 0
217977 프갤훃들 음악이나 듣자능 뻘노래(121.182) 10.11.15 35 1
217976 지방에는 왜 개발회사가 별루 없냐? [1] 찬양하라.NET갤로그로 이동합니다. 10.11.15 112 0
217975 숙신은 봅니다. rntjr갤로그로 이동합니다. 10.11.15 68 0
217972 형동생너님들 질문잇습니다. [10] 대학생(182.208) 10.11.15 97 0
217970 서버에서 클라이언트로 사정없이 패킷 때려되나보네 [10] .3(124.137) 10.11.15 122 0
217969 집에다가 웹서버 설치한 후 학교에서 보니 [3] [성대아싸]갤로그로 이동합니다. 10.11.15 186 0
217967 안녕하세요, 프갤 늅늅 입니다^^ [8] 숙신갤로그로 이동합니다. 10.11.15 142 0
217966 리눅스마스터에 대해 아시는분.. [2] (180.66) 10.11.15 86 0
217965 연구소 밖에 있는 사람들은 죄다 경계해야함 [6] 해일리갤로그로 이동합니다. 10.11.15 220 0
217963 대기업SI업체 VS 중견 개발자 [6] ㅇㅅㅇ(115.92) 10.11.15 367 0
217961 글 찌끄릴 시간도 없땅 T.T [2] 해일리갤로그로 이동합니다. 10.11.15 73 0
217960 이승철 색히 [2] 이모군(1.225) 10.11.15 86 0
217959 분당살람은 봅니다. [1] rntjr갤로그로 이동합니다. 10.11.15 89 0
217958 부왘 치과의사 한달 수입 [3] 로아(121.132) 10.11.15 248 1
217956 안녕 병신들아 [4] 우유맛우유(211.202) 10.11.15 101 0
217954 안드로이드 db 연동 [2] 검은늑대(211.61) 10.11.15 1309 0
217952 vi 에디터나 익혀볼까? [6] 한강구조견(59.6) 10.11.15 161 0
217951 sbs 풍등 날리기.. [5] rntjr갤로그로 이동합니다. 10.11.15 408 0
217950 KITT의 super persuit mode의 포풍간지 [5] 분당살람갤로그로 이동합니다. 10.11.15 71 0
217948 나랑 같이 소셜거리자! [11] 분당살람갤로그로 이동합니다. 10.11.15 111 0
217946 형들아 나 궁금한거 있어. [7] Minryu갤로그로 이동합니다. 10.11.15 131 2
217945 클래스파일 -> java파일 디컴파일 했는데 소스가 병신같아 [2] 임베디드(115.94) 10.11.15 305 0
217944 it는 학벌도 중요해? [11] 로아(121.132) 10.11.15 340 0
217943 아이폰 개발, 맥북없으면 개발 못함? [3] 찬양하라.NET갤로그로 이동합니다. 10.11.15 214 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2