Blair  - Soul Eater Part.3_Chapter.01_파이썬 프로그래밍

• 패스트캠퍼스 데이터분석 부트캠프 12기/Python

Part.3_Chapter.01_파이썬 프로그래밍

oujin 2024. 1. 3. 01:57
728x90

01. 프로그래밍이란

▶ 폰노이만 아키텍처 : 

1. CPU (Central Processing Unit) : 컴퓨터에서 일어나는 모든 연산을 담당

2. Memory (주로 DRAM(메인메모리)) : 프로그래밍을 할 때 사용하는 모든 데이터, 코드가 올라와 있는 공간

3. Input/Output Devices : 

- storage(HDD, SSD)

- Monitor, Mouse, Keyvoard...

 

▶ 작성한 프로그램은 모두 메모리 안에 상주하고 있다.

▶ 프로그램 입장에서 모든 처리는 메모리를 기준으로 이루어진다.

▶ 스토리지: 전원이 꺼져도 정보를 저장하고 싶음, 저장하는 곳

 

▶ 스토리지(저장장치)에 있는  데이터를 불러오는 load, 메모리에 있는 내용을 저장장치에 저장하는 save

▶ 메모리에 있는 프로그램이 명령을 CPU로 보내는 fetch, CPU에서 해당 내용을 연산하고 처리하는 decode , execute 

다시 해당 내용을 메모리로 보내는 fetch지 instruction cycle이라고 부름

▶ instruction cycle을 계속 돌면서 프로그램이 컴퓨터에서 실행이 됨

 

키포인트 :

▶ 프로그래밍은 컴퓨터에게 일을 시키는 과정이다

▶ 프로그래밍의 구성 요소에는 코드 /  컴퓨터가 있다

▶ 코드는 특정 프로그래밍 언어의 문법, 의미론을 따름

▶ 컴퓨터는 폰 노이만 아키텍처로 구성되어 있다 (CPU, Memory, I/O Devices)

▶ 데이터와 프로그램은 메모리에 상주하며, 모든 연산은 CPU가 담당한다.

▶ 프로그램에서 수행한 결과를 저장하고 싶을때는 저장장치에 Save를 한다.

▶ Instructon cycle 을 통해서 CPU는 지속적으로 주어진 일을 처리합니다.

 

 

02. Python 소개 

▶ 데이터 분석이나 프로토타입 개발 등에 쓰이는 인기있는 인터프리터 기반 프로그래밍 언어

▶ 컴파일러 기반 : 코드를 파일단위로 만들어, 컴파일러 과정: 네 컴퓨터가 코드를 이해하기 쉽게 변화는것. 따라소 속도가 빠름, 머신에 최적하됨, 컴파일러 기반 언어c, c++, JAva, 단 언어가 난이도가 있음, 실행결과는 전체코드를 실행해야함, 고성능 요구시 사용

▶ 인터프리터 기반 : 코드를 짧게 쓰는걸 지향, 코드 한줄한줄 실행가능함, 쉽게 쓸 수 있다. 느리다. 유연하게 개발을 편하게 할때사용 , python 해당

▶ 파이썬에서 변수에 값을 주면 자동으로 데이터 타입이 결정된다

▶ 파이썬에서 들여쓰기를 이용해서 코드블럭을 구분한다

▶ 파이썬에는 문자열을 굉장히 편하게 사용할 수 있다. (문자열(str)이라는 데이터 타입이 따로 존재함)

▶ 파이썬은 line by line 으로 실행이 가능하다

▶ PyPI: 파이썬 패키지 인덱스, 사람들이 만들어 놓은 코드 저장소, 확장성이 좋다. (pip install "패키지이름")

 

키포인트 :

▶ 파이썬은 데이터분석, 프로토 타입 개발 등에 유리한 프로그래밍 언어

▶ 오픈소스 라이브러리를 통한 확장성이 뛰어나서 인기가 많다

 

 

03. 데이터 타입

▶데이터타입 : 프로그래밍 언어가 프로그래머의 데이터의 사용의도를 정의한 것

▶ 데이터 타입은 프로그래밍 언어마다 조금씩 다르다 → 프로그래밍 언어마다 목적이 조금씩 다르기 때문임

▶ 파이썬 3과 파이썬 2의 데이터 타입은 호환되지 않는다

▶ 데이터 타입은 우리가 사용하는 데이터를 컴퓨터가 이해가능하게 규격화 한것

▶ 컴퓨터는 정의된 데이터 타입을 통해서 해당 수치값이 어떤 의미인지 이해하고 계산 할 수 잇게 됩니다.

 

7가지 데이터 타입 : 

int : 정수

float : 실수 (정수가 아닌 나머지, 소수)

str : 문자열 (character sequence)

list : 자유롭게 변경이 가능한 여러개의 데이터 묶음

tuple : 생성 후에 변경이 불가능한 여러개의 데이터 묶음

set : 집합

dict : key-value store 방식을 가지고 저장하는 구조 (키로 값을 찾아갈 수 있는 사전 구조)

 

키포인트 :

▶ int, float, str, list, tuple, set, dict 등의 데이터 타입이 있다

▶ 데이터 타입은 프로그래밍을 할 때 기본이 되는 데이터를 담을 수 있는 그릇을 정의한것

 

실습 : 

 

 

04. IF

▶ 조건에 따라 다른 명령을 statement(코드,조건문)

▶ 파이썬에서는 조건문을 if로 다룬다

▶ 프로그래밍에서 조건에 따른 명령을 수행하는건 굉장히 중요하다

▶ 프로그램의 규칙은 모두 조건에 따른 분기(branch)에 따라 결정됨

 

키포인트 :

▶ if문을 사용할 땐, 사용에 주의 한다

▶ 조건문을 사용할 프로그래밍을 한다는건, 의사결정을 하는 것과 같다

▶ 조건에서 빠지는 것들이 없는지 항상 체크한다. 보통 edge case 에서 에러가 자주 난다

list의 처음과 끝의 원소를 indexing하는 경우(boundary condition)

 

실습 : 

 

 

05. for, while

▶ 조건에 따라 반복 작업을 수행해야 할 때 사용하는 statement (반복문)

▶ for loop : 특정횟수, 마지막 원소에 도달했는가? 가 종료의 기준

▶ while loop : 횟수상관 없이 특정 조건에 따라 종료됨

 

▶ 파이썬에서는 for, while statement로 반복 수행을 다룬다

▶ 프로그래밍에서 가장 중요한 두가지가 조건과 반복이다

▶ 컴퓨터는 단순 반복 계산에 최적화된 기계이다

▶ 어떤 작업을 반복하게 할 것인가?를 잘 생각해야 한다.

 

while : 조건에 따른 반복수행을 한다

조건이 만족하는 동안 명령을 수행한다.

특정횟수를 반복하는게 아닌 조건의 만족여부에 따라 반복을 수행한다

 

for : 횟수에 따른 반복 수행을 한다

특정 횟수를 지정 할 수도 있고, list같은 시퀀스를 처음부터 끝까지 반복하게 할 수 도 있다

주어진 여러개의 데이터를 순서대로 다룰 때 많이 사용된다.

 

키포인트 :

▶ for, while문을 사용 할 때도  사용을 주의한다

▶ 반복문을 사용하려면 하려는 일을 반복하능하게 바꿔줘야함 (decomposition)

▶ 조건문과 함꼐 사용되어 프로그램의 로직 (logic)을 구성한다

 

실습 :

 

 

06. 함수

▶ 한가지의 기능을 하는 코드 묶음

인풋을 받아서 처리하고  아웃풋을 돌려주는 코드

▶ 함수(function)는 기능(function)을 의미한다

▶ 함수의 input을 parameter(또는 argument)라고 한다

▶ 함수는 input을 받아서 주어진 기능대로 처리 한 뒤 output을 return한다.

▶ 정의한 함수를 사용하는 것을 function call 이라고 한다.

 

▶ 함수를 호출하면 정의한 code block 내의 코드를 실행함

▶ 함수의 input인 parameter 에 어떤 값이 들어오고 어떤 결과를 return 할지 잘 정해야한다

▶ 함수를 사용하면 코드를 구조화하기 쉽다

코드의 구조화가 잘되어 있으면 가독성도 높고 유지,보수를 하기가 편하다

▶ 기존 코드를 설꺠할 때부터 함수로 작성하는 경우도 있고, 우선 기능을 하는 코드를 만든 다음에 재구조화 하는 경우도 있음

▶ 이러한 작업을 refactoring 이라고 한다

▶ 구조화된 코드의 재사용성 (Reusability)가 향상된다 , 코드의 생산성 향상

 

키포인트 :  

▶ 함수를 정의해서 사용할 때도 사용이 중요하다

▶ 함수를 사용한느 이유는 코드의 재사용성을 높이기 위해 사용한다

▶ 함수들의 구조를 잘 짜면 유지보수하기 쉬운 좋은 코드를 만들 수 있다.

 

실습 : 

 

 

07. IO

▶ input, output의 약자로 컴퓨터가 데이터를 입력받고 출력하는 모든 작업을 의미한다.

▶ 프로그램 입장에서 들어오는 모든 데이터를 input, 나가는 모든 데이터를 output이라고 한다.

▶ 메인 메모리 입장에서 생각하는 들어오고 나가는 모든 데이터에 대해서 I/O처리라고 한다(단 CPU와의 소통은 제외)

▶ 사용자로부터 키보드로 입력받는 것을 stdin이라고 하며, 사용자에게 다시 결과를 모니터로 보여주는 것은 stdout라고 한다.(input() 함수 사용, input함수는 뭐든 str로 받아들여서 ' ' 로 감싸서 출력)

▶ 프로그램은 메인 메모리 상에서 존재하기 때문에, 스토리지로부터 파일을 불러온는 것도 input이고 , 프로그램의 결과를 스토리지에 저장하는 것도 output이다

▶ 스토리지와 프로그램의 사이의 I/O를 filr I/O라고 한다

 

▶ 파이썬에서는 with open()함수를 통해서 텍스트 파일을 쉽게 불러 올 수 있다.

'r' , 'w' , 'a' 등의 모드를 바꿔서 파일을 다른 옵션으로 열 수 있다. read, write, append

▶ 다른 타입의 파일을 열기 위해서 다른 라이브버리들이 필요하다

▶ 파일 타입이 binary라서 'rb' 써야함 

▶ png, jpg파일을 열기 위해서 PIL, openpyxl 라이브러리 필요

▶ csv, excel 파일 열기 위해서 pandas, csv, openpyxl 라이브러리 필요

▶ I/O가 데이터 처리를 할 때 가장 느린 파트이기 때문에 신경써줘야 한다. (performance bottlenect)

 

키포인트 : 

▶ 파이썬에서 키보드로 데이터를 입력하여면 input함수 사용

▶ 파일로 된 데이터를 읽어오려면 file I/O 처리가 필요하다. 어떤 데이터 타입의 데이터를 읽어오느냐에 따라 필요한 라이브러리가 달라진다

▶ file의 사이즈가 크면, file I/O가 데이터 처리에 치명적인 성능 저하를 가져올 수 있다.

 

실습 : 

 

 

08. OPP

▶ object orientated programing의 약자로 객체를 기반으로 프로그램을 만드는 방법론이다

▶ OOP는 실제 세상을 표현하고 있는, 여러가지 개념들을 프로그램으로 옮겨서 구현할 수 있기 위한 컨셉의 프로그래밍 패러다임 이다. -> 개념의 추상화

▶ 객체(object)라는 개념은 실제 사물 하나하나를 의미할 수 있고, 이러한 사물들이 공유하는 속성을 정의한 것을 클래스(class) 라고 한다

▶ 기존 방식은 데이터와(변수) 데이터를 처리하는 기능(함수)이 독립적이 었지만 oop는 이를 하나의 개념 (clsdd)로 묶어서 생각하기 때문에 그 객체가 처리괴는 기능을 정의 가능

▶class에는 class를 기술하는 정보를 나타내는 변수인 Class variable과 class의 특징을 설명하는 기능인 Class method를 포함한다 -> 개념의 구체화

 

▶ oop의 장점

1. 클래스 구조를 잘 설계하면 라이브러리 형태로 재사용이 쉬워진다 : 생산성향상

2. 일상 생활에 존재하는 개념을 그대로 프로그램에 구현 가능 : 자연적인 모델링

3. 클래스의 상속의 개념때문에 프로그래밍 자체의 재사용성이 극대화됨 : 재사용성 증가

4. oop를 이용하여 개발을 하게되면, 다른 기능을 수정하더라도 클래스가 서로 다르게 구현되어 있어 다른 기능에 끼치는 영향이 매우 적어질 수 있다. : 유지보수 용이성 증가

 

▶ 상속

1. 클래스는 개념의 추상화이기 때문에 해당 개념을 계승하는 하위 개념을 만들 수 있다.

2. 상위/하위 개념이 상대적으로 존재하며, 상속하는 클래스는 superclass, 상속받는 클래스는 subclass라고 말함

3. subclass는 superclass의 모든 개념을 이어받기 때문에 class variable(변수) class method 도 그대로 이어 받는다

 

▶ 다형성

1. 여러 하위 클래스가 같은 class method를 상속받게 되면 , 그 기능을 다르게 구현 할 수 있다.

2. 예를 들어 animal이라는 class에 speak()라는 method가 있다면 , 이 기능은 다른 동물을 표현하는 subclass들마다 다르게 구현될수 있다.

개=멍, 고양이=야옹, 소=음머

3. 이러한 다형성을 구현할 수 있는 기능을 method overriding 이라고 함

 

▶ 추상화

1. 추상화는 class내부에 구현된 class variable이나 class method를 직접 보지 않아도 개념상으로 사용 할 수 있게 하는 개념

2. 기능에 대한 명세나 변수의 의미만 확실하게 알면, 내부 구현은 살펴보지 않아도 됨

 

▶ 은닉화 ( encapsulation )

1. class variable이나 class method까지 단일 개념으로 구성되어 있어, 사용자가 개념 구현의 혼선을 막고 심플하게 사용 할 수 있게 만드는 특징을 말함

2.은닉화가 잘되면 사용자는 class의 내부 구현 토드를 보지 않아도 내부 데이터와 기능을 사용하는데 아무 문제가 없음

3. 우리가 사용해 왔던 모든 함수들, 데이터 타입들의 내부 구현 코드를 보지 ㅇ낳아도 개념적으로 이해하고 시용 할 수 있는 이유도 encapsulation 이 잘되기 때문

 

▶ 키포인트 :

1. OOP는 대규모 코드의 유지 보수를 편리하게 하기 위해서 생긴 프로그래밍 방법론이다

2. OOP는 구현하고자 하느 대상을 class로 정의하여 코드를 구현 할 수 있게 해준다

3. 다양한 특징들이 class를 통해서 구현된 코드가 재사용되기 편하게 해준다

4. 이러한 이유로 잘 만들어진 open source library들을 손쉽게 이용가능하다

 

 

09. Class

▶ Class를 이용해서 구현하려는 개념을 객체 Object의 현태로 찍어 낼 수 있다

▶구현하려는 대상의 특성을 class variable로 대상이 수행해야 하는 일을 class method로 구현해야한다

▶ 생성자(constroctor)를 통해서 객체를 찍어내는 틀을 정의할 수 있다

# Python Class example
class Human(superclass): # 상속을 받고 싶을 때, 상속받을 클래스 이름을 파라미터로 지정.
def __init__(self, name, weight): # Constructor
self.name = name
self.weight = weight
...
def gain_weight(self, a, b):
tmp_weight = self.weight + a
<statement>
...
return tmp_weight
>>> object1 = Human("Kim", 70) # class_name() : __init__ method call
>>> object1.name
>>> "Kim"
>>> object1.gain_weight(5, 7)
>>> 75

 

정리:

▶ 생성자는 __init__()함수를 이용하여 구현함

▶ 구현되는 객체는 self 라는 자체 변수를 가짐. self는 말그대로 객체 자기자신을 지칭

▶ self 변수를 통해서 모든 객체는 자기 자신을 구분 할 수 있음

▶ class method도 self변수를 이용해 객체를 구분함

▶ self는 class variable 이기 때문에 하나의 class내에서 통용됨

▶ class도 재사용성을 고려하여 디자인되어야 함

▶ class로 구현 할 때 제일 중요한 포인트는 "어떤 특성과 어떤 기능을 구현할 것인가" 입니다.

 

키포인트:

▶ 구현하려는 대상의 특성과 기능을 명확하게 정의

▶ OOP의 개념을 명확하게 하여 , 기능별 구현 사항을 명확하게 정의한다 (명세사항)

 

실습 :

 

 

 

728x90