Unit 1. 소프트웨어 교육과 파이썬

1.1 문제 해결을 위한 과학적 사고

전화기, 자동차, 영화산업, 의료 기술, 인공지능 등의 발달로 소프트웨어의 사용 범위는 계속 넓어지고 있다. 그 결과 소프트웨어를 적절히 사용한 기업들은 크게 성장하였으며 소프트웨어 기술은 점점 중요해지고 있다. 

소프트웨어는 지금까지 불편했던 문제들을 해결하기 위해 개발되었다. 복잡한 문제들을 소프트웨어를 사용하여 어떻게 해결할 수 있을까 ?

 

1.1.1 복잡한 문제를 작은 문제로 분해

자율주행 시스템의 경우 사람의 눈과 귀 역활을 하는 카메라와 센서가 주변 상황을 인식하고, 팔과 다리 역활을 하는 각종 제어 장치를 통해 자동으로 움직이게 하고, 주변 상황 정보, GPS 정보, 지도 정보 등을 이용하여 하나의 자율주행 시스템을 만든다. 이처럼 복잡한 문제를 작은 문제로 나누어 하나씩 해결하게 되면 결국 큰 복잡한 문제도 해결할 수 있게 된다. 

 

1.1.2 날씨 데이터를 그래프로 그리는 문제

기상청 웹 사이트의 날씨 데이터(주요 도시의 기온과 습도)를 막대 그래프로 나타내기 위한 방법은 다음과 같다.

웹사이트는 보통 HTML로 글자와 그림을 표시하기 때문에 HTML을 분석하여 도시 이름, 기온, 습도 값이 저장된 위치를 찾아야 한다. 이후, 분석한 데이터를 토대로 기온, 습도 정보를 가져와서 정형화된 데이터로 만든다. 그리고 데이터중 주요 도시를 추출하여 그래프를 그리면 된다. 이렇게 작은 문제들을 해결하다 보면 큰 문제인 기상청 웹 사이트의 데이터로 그래프를 그린다는 큰 문제를 해결할 수 있다.

 

1.1.3 컴퓨테이셔널 씽킹

위 사례들처럼 일상생활의 문제점에서 해결책을 찾는 과학적 사고법을 컴퓨테이셔널 씽킹 이라고 하고, 이렇게 설계한 해결책을 컴퓨터 명령어로 작성하는것을 컴퓨터 프로그래밍이라고 한다. 작은 문제로 분해하고, 문제의 패턴을 발견하고, 어떤 데이터를 이용해야 하는지 결정하고, 문제를 일반화하고 모델링할 수 있는지를 찾는 과정이다.

 

1.2 알고리즘과 코딩

 

1.2.1 압축 알고리즘

사진은 보통 jpg 확장자로 저장되는데, 이것이 압축 알고리즘을 구현한 포멧이다. 사진을 그대로 저장하면 용량이 너무 크기 때문에 압축하여 저장하면 더 많은 양의 사진을 저장할 수 있다. 

"aaaabbbcccccddd" 라는 문자열이 있는데, 이 문자열은 같은 문자들이 반복된다는 패턴을 갖고있다. a는 4번, b는 3번, c는 5번, d는 3번 반복되고 있다. 이 문자는 이와 같이 표현할 수 있다. "a4b3c5d3" 이는 컴퓨터에서 쓰였던 압축 알고리즘이다. 이 방식은 Run-Length Encoding 이라고 하며, PCX그림파일 압축에 쓰였다.

 

1.2.2 문제의 패턴 발견과 해결 절차

문제에서 일정한 패턴을 발견하고, 패턴을 토대로 문제를 해결하는 절차를 알고리즘이라고 하며, 알고리즘을 코드로 표현하는 행위를 코딩 이라고 한다. 

 

1.3 파이썬

파이썬은 네덜란드의 귀도 반 로섬이 개발한 프로그래밍 언어이다. 

문법이 쉽고 간단하며, 다양한 패키지가 제공되어 생산성이 높고, 유지보수 비용이 적게들며, 오픈소스라 무료로 제공되고, 객체지향 언어라는 특징이 있다.

 

Unit 2. 파이썬 설치하기

사용중인 컴퓨터 (macOS) 에 Python 3.9.1 버전을 설치하였고, 개발환경은 vscode를 사용할 예정이다.

 

Unit 3. Hello, world! 출력해보기

3.1 IDLE에서 Hello, World! 출력해보기

print('Hello World')

위와 같은 방식으로 Hello World 라는 문자열을 출력할 수 있다. print( ) 안에 출력하고 싶은 문자열을 넣으면 된다.

위 사진은 파이썬 셸에서 코드를 실행한 것이다. 위처럼 코드를 한 줄 한 줄 실행하여 결과를 얻는 방식을 인터프리터 방식이라고 한다.

 

3.2 IDLE 에서 소스파일 실행하기

파이썬 개발환경을 vscode로 사용할 것이기 때문에 vscode에서 소스파일 실행하는 법으로 대신하겠다.

EXTENSIONS 에서 python과 Code Runner를 설치한다.

 

Code Runner 을 설치하면 우측 상단에 아래와 같은 재생 버튼이 생긴다.

.py 확장자를 가진 파이썬 파일에 코드를 적고 재생버튼을 누르면 소스 파일을 실행할 수 있다.

파이썬 코드를 저장한 .py 파일을 파이썬 스크립트라고 한다.

 

3.3 명령 프롬프트에서 Hello World 출력하기

3.3.1 명령 프롬프트에서 파이썬 사용하기

위 사진과 같이 명령 프롬프트에서 python3를 입력하여 파이썬 셸을 실행할 수 있다.

명령 프롬프트에서 파이썬 셸을 끝낼면 exit()를 입력하거나 윈도우의 경우 CTRL + Z, 리눅스와 macOS의 경우 CTRL + D를 누르면 셸을 종료할 수 있다.

 

3.3.2 명령 프롬프트에서 스크립트 파일 실행하기

위 사진과 같이 # python3 스크립트파일.py 의 형식으로 실행할 수 있다.

리눅스와 macOS의 경우 앞에 python3를 붙이지 않고 .py 파일을 그대로 실행할 수 있다.

위와 같이 파일을 저장하고 아래와 같이 명령어를 입력한다.

chmod +x 로 실행권한을 준 후에, 스크립트 파일을 실행하면 된다. 

파일 첫 줄의 #!/usr/bin/python3 는 셔뱅 이라고 한다. 셔뱅은 현재 파일을 실행해 줄 프로그램을 지정할 때 사용한다. 그래서 셔뱅에 파이썬 경로가 지정되어 있기 때문에 파이썬으로 해당 스크립트 파일을 실행한다.

 

3.4 소스코드 살펴보기

print('hello world')

이 코드의 실행 결과만 보더라도 print가 hello world를 출력한다는 것을 알 수 있다. ' '(작은따옴표)로 묶은 부분을 문자열 이라고 하고, print는 값을 화면에 출력해준다. 

print() 처럼 단어 뒤에 괄호가 붙은 것을 함수라 하며 정해진 일을 수행하는 단위이다. 함수 실행을 다른 말로 함수를 호출한다고도 한다.

 

3.5 심사 사이트 사용하기

코딩도장 사이트에서 회원가입을 하고, 강좌 등록을 하면 해당 강좌의 퀴즈를 풀 수 있다. 채점이 완료되면 답안과 문제의 해설이 출력된다.

 

3.6 퀴즈

위 문제의 답은 d 선지 이다.

위 문제의 답은 python3 dojang.py 이다.

 

3.7 연습문제: 문자열 출력하기

다음 소스 코드를 완성하여 'Hello, world!' 'Python Programming' 각 줄에 출력되게 만드시오.

문제의 답은 아래 코드와 같다.

print('Hello, world!')
print('Python Programing')

 

3.8 심사문제: 문자열 출력하기

'Hello, world!' 두 개를 각 줄에 출력하는 프로그램을 만드세요. 

문제의 답은 아래 코드와 같다.

print('Hello, world!')
print('Hello, world!')

개행문자를 사용하여 아래와 같이 한 줄의 코드로도 표현할 수 있다. \n은 줄을 바꾸는 개행문자이다.

print('Hello, world!\nHello, world!')

 

Unit 4. 기본 문법 알아보기

4.1 세미클론

많은 프로그래밍 언어들은 구문이 끝날때 세미클론(;)을 붙여야 하지만 파이썬은 붙이지 않아도 된다. 

그러나 아래와 같이 여러 구문을 한 줄에 표현할 때 세미클론을 활용할 수 있다.

print('hello'); print('world')

 

4.2 주석

주석은 파이썬 인터프리터가 처리하지 않아 프로그램의 실행에는 영향을 주지 않는다.

주석을 활용하여 코드에 대한 자세한 설명을 적거나, 특정 코드를 임시적으로 사용하지 않을 때 활용할 수 있다.

 

4.2.1 한줄주석

다음과 같이 한 줄 주석으로 코드에 대한 설명을 붙일 수 있다.

# hello world 출력
print('hello world)

다음과 같이 코드 앞에 주석을 의미하는 #을 붙이면 코드는 주석이 되어 프로그램에서 실행하지 않는다.

# print('hello world')

다음과 같이 코드 뒤에 주석을 쓰게 되면 주석 앞에 있는 코드만 실행하게 된다.

add = 1+2 # 더하기
print('hello world') # hello world 출력

 

4.2.2 블록 주석

블록 주석은 각 줄의 맨 앞마다 #을 넣어주고, 읽기 편하도록 # 뒤에 한 칸씩 띄어 써준다.

# 더하기
# add = 1+1
# 출력
# print(add)

여러 줄 주석을 사용할 때는 다음과 같은 방식으로도 사용할 수 있다.

'''
더하기
add = 1+1
출력
print(add)
'''

파이썬의 기본 인코딩 방식은 utf-8 이지만, utf-8이 아닐경우 한글이 스크립트 파일 안에 들어가면 실행 시 에러가 발생할 수 있다.

 

4.3 들여쓰기

들여쓰기는 코드를 읽기 쉽도록 일정한 간격을 띄워 작성하는 방법이며, 파이썬에서는 들여쓰기 자체가 문법이기 때문에 다음 if문 같은 경우 항상 들여쓰기를 해야한다.

if a==10:
	print('a는 10이다')

들여쓰기 방법은 공백 2칸, 4칸, 탭 등이 있다. 파이썬 코딩 스타일 가이드(PEP 8)에 따르면 공백 4칸으로 규정하고 있다.

 

4.4 코드블록

코드 블록은 특정한 동작을 위해 코드가 모여있는 상태를 의미한다. 들여쓰기를 기준으로 코드블록을 구분하며 같은 블록은 들여쓰기 칸 수가 같아야하며, 공백과 탭을 섞어서 사용하면 안된다.

if(a==10):
    print('a는 10입니다')
    print('여기까지 같은 블록')

 

Unit 5. 숫자 계산하기

파이썬에서 숫자의 자료형은 정수, 실수, 복소수로 구분한다. 프로그래밍에서는 주로 정수와 실수를 사용하며 복소수는 공학 분야에서 주로 쓰인다. 

 

5.1 정수 계산하기

5.1.1 사칙연산

파이썬 프롬프트에서 다음과 같이 사칙 연산이 가능하다.

나눗셈 부분을 보면 5/2 가 2.5 가 나왔다. 내가 사용한 파이썬 버전이 3이라서 그런것인데 파이썬2 에서는 2가 나온다. 파이썬2 에서는 정수 끼리의 나눗셈은 정수가 나오도록 되어 있고, 파이선 3는 정수끼리 나눗셈을 해도 실수가 나오도록 되어있기 때문이다. 실제로 4/2 를 확인해보면 2가 아닌 2.0이 나온다.

 

5.1.2 나눗셈 후 소수점 이하를 버리는 // 연산자

다음과 같이 // 연산자를 사용하게 되면 나눗셈의 결과가 정수로 나온다.

//은 버림 나눗셈(floor division) 이라고 부르며 나눗셈 결과에서 소숫점 이하는 버린다.

다음과 같이 실수에 // 연산자를 사용하면 결과는 실수가 나오며 항상 .0으로 끝난다.

 

5.1.3 나눗셈 후 나머지를 구하는 % 연산자

% 연산자는 나눗셈이 나누어 떨어지지 않을 때 나머지만을 구하는 연산자이다. 모듈로(modulo) 연산자라고 부른다.

5.1.4 거듭제곱을 구하는 ** 연산자

다음과 같이 ** 연산자를 활용하여 거듭제곱을 구할 수 있다.

 

5.1.5 값을 정수로 만들기

int()에 숫자, 계산식을 넣으면 값을 강제로 정수로 만들 수 있다. 정수로 된 문자열도 가능하다. 실수를 넣었을 경우 소숫점 이하는 버린다. int는 정수(integer)을 의미한다.

3번째 예시처럼 숫자를 ' '나 " " 가 감싸고 있으면 문자열이다. 

 

5.1.6 객체의 자료형 알아내기

type(값)

위와 같은 형태로 객체의 자료형을 알아낼 수 있다. 

결과값을 보면 <class 'int'> 라고 나와있는데 정수(int)클래스 라는 뜻이다. 파이썬에서는 숫자도 객체(Object)이며, 객체는 클래스(class)로 표현된다.

 

5.1.7 몫과 나머지를 함께 구하기

몫과 나머지를 함께 구하려면 divmod()를 사용할 수 있다.

결과값은 위와 같이 (몫, 나머지) 의 형태로 나온다. 파이썬에서 값을 괄호로 묶은 형태를 튜플(tuple) 이라고 한다. 튜플은 아래와 같이 변수 여러개에 저장 할 수 있다. 

 

5.1.8 2진수, 8진수, 16진수

정수는 10진수 외에도 2진수, 8진수, 16진수로 표현할 수 있다

  • 2진수 : 숫자 앞에 0b 를 붙이며 0과 1을 사용한다.
  • 8진수 : 숫자 앞에 0o를 붙이며 0~7까지 사용한다.
  • 16진수 : 숫자 앞에 0x를 붙이며 0~9, A ~ F 까지 사용한다.

 

5.2 실수 계산하기

소숫점이 붙은 수들을 실수라고 한다. 아래와 같이 실수끼리의 사칙연산도 가능하다.

결과값 중에 뺄셈 부분에서 이상한 값이 나왔다. 컴퓨터는 실수를 표현할 때 오차가 발생한다. 더 자세히 알고 싶어서 부록 47.7을 확인해 봤다.

파이썬은 실수를 부동 소수점 방식으로 표현한다고 한다. 고정 소수점 방식은 표현 범위가 매우 작다는 단점이 있어서 부동 소수점 방식을 사용하는 것 같다. 실수는 무한히 많지만, 컴퓨터에서는 숫자를 비트로 표현하기 때문에 실수는 유한개의 비트로 정확하게 표현할 수 없어 유한개의 비트를 이용해서 근삿값으로 표현한다고 한다. 

 

5.2.1 실수와 정수를 함께 계산하면?

위와 같이 실수와 정수를 함께 계산하면 값은 실수로 나온다. 실수와 정수를 함께 계산하면 표현 범위가 넓은 실수로 계산된다.

 

5.2.2 값을 실수로 만들기

float() 괄호 안에 숫자, 계산식, 실수 또는 정수로 된 문자열을 넣으면 값을 강제로 실수로 변환할 수 있다.

float는 부동소수점(floating point)에서 따온 것으로 실수의 자료형을 확인해보면 <class 'float'>가 나온다.

 

5.2.3 복소수 

파이썬에서는 실수부와 허수부로 이루어진 복소수도 사용할 수 있다. 허수부는 숫자 뒤에 j 를 붙인다.

두 실수를 복소수로 만들때는 complex()를 사용한다.

 

5.3 괄호 사용하기

파이썬은 수학과 동일하게 곱셈과 나눗셈의 연산 우선 순위가 높다. 덧셈, 뺄셈, 곱셈, 나눗셈이 함께 있는 연산식에서 덧셈과 뺄셈을 먼저 계산하고 싶다면 괄호( )를 사용해야 한다.

 

5.4 퀴즈

파이썬3 버전이기 때문에 정답은 d 이다.

정답은 c 이다.

정답은 17이다.

 

5.5 연습문제 : 아파트에서 소음이 가장 심한 층수 출력하기

답은 아래 코드와 같다.

print(int(0.2467*12+4.159))

위 코드를 실행하면 결과값이 7로 나온다. 문제 조건에서 소수점 이하 자리는 버린다고 했기 때문에 int()함수를 사용하였다.

 

5.6 심사문제 : 스킬 공격력 출력하기

답은 아래 코드와 같다.

print(102 * 0.6 + 225)

 

Unit 6. 변수와 입력 사용하기

6.1 변수 만들기

파이썬에서는 "변수이름 = 값" 의 형식으로 변수를 생성하고 값을 저장한다. 변수 이름은 다음의 규칙을 지키면 원하는대로 지을 수 있다.

  • 영문 문자와 숫자를 사용한다 .
  • 대소문자를 구분한다.
  • 문자부터 시작해야 하며, 숫자로는 시작하면 안된다.
  • _(밑줄문자)로 시작할 수 있다. 
  • 특수문자는 사용할 수 없다.
  • 파이썬의 키워드(if, for, while등)는 사용할 수 없다.

변수에는 숫자와 문자를 저장할 수 있다.

 

6.1.1 변수의 자료형 알아내기

type() 괄호에 변수를 넣으면 변수의 자료형을 알아낼 수 있다. 

str은 문자열(string)에서 따온 것이다. 변수의 자료형은 변수에 들어가는 값에 따라 달라짐을 알 수 있다.

 

6.1.2 변수 여러개를 한 번에 만들기

파이썬에서는 "변수이름1, 변수이름2, 변수이름3 = 값1, 값2, 값3"의 형태로 변수 여러개를 한 번에 만들 수 있다. 나열된 순서대로 값이 할당되며, 변수와 값의 개수가 맞지 않을 경우 에러가 발생한다.

변수 여러개를 만들 때 값이 모두 같아도 된다면 다음과 같이 만들 수 도 있다.

변수1, 변수2 = 변수2, 변수1 의 형식으로 두 변수의 값을 바꿀수도 있다.

 

6.1.3 변수 삭제하기

변수는 del 키워드를 이용하여 삭제할 수 있다.

x라는 변수가 삭제되었기 때문에 x 는 정의 되지 않았다는 에러 메시지를 확인할 수 있다.

 

6.1.4 빈 변수 만들기

파이썬에서는 None을 할당하여 빈 변수를 만들 수 있다. None은 아무것도 없는 상태를 표현하는 자료형이다.

자료형이라는 설명이 있었기에 type()으로 확인해보니 다음과 같은 결과가 나왔다. NoneType라는 자료형이였다.

 

6.2 변수로 계산하기

변수는 변수끼리 계산할 수 있고, 계산한 결과를 다른 변수에 저장할 수 있다.

 

6.2.1 산술 연산 후 할당 연산자 사용하기

위 결과를 보면 a 에 20을 더했지만 계산 결과를 유지하지는 않는다. 계산 결과를 유지하려면 아래와 같이 계산 결과를 다시 변수에 저장해야한다. 

아래와 같이 할당 연산자를 사용해도 동일한 결과가 나온다.

위와 같이 산술연산자 옆에 할당연산자(=)를 붙이면 연산 결과를 변수에 저장한다.  a+=10은 a = a + 10을 축약한 형태인 것이다. 덧셈 뿐 아니라 뺄셈, 나눗셈, 곱셈, 나머지, 몫 연산도 모두 사용 가능하다.

위와 같이 할당연산자는 만들지 않은 변수에 사용하면 에러를 발생한다. 

 

6.2.2 부호 붙이기

수학과 동일하게 양수에 - 부호를 붙이면 음수가 되고, 음수에 - 부호를 붙이면 양수가 되며, 음수에 +부호를 붙이면 변화가 없다.

 

6.3 입력값을 변수에 저장하기

6.3.1 input 함수 사용하기

매번 다른 값을 변수에 할당하거나 프로그램 사용자로 부터 값을 입력 받을 때는 input 함수를 사용할 수 있다. 

input()을 입력한 후 엔터를 누르면 다음줄로 넘아간다. 그 줄에 문자열을 입력하고 엔터를 누르면 입력한 문자열이 출력된다. 

input함수는 사용자가 입력한 값을 가져오는 함수이다.

 

6.3.2 input 함수의 결과를 변수에 할당하기

아래 코드와 같이 input함수의 결과를 변수에 할당할 수 있다.

변수 = input()

변수에 입력한 문자열이 저장되고, 변수를 출력하면 입력한 값이 나온다. 하지만 위와 같은 상태에서는 함수가 실행된 다음 아무 내용이 없어서 입력을 받는 상태인지, 출력이 없는 상태인지 확인하는데 어려움이 있다. 그래서 input() 괄호안에 안내문구처럼 문자열을 넣어줄 수 있다.

사용자에게 입력받는 값의 용도를 미리 알려줄때 사용된다. 이 문자열은 프롬프트(prompt)라고도 부른다.

 

6.3.3 두 숫자의 합 구하기

아래 코드는 두 숫자를 입력받은 후, 입력받은 두 숫자의 합을 구하는 코드이다.

n1 = input('숫자 입력 1 : ')
n2 = input('숫자 입력 2 : ')

print(n1 + n2)

코드를 실행해보면 아래와 같은 결과가 나온다.

아래와 같이 input()으로 입력받은 수의 자료형을 확인해보면 str(문자열) 인것을 확인할 수 있다. input() 함수로 입력받은 값들은 자료형이 문자열이다. 

 

6.3.4 입력값을 정수로 변환하기

10 + 20의 값이 30이 나오게 하려면 아래 코드와 같이 int()함수를 사용해서 문자열을 정수로 바꿔줘야 한다.

n1 = int(input('숫자 입력 1 : '))
n2 = int(input('숫자 입력 2 : '))

print(n1 + n2)

int() 함수는 정수로 된 문자열도 정수로 변환할 수 있기 때문에 입력받은 문자열 10 과 20이 정수 10과 20으로 변환된 것이다. 

 

6.4 입력값을 변수 두 개에 저장하기 

아래와 같이 split을 사용하여 한번에 값을 여러개 입력받고, 저장할 수 있다.

변수1, 변수2 = input().split()
변수1, 변수2 = input().split('기준문자열')
변수1, 변수2 = input('문자열').split()
변수1, 변수2 = input('문자열').split('기준문자열')
n1, n2 = input('문자열 두 개 입력 : ').split() # 입력받은 값을 공백을 기준으로 분리

print(n1)
print(n2)

input에 split을 사용하면 입력받은 값을 공백을 기준으로 분리하여 선언된 변수에 순서대로 저장한다.  

 

6.4.1 두 숫자의 합 구하기

n1, n2 = input('숫자 두 개 입력 : ').split()

print(n1+n2)

위 코드의 경우에도 input로 숫자를 입력 받았기 때문에 n1 과 n2 모두 문자열 자료형이 되어 결과값으로 1020이 출력된다. 

 

6.4.2 입력값을 정수로 변환하기

10 + 20의 결과값이 30이 나오려면 n1과 n2를 정수형으로 변환해줘야 한다.

n1, n2 = input('숫자 두 개 입력 : ').split()
n1 = int(n1)
n2 = int(n2)

print(n1+n2)

또한 아래 코드와 같이 print()함수 안에서 int형으로 변환하여 더해줘도 된다.

print(int(n1)+int(n2))

 

6.4.3 map을 사용하여 정수로 변환하기

map 을 활용하면 한 줄로 정수로 변환이 가능하다. map()에 int, input(), split()을 넣으면 split의 결과를 모두 int로 변환해준다. 

n1, n2 = map(int, input('숫자 두 개 입력 : ').split())

print(n1+n2)

6.4.4 입력받은 값을 콤마를 기준으로 분리하기

split()에 기준 문자열을 지정하면 공백이 아니라 다른 문자를 기준으로 분리하는 것이 가능하다. 아래와 같이 기준 문자열로 ,(쉼표)를 지정하면 쉼표를 기준으로 입력값이 분리된다. 

n1, n2 = map(int, input('숫자 두 개 입력 : ').split(','))

print(n1+n2)

 

6.5 퀴즈

정답은 c 이다.

정답은 a,c,e,g,h 이다.

정답은 b,c 이다.

정답은 d 이다.

 

6.6 연습문제 : 정수 3개을 입력받고, 합계 출력하기

정답은 다음 코드와 같다.

a, b, c = map(int, input().split())

 

6.7 심사문제 : 변수 만들기

정답은 다음 코드와 같다.

a = 50
b = 100
c = None

 

6.8 심사문제 : 평균 점수 구하기

정답은 다음 코드와 같다.

kor, eng, math, sci = map(int, input().split())
avg = (kor + eng + math + sci) / 4
print(int(avg))

문제 조건에 평균을 출력할 때 소수점 이하는 버리라고 했기 때문에 출력할 때 int()함수를 사용하였다.

+ Recent posts