티스토리 뷰

728x90

[Day 04] 파이썬 기초 문법 3

 

1. 강의 복습 내용

더보기

** 오늘의 내용은 직접 구현을 해봐야 아는 내용이므로, 학습 정리 내용에는 이론적인 부분 위주로 정리하였음


Python Object-Oriented Programming (객체 지향 프로그래밍)

 

1. 객체 지향 프로그래밍

 * 모든 언어의 가장 기본적인 프로그래밍 기법

 - Object-Oriented Programming, OOP

 - OOP는 이러한 객체 개념을 프로그램으로 표현

(OOP는 클래스(Class)와 실제 구현체인 인스턴스(instance)로 나눔)

 - 속성은 변수(variable), 행동은 함수(method)로 표현됨

 - 파이썬 역시 개체 지향 프로그램 언어

 

2. 클래스

 * 설계도의 개념

3. 객체

 * 실생활에서 일종의 물건

 - 속성(Attribute)와 행동(Action)을 가짐

 인공지능 축구 프로그램을 작성한다고 가정하면,

객체 종류 : 팀, 선수, 심판, 공
Action : 선수 -> 공을 차다, 패스 하다 / 심판 -> 휘슬을 불다, 경고를 주다
Attribute : 선수 - 선수 이름, 포지션, 소속팀 / 팀 - 팀 이름, 팀 연고지, 팀소속 선수
* Python naming rule
- 변수와 Class명 함수명은 짓는 방식이 존재
- Snake_case : 띄어쓰기 부분에 "_"를 추가한다, 뱀처럼 늘여쓰기, 파이썬 함수 변수명에 사용
- CamelCase : 띄어쓰기 부분에 대문자, 낙타의 등 모양, 파이썬 Class명에 사용

OOP Characteristics

객체 지향 언어의 특징 -> 실제 세상을 모델링

필요한 3가지

1. Inheritance (상속)

2. Polymorphism (다형성)

3. Visibility (=Hidden Class, 가시성)

 

1. 상속 (Inheritance)

- 부모 클래스로 부터 속성과 Method를 물려받은 자식 클래스를 생성하는 것

 

2. 다형성 (Polymorphism)

- 같은 이름 메소드의 내부 로직을 다르게 작성

- Dynamic Typing 특성으로 인해 파이썬에서는 같은 부모클래스의 상속에서 주로 발생함

- 중요한 OOP의 개념

- 개념적으로 같은 일을 하지만, 구현적으로 다른일을 해줘야할 때 사용

 

3. 가시성 (Visibility)

- 객체의 정보를 볼 수 있는 레벨을 조절하는 것

- 누구나 객체 안에 모든 변수를 볼 필요가 없음

1) 객체를  사용하는 사용자가 임의로 정보 수정

2) 필요 없는 정보에는 접근 할 필요가 없음

3) 만약 제품으로 판매한다면, 소스의 보호 목적 (파이썬에선 그닥..)

* Encapsulation
- 캡슐화 또는 정보 은닉 (Information Hiding)
- Class를 설계할 때, 클래스 간 간섭/정보공유의 최소화
- 심판 클래스가 축구 선수 클래스 가족 정보를 알아야 하나?
- 캡슐을 던지듯, 인터페이스만 알아서 써야함

 


Decorate

1. First-class obejct (일급함수)

: 일등함수 또는 일급 객체

- 변수나 데이터 구조에 할당이 가능한 객체

- 파라메터로 전달이 가능 + 리턴 값으로 사용 (Ex: map 함수)

파이썬의 함수는 일급함수

2. inner function

: 함수 내에 또 다른 함수가 존재

- closures : inner function을 return값으로 반환 <- 자바스크립트에서 많이 사용

 

Decorator function은 복잡한 closures 함수를 간단하게 만들어준다.

 


Module and Project

 

- 파이썬은 대부분의 라이브러리가 이미 다른 사용자에 의해서 구현되어 있다.

 

1. Module

- 어떤 대상의 부분 혹은 조각

- 프로그램에서는 작은 조각들, 모듈들을 모아서 하나의 큰 프로그램을 개발함

- 프로그램을 모듈화 시키면 다른 프로그램이 사용하기 쉬움

 

2. Module

- 모듈을 모아 놓은 단위, 하나의 프로그램

* namespace
- 모듈을 호출할 때 범위를 정하는 방법
- 모듈 안에는 함수와 클래스 등이 존재 가능
- 필요한 내용만 골라서 호출할 수 있음
- from과 import 키워드 사용

* Built-in Modules (우리가 이미 자주 쓰고있는 내용)
- 파이썬이 기본 제공하는 라이브러리
- 문자처리, 웹, 수학 등 다양한 모듈이 제공됨
- 별다른 조치없이 import 문으로 활용가능

 

3. Pakage (패키지)

- 하나의 대형 프로젝트를 만드는 코드의 묶음

- 다양한 모듈들의 합, 폴더로 연결됨

- __init__, __main__ 등 키워드 파일명이 사용됨

- 다양한 오픈 소스들이 모두 패키지로 관리됨

* Pakage 만들기
1) 기능들을 세부적으로 나눠 폴더로 만듦
2) 각 폴더별로 필요한 모듈을 구현함
3) 폴더별로 __init__.py 구성하기
- 현재 폴더가 패키지임을 알리는 초기화 스크립트
- 없을 경우 패키지로 간주하지 않음 (3.3+ 부터는 아니지만, 그럼에도 불구하고 많이 사용)
- 하위 폴더와 py 파일(모듈)을 모두 포함함
- import와 __all__ keyword 사용
4) __main__.py 파일 만들기
* Package 내에서 다른 폴더의 모듈을 부를 때
상대 참조로 호출하는 방법
from .render import render_test
from ..sound.echo import echo_test

 

4. 가상환경 (Virtual Environment)

- 프로젝트 진행 시 필요한 패키지만 설치하는 환경

- 기본 인터프리터 + 프로젝트 종류별 패키지 설치

ex) 웹 프로젝트, 데이터 분석 프로젝트 각각 패키지 관리할 수 있는 기능

- 다양한 패키지 관리 도구를 사용한다

* 패키지 관리 도구
1) virtualenv (+pip)
2) conda
- Windows에서 장점을 가진다 -> Why? -> c로 된 코드가 있는데 pip는 컴파일이 안되있고 conda는 컴파일 되어있다.

 

 

 

2. 강의 내용을 바탕으로 실습해보기

더보기

객체 지향 프로그래밍 연습해보기

 

구현 가능한 OOP 만들기 - 노트북

- Note를 정리하는 프로그램
- 사용자는 Note에 뭔가를 적을 수 있다.
- Note에는 Content가 있고, 내용을 제거할 수 있다.
- 두 개의 노트북을 합쳐 하나로 만들 수 있다.
- Note는 Notebook에 삽입된다.
- Notebook은 Note가 삽입 될 때 페이지를 생성하며, 최고 300페이지까지 저장 가능하다.
- 300 페이지가 넘으면 더 이상 노트를 삽입하지 못한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
class Note() :
    def __init__(self,content="") :
        self.content=content
        
    def write_content(self,content) :
        self.content=content
    
    def remove_note(self) :
        self.content=""
    
    def __add__(self,other) : # 두 note들을 합쳐준다
        return self.content+other.content
    
    def __str__(self) :
        return self.content # 노트에 저장되어있는 content들을 출력
    
class NoteBook() :
    def __init__(self,title_name) :
        self.title_name=title_name
        self.notes={} # 각 페이지 별로 content 삽입 -> dict 자료형 -> {page: content}
    
    def add_note(self, note,page=0) :
        if page<0 or page>300 :
            print("페이지수가 범위를 벗어났습니다.")
            return
        if len(self.notes)<300 :
            if page==0 :
                for x in range(1,301) :
                    if x not in self.notes.keys() :
                        self.notes[x]=note
                        print(f'{x}페이지에 내용을 추가하였습니다.')
                        print(f'현재 NoteBook의 용량은 [{len(self.notes)}/300] 입니다.')
                        break
            else :
                if page in self.notes.keys() :
                    print(f'{page}에 이미 노트가 존재합니다.')
                    return
                else :
                    print(f'{page}페이지에 내용을 추가하였습니다.')
                    print(f'현재 NoteBook의 용량은 [{len(self.notes)}/300] 입니다.')
                    self.notes[page]=note
                    
    def remove_note(self,page=0) :
        if page==0 :
            for x in range(300,0,-1) :
                if x in self.notes.keys() :
                    print(f'{x}페이지의 노트를 제거합니다.')
                    self.notes.pop(x)
                    return
        else :
            if page in self.notes.keys() :
                print(f'{page}페이지의 노트를 제거합니다.')
                self.notes.pop(page)
                return 
            else :
                print(f'{page}페이지에 노트가 존재하지않습니다.')
    
    def print_note(self,page=0) :
        if page==0 :
            print("note의 페이지를 입력해주세요.")
        else :
            if page in self.notes.keys() :
                print(f'{page}에 저장된 내용입니다.')
                print(self.notes[page])
            else :
                print("해당 페이지에 노트가 없습니다.")
    
    def print_all_note(self) :
        for page,note in self.notes.items() :
            print(f'{page}에 저장된 Note 내용입니다.')
            print(note)
cs

 

Jupyter Notebook에서 실행한 결과

 


 

 

 

3. 피어세션

더보기

0121 피어세션

1. 과제 리뷰

오늘 부여된 과제라서 피어세션 시간에 과제를 이미 완료한 사람도 있는 반면 대부분 아직 과제를 완료하지 못했기 때문에, 간단히 우리가 그동안 배운 내용 부분을 다같이 리뷰하였다. 그리고 과제에서 실수 할만한 부분에 대해서 서로 공유했으며, 과제를 모두 완료하고 내일 다시 토의하기로 하였다.

 

2. 강의 내용에 대하여 토의

오늘의 강의내용은 크게 두 범주로, 1) OOP 2) 모듈과 패키지 였다. 

먼저 첫번째 OOP에 대해 나눈 내용으로는, 객체 지향 프로그래밍은 강의에 첨부된 레퍼런스와 같이 다소 호불호가 있는것 같다. 하지만 단순히 class를 선언해 코딩했다고 OOP가 아닌, 우리가 문제를 해결해야할 것들을 얼마나 효율적인 단위로 모듈화 시켜서 문제가 발생했을 때 그 문제의 해결 범위를 축소시키는 것이 OOP를 잘하고 있다고 할 수 있을 것이다 라는 결론에 도달하게 되었다. 

class란 OOP의 가장 기본적인 단위이며 Data와 Method(Function)의 집합체이다

다음으로 모듈과 패키지에서는, 우리가 지금까지 계속 사용해오던 개념이기도 하고 무심코 지나갔던 과정들을 다시한번 되새김해볼 수 있었다. 그리고 conda나 pip에서 제공하는 패키지들이 제작자 측에서 엄선하고 검열해서 리스트에 올려주는 줄 알았는데, conda cloud와 같이 누구나 플랫폼에 패키지들을 올릴 수 있고 그것을 사용할 수 있다는 점을 새롭게 알게 되었다.

 

3. 피어세션 자체 문제풀이 리뷰

그동안 배운 강의내용을 적극 활용하여 다들 열심히 문제를 풀고 팀 github에 업로드 해주었다.

그 중에서 요세푸스 문제가 파이썬에선 deque를 활용하여 rotate 함수로 아주 간단히 풀리는 것에 파이썬 자체 제공 라이브러리의 힘을 다시금 느꼈다.

https://www.acmicpc.net/problem/1158 : 요세푸스 문제

https://github.com/hunmin-hub/Python-Study/tree/main/0120 : 0120일자 문제

 

4. 피어세션 플랜 계획

어느덧 피어세션을 진행한 지 1주차가 다 끝나간다.

우리 조(35조)의 경우, 각 주 모더레이터를 주차별 커리큘럼에 가장 잘 이해하고 잘 맞는 사람이 맡아 한주를 진행하기로 하였고 다음주와 다다음주의 모더레이터를 오늘 정하였다.

그리고 1주차 동안 진행된 '파이썬에 하루빨리 익숙해지기 위한 자체 문제풀이 스터디'는 생각보다 파이썬에 익숙해지는 것에 도움이 많이 되고 있어 2주차에도 진행하되, 학습 강도에 따라 문제수를 약간 조절하자는 의견이 나와 반영하였다. (예를 들면, 문제수를 조금 줄이고 난이도를 살짝 올리는 방안)

 

https://github.com/hunmin-hub/Python-Study

 

 

4. Conclusion

더보기

오늘 강의 내용을 들으면서, 앞으로 배울 대용량의 데이터의 처리와 큰 AI 프로젝트를 수행하려면 하루 빨리 OOP에 익숙해져야 겠다는 생각이 들었다. OOP가 단순히 class를 사용한다고 OOP가 아닌, 정말로 내가 만들 프로그램의 요구사항을 잘게 최소한의 모듈 단위로 쪼개 효율적으로 만들어야 함을 명심해야겠다. 그렇기 위해서는 문제 해결능력을 키우는 것을 물론, 내가 해결해야할 것을 차분히 생각하며 효율적인 모듈 단위로 나누어볼 생각을 하는 힘을 키워야 할 것이다.

 

마지막으로 오늘 부여된 과제에 대해 간단하게 얘기하자면, 그동안에 배운 내용을 가지고 충분히 구현할 수 있었고 강의내용과 자체 피어세션 플랜에서 해당 자료구조로 푸는 문제들을 많이 접해보고 풀어왔기 때문에 큰 어려움 없이 풀 수 있었다.


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함