ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 내 맘대로 프로그램 설계 1. - 이유와 준비.
    프로그래밍/설계 2017. 12. 27. 16:08

    이 시리즈는 HtDP(How to Design Programs)에 기초하여 작성이 되고, 앞으로 SICP(Structure and Interpretation of Computer Programs)로 보강이 될 계획입니다.

    참고로 HtDP 1판과 2판을 모두 참조중.(2판이 완전히 재작성이 되어가지고..)

    * 어디까지나 기초를 하여 작성하지, 그 과정을 똑같이 따라가지 않습니다.(저작권, 더 나은 학습방향??<-요건 장담못함. 때문)

       전 최대한 넓고 빠르게 배우는 것에 중점을 두고 있습니다.

    * 작성자가 더 낫다고 생각하는 방향대로 언제나 변경될 수 있습니다.


    참고로, 본격적으로 블로그를 활성화 시키기 위해 컴퓨터 사이언스나 프로그래밍에 대한 전반적인 것을 가르치는 내 마음대로 * 시리즈[작성자 마음대로 쓰기 위해 고른 제목이긴 하지만, 독자도 이것을 보면 마음대로 다룰수 있게 된다는 중의적인 의미..라 칩시다.]와 프로그래밍 언어를 다루는 * 랑(Lang) Study[얘도 여러가지로 중의적 의미.]를 기획중에 있습니다.

    일단 C언어부터 다룰듯.


    그럼, 시작하겠습니다.


    내 맘대로 프로그램 설계 시리즈.

    Chapter1 - 간단한 데이터 처리(4섹션)

    2017/12/27 - [프로그래밍/설계] - 내 맘대로 프로그램 설계 1. - 이유와 준비.(현재)

    2018/01/11 - [프로그래밍/설계] - 내 맘대로 프로그램 설계 2. - 데이터 타입.

    2018/01/16 - [프로그래밍/설계] - 내 맘대로 프로그램 설계 3. - 함수.

    2018/05/29 - [프로그래밍/설계] - 내 맘대로 프로그램 설계 4. - 고정 크기 데이터.

    2017/06/30 - [프로그래밍/설계] - 프로그래밍과 추상화에 대하여.[부록]


    Chapter2 - 임의의 데이터 처리

    2018/06/10 - [프로그래밍/설계] - 내 맘대로 프로그램 설계 5. - 리스트와 재귀.



    1. 프로그래밍을 배워야 하는 이유.

    1.1 프로그래밍은 보편적인 지식.

    프로그래밍 설계와 관련된 지식은 어디서든지 유용하다.

    프로그램의 설계는 지극히 논리적인 힘이 필요하고, 현대적인 사회의 각종 직업은 논리적 사고를 요구하는 경우가 많기 때문이다.


    예전에 내가 간단히 썼던 글

    2017/07/12 - [프로그래밍/개인적인 생각들.] - 프로그래밍, 그리고 학력, 진입장벽..

    을 인용하자면, 글쓰기와 프로그래밍은 창조의 행위, 기승전결의 내용구성, 진입장벽 등 모든 면에서 닮아있다.


    글쓰기 뿐만이랴.

    수학은 그 자체가 논리적으로 일반화하고 추상화하는 과정이고, 철학은 GNU와 오픈소스의 해커처럼 직접 맞닿아 있기까지 하다.

    건축에서도 자제를 만드는 건 Low-Level, 도면을 그리는 것은 아키텍쳐 설계등 프로그래밍과 비슷한 점이 많고(크리스토퍼 알렉산더란 건축가가 만든 패턴 언어라는 개념은 실제로 프로그래밍에도 큰 영향을 미쳤다. 패턴 랭귀지 참고.), 기계공학 같은 대부분의 공학들은 프로그래밍과 유사한점이 있다.


    공학 계열말고 사회과학인 경영학에서도(경영학은 이것저것 청강해가며 배우는 중ㅎㅎ.) 국제 인적자원관리의 조직은 객체 지향 프로그래밍(Object-Oriented Programming, OOP)와 상당히 닮은 부분이 보이는 등, 그다지 관련이 없어보이는 것들도 프로그래밍을 배우면 도움(?)이 될만한 분야가 많다.



    국제 인적자원관리와 객체지향 프로그래밍. 다이어그램이 비슷해보인다.

    [from International Human Resource Management(Dennis R. Briscoe), Object Oriented Analysis]


    심지어 예술 분야인 음악, 미술 부분도 악보와 그림을 프로그래밍(작곡, 구상)하고 컴파일(연주, 그리기)하는 면에서 닮은 점들이 있다. 많은 사람들이 사용하는 스프레트시트 프로그램인 엑셀도 자료흐름 프로그래밍이라는 패러다임에 속한다는 점을 상기시켜보면 프로그래밍은 우리와 의외로 가까운 곳에 있는지도 모른다.


    1.2 어디에나 있는 컴퓨터.

    이제 제 4차 산업혁명이 온다고들 한다.

    제 4차 산업혁명은 클라우스 슈밥(세계 경제 포럼의 의장)에 의하면 물리학(무인수송, 3D 프린터, 로봇, 신소재), 디지털(블록체인, IOT, 공유경제), 생물학(합성생물학, 유전자조작)으로 이루어져 있는데 무인수송, 3D 프린터, 로봇은 원래 IT 기술이 필요한 분야이고, 신소재, 합성생물학은 머신러닝이 활발하게 이용될 분야이다.


    즉, 앞으로 컴퓨터는 어디에나 있는 존재가 될 것이라는 것이다.

    이러한 상황에서 컴퓨터의 깊은부분에 속하는 기반지식은 모르더라도 간단한 조작법(프로그래밍)정도는 알아야 유용하고 사회에 어울려 살아가기 쉬워진다.


    디지털화 레벨

    [from Digitalization and the American workforce]


    실제로 브루킹스 연구소의 Digitalization and the American workforce라는 보고서에는 미국 전체 노동력 90%를 차지하는 545개의 직종의 디지털화(100점 기준)에 대하여 조사를 했는데 소프트웨어 개발자(94점), 컴퓨터 시스템 분석가(79점)가 상위그룹(60점 이상)에 속하고 있다.


    그런데 상위그룹이 전체 일자리에서 차지하는 비율이 2002년의 4.8%와 비교해 23%로 급격히 증가하였고(중간그룹은 39.5-> 47.5), 평균연봉도 약 8천만 원으로 다른 그룹과 비교하였을 때(중간그룹 기준 약 5천만 원) 경쟁력을 갖추고 있었다. 마지막으로 하위그룹은 60%의 직업이 로봇으로 대체할 수 있었지만, 상위그룹은 30%만 대체될 수 있는 것으로 나타나 디지털과 관련된 능력을 다룰수 있는 것은 갈수록 중요한 요인이 된다는 것을 알 수 있다.

    미래에는 거의 모든 것이 디지털화가 되어 컴퓨터에 대한 기초지식이 중요해지고 집에서 특정한 일을 자동화하기 위해 모두가 작은 프로그래머가 될지도 모른다.

     

    1.3 정리.

    프로그래밍은 창조를 하는 활동이여서 창의성이 요구되고, 그 과정에서 수없이 고민하며 추상화, 논리적, 비판적 능력을 키울 수 있다.

    여러 분야와 맞닿아 있기 때문에 프로그래밍을 잘하면 다양한 분야에 쉽게 적응할 수도 있고, 처음 배울때도 다양한 분야와 연계가 될 수 있기 때문에 진입장벽이 어마어마하게 낮다는 특징이 있다.


    2. 프로그래밍 설계를 배워야 하는 이유.

    2.1 탄탄한 기초.

    프로그래밍 설계를 배우는 것은 프로그램을 짜는 방법론에 대하여 아는 것이다.

    프로그램을 만드는 방법을 안다는 것은 어떠한 일이든 필요하고 위에서 계속 언급되었던 창의성, 논리력, 문제해결 능력 등을 키울 수 있어 도움이 된다.


    그리고, 프로그램을 진지하게 만들고자 하는 사람은 반드시 알아야 하는 요소이므로 기초를 다지기 위해 배워야 한다.

    언제나 기초는 중요하다는 것을 잊자 말자.


    2.2 구조.

    프로그래밍의 설계를 배우면 프로그램을 처음 만들때 구조를 잘 세울 수 있다.

    마치 건물의 도면과 기초공사를 튼튼히 하는 것과 같은 원리.


    큰 건물 일수록 하중이 커지기 때문에 기초공사를 잘하는 것이 중요하다.

    건물의 기초공사은 건축관련 블로그에 의하면,

    • 건물의 하중분산과 지반에 고정

    • 침수, 동결, 해빙으로 인한 습기와 부식, 지반의 융기와 침하로부터 벽체를 보호.

    • 강풍, 지진 등 자연재해로부터 건물을 보호와 안정.

    의 장점이 존재한다고 한다.


    이걸 프로그래밍으로 고스란히 치환해보면,

    • 프로그램의 복잡성의 분산과 안정화.

    • 버그로 인한 에러, 컴퓨터의 불안정성(하드웨어, SW 충돌)으로부터 데이터(또는 프로그램)를 보호.

    • 해킹으로부터 프로그램을 보호와 안정.

    건축의 용어를 은유적인 단어라 생각하고 하중-복잡성, 지반-컴퓨터, 침수, 동결, 해빙-내부의 버그, 지반의 융기, 침하-컴퓨터의 문제, 강풍, 지진-외부의 문제로 바꾼다면, 놀랍게도 말이 됩니다.


    대충 설계를 한다면 건물에서는 증축을 하기 어렵고, 금이가고 비틀어질수 있는 것처럼 프로그램에서도 이상한 구조를 가진다면 보완하기 위해 땜빵식 처방을 계속하게 되고 나중에는 구조가 너무 복잡해져 기능을 추가하기 어렵고, 급기야 각종 버그를 방치하게 되어 프로그램이 불안정적이게 됩니다.


    즉, 프로그램의 만드는 방법과 구조는 프로그램을 만들기 위해선 꼬옥- 배워야할 지식입니다.

    나중에 다른 사람의 코드를 볼때도 어떠한 방식으로 설계가 되었는지 알아보는 눈과 통찰력도 생긴다는 장점도 딸려옵니다.


    물론 프로그래밍도 분야가 넓기 때문에 전문적인 영역은 상당한 분업화가 이루어져 있습니다.

    또 건축으로 예를 들어볼까요?

    • 개집 수준의 간단한 시공: 주먹구구식으로 즉석에서 코딩하기
    • 단독주택 수준의 건축: 구조에 대한 설계를 시행후 프로그래밍 하기
    • 고층 빌딩 건축: 전문적 아키텍처 설계, 개발 방법론, 테스트등도 병행함, 세분화된 분업화


    2.3 정리.

    프로그램 설계하는 법을 아는 것은 중요하다.

    3. 준비하기.

    다음 강좌를 위한 마음의 준비(?)와 필요한 준비물을 위하여 만들어졌습니다.


    여기서 모르는 단어가 있어도 그냥 넘어가면 됩니다.

    필요하면 나중에 자세히 설명할 예정입니다.

    그냥 대충 계획을 한것이 아니라 나름의 이유를 가지고 한것이구나~ 하면 되요.


    3.1 고려사항.

    - 언어.

    컴퓨터 프로그래밍의 언어들을 가장 간단하게 분류하자면, 컴퓨터와 가까운 언어(Low Level)와 사람과 가까운 언어(High Level)로 나뉠 수 있습니다.

    Low

     

     

     

     

    High

    Machine Code

    Assembly

    C/C++, Pascal

    Java, C#

    Python, Javascript

    Lisp, Racket

    * Java와 Javascipt의 차이는 인도와 인도네시아 정도의 차이.


    기계어는 진짜 01011로만 이루어진 것 입니다.

    어셈블리는 기계어에서 특정한 의미를 가지는 것에 대응하여 치환된 문구를 사용합니다. 그래서 기계어나 거의 다름 없다는..

    C/C++, 파스칼류는 흔히 포인터라 말하는 것으로 메모리(Ram)의 주소(Address)를 다룰수 있습니다.

    Java, C#등은 GC(Garbage Collector)가 있어서 자동으로 메모리 관리를 해줍니다.

    Python, Javascript류는 스크립트 언어라 한줄씩 해석이 되며 기존의 강력한 생태계를 기반으로 조립만 할줄 알면 프로그램을 휙휙 만들어낼 수 있습니다.

    마지막으로 Lisp, Racket은 사람의 생각을 논리적으로 다루는 것에 집중을 한 언어입니다.


    범용성.

    현재 주류 언어인 C/C++, Java. C#을 배우는 것이 좋습니다.


    컴퓨터에 대한 이해.

    컴퓨터에 대한 이해를 하기 위해서 가장 좋은 것은 Assembly(기계어랑 거의 똑같으니까.)이지만, 상당히 실용성이 떨어지고 불편하기 때문에 C언어를 배우는 것이 좋습니다.


    편하고, 즉시 사용가능한것.

    Python, Javascript, Ruby같은게 최고!!


    개념잡기.

    Lisp, Racket쪽은 개념을 잡는데 좋습니다.


    핫한것.

    구글의 Go, 모질라의 Rust, 제트브레인의 Kotlin, 애플의 Swift가 있습니다.

    "요즘 뜨는 4대 프로그래밍 언어, 이렇게 배워보세요"

    지구상에 존재하는 프로그래밍 언어는 아주 많다. 위키백과에 따르면 1945년부터 2014년까지 프로그래밍 언어는 거의 매년 1개 이상 탄생했다. 중간에 사라진 언어도 있지만, 현재까지 공개된 프로그래밍 언어는 300개가 넘는다. 개발자들은 수많은 언어 가운데 자신에게 익숙하며 빠르게 개발할 수 있는 언어를 사용한다. 프로그래밍을 공부하는 방법도 다양하다. 누군가는 하나의 언어를 깊이 공부하고, 누군가는 비슷한 특성을 가진 언어를 비교하며 공부한다.

    * 그런데 Go언어는 GC가 있어서 C언어의 대체품으로는 안쓰이고, Python의 대체용으로 많이 쓰이는중.(Python보다 성능이 좋음.)


    여기 강좌.

    컴퓨터의 기반지식이 많이 필요한 C/C++ 같은 언어 대신, 고수준의 추상화로 더러운 부분이 숨겨져 있는 프로그래밍 언어를 사용하여 프로그래밍 그자체에만 집중할수 있도록 접근할 것입니다.

    순수하게 프로그래밍이란 큰 틀과 개념을 파악할 수 있도록.


    일단, Racket(Lisp계열로 Scheme의 변종)이라는 언어를 사용하여 기술하도록 하고 추후 파이썬(Python)을 추가해볼까 고려중입니다.

    Racket쪽이 개념을 잡기는 좋거든요.

    Python이 쉽고 편하기는 하지만.


    - 난이도.

    처음 배우는 사람도 적응을 할 수 있도록 조정하고, 되도록 영어가 아닌 한글로 설명하여 쉽게 접근하도록 하겠습니다.

    어렵거나 이해가 안되는 부분이 있으면 댓글로 써주세요~~


    고등학교 1~2학년 수준이면 할 수 있을정도를 목표로 잡고 있습니다.

    단, 한꺼번에 축약된 내용을 전달하려다보니 약간의 따분함이 느껴질거 같기는 합니다.

    챕터2를 작성중인데 너무 길어지더라구요;;


    - 부가사항.

    글의 중간에

    문제 챕터.코드번호

    문제내용


    코드:

    Code 챕터.코드번호

    코드.....

    결과: 답..

    의 형식으로 되어 있는 곳들이 있을텐데, 문제만 본후, 스크롤링을 그만하고 문제를 일단 풀고 난 뒤에 코드를 비교해주세요.


    사실 초반에만 문제가 조금 있지, 나중에는 복잡해지고 설명하기에도 벅차서 그리 많지 않을 겁니다.


    또한

    '+.'

    라고 되어 있는 부분은 본문에 넣기에 적합하지 않아 따로 표시해놓은 각주에 해당되는 부분이라 꼭 읽지 않아도 상관이 없고, 처음 공부하는 사람의 입장에서는 약간 어렵다고 생각될 수도 있습니다.


    그래도 봐두는 것이 좋기야 합니다.


    +.

    간단한 용어 정리.

    https://black7375.tumblr.com/post/169314484315/프로그래밍-관련-용어-간단-정리-작년초-동아리를-할때-강의하려고-만들었던-프레젠테이션


    3.2 프로그램의 기본 및 디자인 레시피.

    - 프로그램의 기본.

    대한민국 컴퓨터 프로그램 보호법에 의하면,

    "컴퓨터프로그램저작물"이라 함은 특정한 결과를 얻기 위하여 컴퓨터 등 정보처리능력을 가진 장치(이하 "컴퓨터"라 한다)안에서 직접 또는 간접으로 사용되는 일련의 지시·명령으로 표현된 창작물을 말한다.

    라고 나와있습니다.


    즉, 프로그램은 결과라는 자료(Data)를 얻기 위해 컴퓨터가 입력된 자료(Data)를 가지고 특정한 절차(Algorithm)로 처리하는 것이라 생각할 수 있습니다.


    - 디자인 레시피.

    이제 프로그램은 자료(Data)와 절차(Algorithm)을 처리하기 위한 것이라는 것을 알았을 것입니다.


    이 후 강좌에서 자료(이하 데이터)와 절차를 효과적으로 처리하기 위한 방법론의 기틀은 다음의 디자인 레시피에 따를 예정.


    디자인 레시피 .

    1. 문제 문석과 데이터 정의.
      문제에 주어진 데이터의 종류와 프로그래밍 언어처럼 표현하기.

    2. 계약, 목적, 헤더
      프로그래밍에 필요한 데이터의 종류와 결과, 프로그램의 머릿말 생성.

    3. 예시
      프로그램의 원하는 동작 예시.

    4. 함수 템플릿(틀)
      함수의 개요와 레이아웃을 작성.

    5. 함수 정의
      1~3을 참고하여 완전한 함수의 작성

    6. 테스트
      함수를 작성한후, 예제에 따라 테스트를 해봅니다. 이 과정에서 실수를 보완할 수 있습니다.

    7. 정리
      HtDP에는 없지만, 제 생각에 꼭 필요한 과정으로, 설계가 끝난후 필요가 없는 부분을 제거하고 코드의 가독성을 향상시킵니다.
      (완성도를 높히는 과정)


    처음엔 하나하나 쓰면서 과정을 진행하겠지만 익숙해지면 1~2번은 머리로 상상하면서 할 수도 있을 것입니다.

    디자인 레시피란 것은 코드품질의 표준편차를 줄이기 위해 정형화를 해놓은 것이기 때문에 정답이라고 할 수는 없지만, 프로그래밍을 처음 접할 때 일정한 프로세스를 제공하므로 도움을 줄 수 있습니다.


    3.3 개발 환경.

    3.3.1 개발 환경 설치.

    프로그램을 만들고 실행시키려면 개발 환경이 필요하겠죠?

    그저 다운로드 1개만 받으면 됩니다!!


    Dr,Racket

    https://racket-lang.org/


    여기에 들어가 각자의 OS에 맞게 다운을 받아 설치하면 됩니다.


    아래와 같은 창이 뜨면 끝!!(사이트에서는 한글을 지원하지 않지만 프로그램은 지원하니 겁내지 맙시다.)

    Help를 들어가면 한글로 설정을 바꿀 수 있습니다.


    아!! 저는 환경설정을 바꾸어서 초기 실행상태와는 다를 수도 있습니다.

    위에는 코드를 한꺼번에 적어놨다가 실행시킬수 있는 에디터(또는 정의) 공간이고,

    아래에는 한줄을 치면 바로바로 결과가 나오는 대화창이다.

    참고로 에디터창의 코드를 파일-저장을 사용하면 저장 할 수 있다.


    혹시 언어가 입문학생용으로 뜨지 않는다면,

    언어-언어고르기-입문학생을 선택하면 된다.

    이하 입문학생용언어를 BSL(Beginning Student Language)라 칭하도록 하겠습니다.

    BSL은 Racket이란 언어를 교육에 수월하도록 설정해 놓은 언어입니다.

    저희가 사용하는 BSL은 방대한 Rackt의 기능을 제한적, 그리고 교육용으로 일종의 튜닝이 되어있습니다.


    제 글에 Racket과 BSL이란 표현은 혼용되어 나오는데, Racket이라 표시된 부분은 Racket, BSL 둘다 포함이 되는 내용이고
    그냥 BSL이라 작성한 부분은 BSL에만 작용된다고 구분하면 됩니다.


    3.3.2 개발환경 부가 세팅.

    - 폰트.

    2018/07/08 - [프로그래밍/기타] - 프로그래밍 폰트

    를 참조하고, 취향에 맞는 폰트를 선택하세요.


    신경 안쓰는 사람들도 많지만 생각보다 중요합니다.

    프로그래밍을 할 때 글씨로 표현하고, 전달하고, 받아들이기 때문입니다.


    Hack이란 폰트를 강력 추천합니다.


    - 테마.

    파일-Install Package..에서 아래 링크를 넣고, 편집-설정-색상-Color Schemes로 가면 각종 테마들이 있습니다.

    취향에 맞추어 쓰세요.

    https://github.com/tuirgin/base16-drracket.git


    끝~~~



    댓글

Designed by black7375.