해당 포스팅은 네이버 부스트캠프 AI Tech 학습 정리 자료임을 알려드립니다.
1. 강의 정리
최성철 교수님 - Python Object -Oriented Programming
1) 클래스와 객체 (객체 지향 언어의 이해)
Object-Oriented Programming(OOP)는 객체 지향 프로그래밍이라고 불리며, 객체 개념을 프로그램으로 표현합니다. 속성(attribute)은 변수(variable), 행동은 함수(method)로 표현합니다. 여기서, 객체는 실생활에서 존재하는 일종의 물건이라고 볼 수 있는데, 모든 물건은 속성과 행동을 가집니다. 예를 들면, 안경이라는 객체가 있다고 했을 때, 속성에는 브랜드, 가격, 크기, 도수와 같은 것들이 존재할 것이고, 행동에는 사람에 의해서 착용되는 것들이라고 볼 수 있습니다.
OOP에서 클래스가 존재하는 데, 이 클래스는 일종의 설계도라고 생각할 수 있습니다. 그 설계도를 통해서 나온 것(실현 구현체)들을 저희는 인스턴스라고 부릅니다. 붕어빵을 만들 때, 붕어빵 틀은 클래스에 해당한다고 볼 수 있고, 만들어진 붕어빵은 인스턴스가 되겠죠. 클래스 선언 시에 네이밍 방식은 Camelcase를 활용합니다. 파이썬에서 함수/변수명은 snake_case로 네이밍 하는 것과 차이가 있습니다. 다음은 클래스를 만드는 예시입니다.
class phone(object): # object는 써주지 않아도 상관없습니다.
def __init__(self, name, brand): # 객체 초기화 예약 함수
self._name = name
self._brand = brand
def __str__(self): #print 명령어를 사용했을 때, 출력하는 명령어
return f'My phone name is {self._brand} {self._name}.'
# 객체 생성
phone1 = phone("iphone 8", "apple")
print(phone1) # My phone name is apple iphone 8.
OOP의 특징에는 상속(Inheritance), 다형성(Polymorphism), 가시성(Visibility) 세가지가 있습니다.
상속(Inheritance)은 부모클래스로부터 속성과 Method를 물려받은 자식 클래스를 생성하는 것을 말합니다. 상속을 받은 클래스는 부모 클래스의 속성과 Method를 사용할 수 있습니다.
class Person(object):
def __init__(self, name, age):
self._name = name
self._age = age
class Employee(Person): # 상속할 때, object 대신에 부모클래스를 적어줘야한다.
def __init__(self, name, age, salary):
super().__init__(name, age) #super()를 활용해서 부모클래스의 속성을 가져올 수 있음.
self._salary = salary
다형성(Polymorphism)은 같은 이름 메소드의 내부 로직을 다르게 작성하는 것을 말합니다. 같은 이름의 함수이지만 세부적인 내용이 다른 방법입니다. 아래에 코드블럭을 보시면 Cat과 Dog는 울음소리가 다른데, 이를 이름이 같은 함수로 만들지만 다른 기능을 할 수 있도록 만들어놓은 예시입니다.
class Animal(object):
def __init__(self, name):
self._name = name
def talk(self): # Abstract method
raise NotImplementedError() # "아직 구현하지 않은 부분입니다"라는 에러입니다.
class Cat(Animal): # 상속 받음
def talk(self):
return "Meow!"
class Dog(Animal): # 상속 받음
def talk(self):
return "Woof!"
animals = [Cat('Mong'), Cat('Kong'), Dog('Choco')]
for animal in animals:
print(animal.talk()) # Meow! Meow! Woof!
가시성(Visibility)은 누구나 객체에 대한 정보를 볼 수 없도록 합니다. Private 변수로 선언은 "__"처럼 언더바 2개를 변수 앞에 붙여주면 됩니다. 이렇게 변수를 설정해주면, 해당 attribute에 접근할 수 없습니다.
class Inventory(object):
def __init__(self):
self.__items = [] # 접근하지 않도록 숨김
@property #property decorator : 숨겨진 변수를 반환하게 해줌
def items(self):
return self.__items
items = my_inventory.items # 접근 가능, __items로는 접근 불가
2) 데코레이터
데코레이터(decorator)를 이해하기 위해서는 일급 객체, 내재함수, 데코레이터를 이해해야 합니다.
일급 객체는 변수나 데이터 구조에 할당이 가능한 객체를 말합니다. parameter로 전달이 가능하고 리턴 값으로 사용할 수 있습니다. 파이썬의 함수는 일급 함수라고 볼 수 있습니다.
def double(x):
return 2*x
f = double #함수를 변수에 입력하는 것이 가능하다? 일급 함수!
내재 함수는 함수 내부에 다른 함수가 포함되어 있는 것을 말합니다. 또 다른 형태의 클로저가 존재하는데, 내재 함수를 return 값으로 반환하는 방법입니다.
데코레이터는 말그대로 꾸며주는 함수인데, 동일한 기능의 함수를 여러 개에 적용할 때 주로 활용됩니다. 사용하는 방법은 사용하고자 하는 함수 위에 @함수 이름을 넣어주면 됩니다.
최성철 교수님 - Module and Project
1) 모듈
모듈은 프로그램에서의 어떤 대상의 부분 혹은 조각을 말합니다. 프로그램을 모듈화 시키면 다른 프로그램이 사용하기 쉽다는 장점이 있습니다. 파이썬에서의 모듈은 .py파일을 의미합니다. 같은 폴더에 모듈에 해당하는. py 파일과 사용하는. py을 저장한 후 import 문을 사용해서 모듈을 호출합니다. 모듈을 호출할 때 범위를 네임스페이스라고 합니다. 호출하는 방법에는 Alias를 설정하는 방법(별칭), 모듈에서 특정 함수 또는 클래스만 호출하는 방법, 모듈에서 모든 함수 또는 클래스를 호출하는 방법이 존재합니다.
# Alias 설정하기
import fah_converter as fah #fah_converter를 불러오는 데, 앞으로 fah라고 사용합니다.
print(fah.covert_c_to_f(41.6))
# 모듈에서 특정 함수 또는 클래스만 호출하기
from fah_converter import covert_c_to_f
print(covert_c_to_f(41.6)) # 함수앞에 모듈명을 적지 않아도 실행가능합니다.
# 모듈에서 모든 함수 또는 클래스를 호출하기
from fah_converter import * # 모듈 내의 모든 함수, 클래스 호출합니다.
print(covert_c_to_f(41.6))
파이썬에는 기본으로 제공하는 라이브러리인 Built-in Module들이 존재합니다. 이 모듈은 문자처리, 웹, 수학 등 다양한 모듈이 제공되는 데 위에서 모듈을 불러온 것처럼 import문으로 바로 활용이 가능합니다. 대표적으로 해당되는 모듈은 아래와 같습니다.
# 난수
import random
print(random.randint(0,100)) # 0~100 사이의 정수 난수를 생성
print(random.random()) # 일반적인 난수 생성
# 시간
import time
print(time.localtime()) # 현재 시간 출력
# 웹
import urllib.request
response = urllib.request.urlopen("http://thetemlab.io")
print(response.read())
2) 패키지
패키지는 하나의 대형 프로젝트를 만드는 코드의 묶음을 말합니다. 다양한 모듈들과 폴더로 연결되어 있고, __init__, __main__ 등 키워드 파일명이 사용되고 있습니다. 다양한 오픈 소스들이 모두 패키지로 관리되고 있습니다. 다양한 오픈소스 github를 들어가 보면 패키지가 어떻게 작성되어 있는지 모습을 확인할 수 있습니다.
3) 프로젝트
만약에 A와 B의 프로젝트를 동시에 진행하려고 합니다. A에 필요한 패키지와 B에 필요한 패키지의 버전이나 이런 부분이 충돌이 된다면 문제가 생길 것입니다. 이를 분리해줄 수 있는 것이 바로 가상환경입니다.
대표적으로, virtualenv와 conda가 존재합니다. virtualenv + pip는 가장 대표적인 가상환경 관리 도구이며 레퍼런스와 패키지 개수 측면에서 장점이 있습니다. conda는 상용 가상 환경 도구이고, 설치의 용이성과 windows에서 장점이 존재합니다. conda 가상 환경을 만드는 방법에 대해서 작성해봤습니다. 왜 윈도우에서 편하게 사용될까요? 파이썬을 설치하다 보면, C로 되어 있어서 어떤 코드는 C의 컴파일을 사용해야 합니다. 하지만, pip에는 컴파일된 코드가 들어있지 않은 경우가 있기 때문입니다.
1. 가상환경 만들기
conda create -n my_project(가상 환경 이름) python=3.9(파이썬 버전)
2. 가상환경 호출
conda activate my_project
3. 가상환경 해제
conda deactivate
4. 패키지 설치
conda install matplotlib(패키지명)
2. 피어 세션 정리
수업 관련 질문
1. super()는 언제 사용하는 것인가요? 부모의 클래스에서 만들어진 것을 사용하고자 할 때, 사용합니다. 특히, __init__의 경우 객체를 생성할 때, 부모 클래스의 속성을 같이 입력해줘야 하기에 사용합니다. 만약, 필요 없다면 사용하지 않아도 됩니다.
2. 딥러닝을 할 때에도 Generator가 사용되나요? Keras에는 ImageGenerator라는 기능을 활용해서 agumentation을 실시합니다. 세부 내용을 찾아보니 Generator 역할을 수행한다고 합니다.
3. 오버 라이딩, 오버 로딩도 다형성이라고 볼 수 있는 것인가요? 그런 것 같습니다. 하지만, 파이썬에서 오버 로딩은 크게 의미가 없는 것 같습니다. 함수 인자가 가변적이기 때문에.
3. 과제 진행 상황
1) 진행 중 : morsecode
-
소문자가 들어왔을 때, 생기는 문제 - input에 upper() 적용
-
공백 or 공백으로 이뤄진 스트링만 들어왔을 때 모스부호로 인식하는 문제 - is_validate 함수에 각각 공백에 대한 예외처리
-
글자와 글자 사이에 공백이 많이 있는 경우 - join으로 변경
-
모스부호 출력 시 띄어쓰기 안 되는 현상 고침.
-
마지막 1 Fail 잡기..ㅠㅠ
2) Baseball 관련 질문
-
이전 과제에서 질문하고 싶은 내용!(피어 세션) - 이중 while 문을 빠져나올 때, 더 깔끔하게 빠져나올 수 있는 방법은 무엇이 있을까요?