1. 헬로우 프로그래밍

1.1 학습내용

1.1.1 목표

  • 프로그래밍이란 어떤 문제를 풀기 위해 컴퓨터가 실행할 수 있는 명령문으로 구성되어 있다는 것을 이해할 수 있다.
  • 컴퓨터는 사람이 사용하는 문자와 다른 부호를 사용한다는 것을 설명할 수 있다.
  • 프로그래밍에 필요한 환경을 설치하고, 실행할 수 있다.

1.1.2 문제

  • 시작-1: IPython Notebook을 실행하여, hello.ipynb를 만든다.
  • 시작-2: 원의 면적과 둘레를 계산하는 흐름도를 그린다.
  • 시작-3: 컴퓨터는 키보드 문자를 어떻게 이해하는지 설명한다.
  • 시작-4: 1+2의 결과를 출력하기 위한 명령문을 정의한다.
  • 시작-5: 자신의 영문이름의 성을 ASCII 값으로 출력한다.

1.2 프로그래밍이란 ?

  • 프로그래밍은 어떤 문제를 컴퓨터로 하여금 풀 수 있도록, 컴퓨터가 실행할 수 있는 명령문으로 작성하는 것이다.
  • 프로그래밍은 컴퓨터와 말하기를 배우는 것.
  • 로봇을 비유해서 설명할 수 있다.
  • 작업지시자인 사람은 작업의 내용을 잘 알아야 일을 시킬 수 있다.
  • 작업지시자는 로봇이 작업을 수행하는 방식을 이해해야 일을 시킬 수 있다.
  • 따라서, 명령문은 구체적이고, 로봇이 할 수 있어야 한다.
  • 로봇이 일을 하지 못하는 것은, 작업지시자인 사람이 일을 잘 못 시켜서 그렇다.

1.3 프로그래밍을 왜 배워야 하지?

  • 컴퓨터와 말하기를 배워서 어디에 쓸까?
  • 사람은 왜 말하기를 배울까? 내가 작업할 일을 다른 사람에게 요청하는 경우, '말'로 자신이 해야 할 일을 설명한다.
  • 프로그래밍을 배우는 목적은 컴퓨터에게 말해서 내가 풀려고 하는 문제를 대신 풀려고 맡기는 것이다.
  • 즉, 프로그래밍은 사람이 해야 할 일을 풀기 위해 하는 것이다. problem solving!

1.4 프로그래밍을 어떻게 하면 될까?

  • 말하기는 어떻게 하면 될까?
  • 말을 잘 한다는 것은 상대방이 내가 한 말을 잘 이해했다는 것.
  • 프로그래밍은 사람이 하는 일을 컴퓨터가 할 수 있게 컴퓨터에게 시키는 것.
  • 컴퓨터는 말하는대로 시키는 그대로 함.
    • 컴퓨터는 전기가 없으면 쓸모 없는 하드웨어.
    • 사람 vs 컴퓨터
    • 사람은 스스로 하지만, 컴퓨터는 사람이 하는 일을 자동화 하는 것.
    • 사람이 잘 하는 것은 무엇이며, 그것을 컴퓨터가 대신할 수 있을까?
    • 사람이 생각하고, 판단하고, 행동하는 것을 그대로 할 수 있을까?
    • 단순반복적인 일은 잘 하지만, 창의적이지는 못함.
      • "나는 컴퓨터! 하라고 하면 싫어도 하고, 화내지도 않아요!"
      • "그렇지만 시키는 일만 해낼 수 있어요!"
    • 사람이 문제를 풀어가는 과정은 컴퓨터와 다름.
    • 사람의 직관. 큰 수를 찾는 경우, 수를 정렬하는 경우, 좋은 자동차를 고르는 경우.
    • 컴퓨터는 그 절차를 명확히 정의해 주지 않으면 아주 단순한 문제도 풀 수 없다.
  • 컴퓨터가 일하는 방식을 이해
    • 컴퓨터에게 일을 시키려면 우선 무엇을 해야 하는지 내가 알아야 함.
    • 컴퓨터를 이용해서 문제를 풀어가려면 컴퓨터처럼 생각하는 것이 필요.
    • 프로그래밍은 사람이 문제를 풀어가는 과정을 흉내내는 것.
    • 컴퓨터 오류는 모두 일을 시키는 사람의 오류!
  • computational thinking은 컴퓨터로 하여금 문제를 풀어가도록 그 과정을 컴퓨터처럼 생각하는 것.
    • "Ways to Think Like a Computer Scientist"
    • The Two A's of Computational Thinking
      • Wing, J. M., 2006, Computational thinking. Communications of the ACM, 49(3), 33-35.
      • Abstraction
        • 개념화 - 구체적인 개념을 일반화. 개념을 계층화하고 그 관계를 정의.
        • 예: 운송도구 <- 버스, 지하철, 자전거 <- 자전거 <- 바퀴, 안장, 손잡이...
      • Automation
        • 추상화된 계층 및 관계를 기계화(자동화), 즉 표기법과 모델을 이용
        • 에: 더하기 -> 1 과 2를 더함 -> 두 개의 수를 더함 -> 두 개의 정수/소수/문자를 더함 -> a.add(b) 또는 diagram

1.5 프로그래밍은 무엇을 배우는 것일까?

  • 프로그래밍 (구성) 요소
    • 입력: 처리하면서 필요한 데이터
    • 출력: 처리의 결과로서 나오는 데이터
    • 순차: 순서에 따라 처리하는 과정
    • 조건: 경우에 따라 구분하여 처리하는 과정
    • 반복: 같은 처리를 여러 번 다시 하는 과정
    • 재사용: 프로그램의 일부를 고치지 않고 다시 사용. 함수를 사용함.
  • 영문법을 잘 안다고 영어를 잘 하는 것은 아니다.
    • 프로그래밍은 말을 배우는 것과 같이 말을 하는데 필요한 '문법'을 알아야 함.
    • 더불어 문제해결에 필요한 지식을 이해하고, 이를 프로그램으로 변환할 수 있어야 함.
    • 따라서 프로그래밍을 하면서, 문법오류와 논리오류를 경험하게 된다.
    • 정수에 소수를 넣거나, 문자에 숫자를 넣거나하는 문법오류
    • 논리오류는 평균은 모든 수를 더해서 갯수로 나눈다는 것을 위반하면 논리오류.
    • 흔한 논리오류의 예는 문닫고 들어와.

1.6 프로그래밍을 잘 하려면?

  • 어떻게 하면 프로그래밍을 잘 배울 수 있을까
    • 해보려는 마음 자세 motivate yourself!
    • 직접 해 보기 hands-on experience
      • 기술을 배우려면 10,000시간의 법칙. 100시간만이라도 집중해 보자.
      • 미국인이 한국어 3급 (업무를 볼 수 있는 수준)에 이르는데 2,400에서 2769시간 소요 (Defense Language Institute 미 국방 언어 연수원)
    • 컴퓨터처럼 생각하기. 안된다고 포기하지 않기.
      • 컴퓨터가 어려운 것이 아니라 '내'가 문제
      • 내가 컴퓨터를 잘 못 이해하고, 안되는 일을 시키고 있는 '내'가 문제!
      • 컴퓨터가 일 처리하는 방식을 이해하고, 그 방식에 따라 프로그래밍.

1.7 프로그래밍 환경

1.7.1 설치

  • 윈도우

  • 리눅스

    • 리눅스에는 기본 설치
    • 파이썬 패키지 관리자 (pip) 설치

        sudo apt-get install python-pip
      
    • 우분투 (데비안) 설치

        sudo apt-get install ipython-notebook
      

1.7.2 IPython Notebook

  • 윈도우는 시작 > 프로그램
  • 리눅스는 명령창에서 ipython notebook

1.7.3 diagram

  • diagram: PlantUML

시작-1: IPython Notebook을 실행하여, hello.ipynb를 만든다.

시작-2: 원의 면적과 둘레를 계산하는 흐름도를 그린다.

  • planttext.com
from IPython.display import Image
import os
dir=os.getcwd()
Image(filename=os.path.join(dir,'model/uml_simple.png'))

png

1.8 컴퓨터는 명령문을 어떻게 실행할까

1.8.1 부호화

  • 컴퓨터는 사람 말을 이해하지 못한다고 해야 맞다.
  • 컴퓨터는 우리가 사용하는 문자를 이해하지 못한다. 1,2,3과 같은 간단한 수도 알지 못한다.
  • 그러면 어떻게 컴퓨터는 명령문을 실행할 수 있는 것일까?
  • 0부터 9까지의 수를 표현한다고 해보자.
  • 컴퓨터는 기계이므로 on과 off만을 알 수 있다는 것에서 출발한다.
  • 전구 1개가 있는 경우, on-off 2가지 정보를 나타낼 수 있다. 즉 0과 1만 나타낼 수 있다.
  • 전구 2개는 4가지를 나타낼 수 있다.

00은 0

01은 1

10은 2

11은 3

  • 전구 3개는 8가지를 나타낼 수 있다. 이와 같이 $2^n$가지의 정보를 표현할 수 있다.
  • 따라서 0~9까지 10개의 정보를 나타내려면 전구 4개를 조합하면 나타낼 수 있게 된다.
  • 이와 같이 사람이 이해하는 방식과 다르게 컴퓨터는 숫자를 이진수로 부호화(encoding)하여 사용한다.
  • 전구 1개를 비트, 전구 8개를 바이트라고 한다.
  • 그렇다면 컴퓨터는 어떻게 키보드에 있는 문자를 알 수 있을까? 이진수로 부호화하면 7개 비트로 $2^7$, 126개의 문자를 표현할 수 있다.

1.8.1 프로그램의 실행

  • 메모리는 전구가 집단으로 있는 것으로 생각하자.
  • 메모리 위치는 주소를 가지고 있다. 그 위치는 일반적으로 8비트 데이터를 저장한다.
  • CPU는 메모리에서 명령문을 가져오고 실행한다.
  • 보조기억장치 또는 외부장치에 정보가 있다면 먼저 메모리로 가져온 후 실행한다.

시작-3: 컴퓨터는 키보드 문자를 어떻게 이해하는지 설명한다.

  • 사람은 키보드를 사용하여 문자를 컴퓨터에게 전달한다. 컴퓨터는 사람이 사용하는 문자를 그대로 사용하지 않는다.
  • 키보드 문자는 이진수로 변환된다.
  • 키보드 문자는 ASCII 문자코드로 나타낸다.
  • ASCII는 1바이트로 구성하고, $2^7$ (1비트는 오류검증용), 126개의 문자를 표현할 수 있다.

시작-4: 1+2의 결과를 출력하기 위한 명령문을 정의한다.

  • 1을 이진수로 변환하여 메모리에 저장한다.

    00000001

  • 2를 이진수로 변환하여 메모리에 저장한다.

    00000010

  • 메모리에서 두 수를 가져와서, OR를 사용해서 더한다.

    00000011

  • 결과를 출력한다.

    3

시작-5: 자신의 영문이름의 성을 ASCII 값으로 출력한다.

  • ascii는 문자표준코드 American Standard Code for Information Interchange
  • ord()함수는 ascii값
  • chr()함수는 문자를 출력한다.
print ord('a')
97
print chr(97)
a
for i in range(127):
    print chr(i),
             
                    ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~

results matching ""

    No results matching ""