일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 핸즈온머신러닝
- 상관계수분석
- ML
- pandas로 그래프
- fromkeys
- 파이썬 그래프
- AISCHOO8기
- 중복된 문자제거
- ML기초
- 머신러닝
- 지하철적자원인
- 시각화
- 통계그래픽
- seaborn
- RandomForest
- figure-level
- 노인무임승차
- AI SCHOOL
- read_html
- AISCHOOL8기
- 배열 회전시키기
- 구글colab
- Seaborn 튜토리얼
- 파이썬데이터타입
- 멋쟁이사자처럼
- 멋사AI스쿨
- 미드프로젝트
- axes-level
- matplotlib.pyplot
- 배열의 유사도
- Today
- Total
코린이 성장일기
[멋사AI스쿨8기] TIL : 파이썬 문법 4일차(class) 본문
오늘은 어제의 함수보다 좀 더 복잡한 class에 대해서 배웠다.
오늘도 여전히 Today I learned를 적어보자.
클래스 Class
- 변수, 함수를 묶어서 코드를 작성하는 방법
- 객체지향을 구현하는 문법
- 객체지향? 실제세계를 모델링하여 프로그램을 개발하는 개발 방법론
- 옛날부터 프로그램을 개발하려면 혼자서 개발 어려움, 여러 명이 개발해야 함.
- 그러면 어떻게 하면 효율적으로 여러 명이 협업해서 개발할 수 있을까? > 객체지향 방법론
- 이를 구현한 문법이 class다.
- 파이썬은 완벽한 객체지향 언어라고 하기엔 아쉬움이 있다. java가 가장 완벽하고 깔끔한 객체지향 언어이다.
- 파이썬도 class를 활용해서 객체지향 방법론을 적용해서 개발할 수 있다.
- 협업을 용이하게 하기 위한 것
- 객체지향? 실제세계를 모델링하여 프로그램을 개발하는 개발 방법론
- 클래스 사용법
- 클래스 선언(코드작성) > 객체생성(메모리사용) > 메서드실행(코드실행)
- 메서드 : 클래스 안에서 선언된 함수
- 함수 : 클래스 밖에서 선언된 함수
- 클래스는 빵 틀, 혹은 설계도라고 생각하면 이해하기가 쉽다.
- 클래스 선언 (설계도작성) : 기능을 직접 사용할 수 없고, 어떻게 진행되는지 절차 보여줌
- 객체생성(제품생산) : 철이나 등등을 사용해서 제품 만들기
- 메서드실행(기능사용) : 정의해둔 알고리즘(절차)를 컴퓨터자원(CPU)를 사용해서 원하는 목적을 달성
- 클래스 선언(코드작성) > 객체생성(메모리사용) > 메서드실행(코드실행)
- 식별자 컨벤션
- 변수, 함수 : snake_case
- 클래스 : PascalCase, UpperCamelCase
그렇다면, 한 번 사용해보자.
# 클래스선언 : 코드작성
# 두개의 숫자와 덧셈기능, 뺄셈기능하는 것으로 만들어 볼 예정
# 계산기 설계 : Calculator : number1, number2, plus(), minus()
class Calculator:
number1, number2 = 1, 2
def plus(self):
return self.number1 + self.number2
def minus(self):
return self.number1 - self.number2
# 객체생성 : 메모리사용
# 앞에 스네이크면 함수호출, 파스칼케이스면 클래스로 객체를 만들어주는 문법이구나 이해하면 됨
# calc에 객체를 생성하면 number1, number2, plus(), minus() 변수 총 4개가 들어가게 됨
calc1 = Calculator()
calc2 = Calculator()
# dir() : 객체에 들어있는 변수를 출력
[var for var in dir(calc1) if var[0] != '_']
여기서 self는 뭘까?
여기서 self는 객체자신이다. 클래스를 쓰는 이유는 객체를 생성해주기 위함이고, 각 객체가 똑같은 함수를 사용할 수 있기에 이를 구별하기 위해 self를 써주는 것이다.
위의 코드에서, calc1.plus() : self.number1 + self.number2 : self == calc1
- 즉, self.number1 + self.number2 이 결국 calc1.number1 + calc1.number2 가 된다.
- calc2.plus() 에서는 calc2.number1 + calc2.number2
즉, 실행되는 메서드의 객체가 어떤 객체이냐에 따라 객체가 가진 변수, 즉 재료가 달라지기 떄문에 메서드 실행결과가 달라진다.
이제 class를 활용하여 은행계좌를 만드는 코드를 한번 짜보자.
class Account:
balance = 0
def insert(self, amount):
self.balance += amount
def withdraw(self, amount):
if self.balance >= amount:
self.balance - amount
else:
print(f'잔액이 {amount - self.balance}원 부족합니다')
그런데, balance가 초기값으로 세팅이 안되어 있다면 불량 객체가 만들어질 수 있다?
지금 코드는 짧으니까 확인이 가능하지만 초기값이 많아지거나 코드가 길어지면 헷갈릴 수 있다. 이때 우리는 생성자를 사용한다.
__init__()
이러한 형태의 메소드를 special methods라고 한다.
오늘은 생성자, 초기화 메서드를 살펴보고자 한다.
설명은 아래와 같다.
- 객체를 생성할 때 실행되는 메서드
- 변수의 초기값을 설정할 때 주로 사용
- 얘도 함수이기 때문에 초기값을 설정할 수 있다. 매서드에서 사용하는 변수는 초기에 값을 입력해주도록 설계 필요
- 불량 객체(메서드 사용 x)가 만들어질 확률을 줄여줌
위의 은행계좌 만들기에서 활용해보자
# 클래스생성 : 설계도작성
class Account:
def __init__(self, balance): # 초기값 설정이 가능하다 balance=10000
self.balance = balance
def insert(self, amount):
self.balance += amount
def withdraw(self, amount):
if self.balance >= amount:
self.balance -= amount
else:
print(f'잔액이 {amount - self.balance}원 부족합니다.')
다른 special methods는 따로 공부해보자.
객체지향 방법에서 중요한 개념인 상속에 대해서 알아보자.
상속은 다른 클래스의 변수(매서드)를 가져와서 사용하는 방법으로, 기능이 점점 추가되는 핸드폰과 같은 것이다. 아이폰1, 아이폰2, 아이폰3은 개발될수록 기존 기능에 새 기능이 추가되는 것이다. 그렇기 때문에 코드로 구현하면 기존 기능이 계속 반복되게 되므로, 이런 경우 상속을 사용하면 손 쉽게 코드를 짤 수 있다.
class iPhone1:
def call(self):
print('calling!')
class iPhone2(iPhone1):
def send_msg(self):
print('send_msg!')
class iPhone3(iPhone2):
def internet(self):
print('internet!')
특별히, 파이썬 상속은 '다중상속'이 가능하다.
# 다중상속 , 클래스 3개 생성
class Human:
def walk(self):
print('walking!')
class Korean:
def eat(self):
print('eat kimchi!')
class Indian:
def eat(self):
print('eat curry!')
# 하나의 클래스가 2개의 클래스를 상속 받음
# 내부적으로는 Human을 Korean이 받고, Human을 받은 Korean이 Jin으로 상속되는 것
class Jin(Korean, Human):
def skill(self): # Jin은 스킬을 가지고 있음
print('coding') # coding하는 스킬
jin = Jin()
show_vars(jin) # 위에서 선언한 함수
# >>> ['eat', 'skill', 'walk']
class Anchel(Indian, Human):
def skill(self):
print('speak english!')
anchel = Anchel()
anchel.eat()
jin.eat()
# >> eat curry!
#. eat kimchi!
오늘 클래스에 대한 내용은 여기까지 배웠다. 클래스에 대해서는 내일 더 배우기로 하였는데, 아직 개념이 익숙하지 않다.. 컴퓨터의 언어를 이해하려면 시간이 좀 더 필요하겠다..
추가적으로 데코레이터과 회귀분석에 대해 배웠는데, 오늘은 데코레이션까지 작성하려고 한다.
클래스 익히다가 시간이 다 가버렸다ㅜㅜ
데코레이터 decorator
- 함수에서 중복되는 코드를 빼서 데코레이터 함수로 만들어 코드를 작성하는 방법
- 원래 있던 함수에 새로운 기능을 추가한 함수로 변경할때 주로 사용함.
def func1():
print('code1')
print('code2')
print('code3')
def func2():
print('code1')
print('code4')
print('code3')
# 이 함수들에서 반복되는 코드를 데코레이터를 활용해 변경해보자.
# 위의 함수와 같은 값이 출력된다.
def deco(func): #func을 파라미터로 받고
def wrapper(*args, **kwargs): # 지역함수를 선언한다
print('code1')
func()
print('code3')
return wrapper # 지역에서 선언된 것을 전역으로 보낸다
# deco 함수의 파라미터 func에 func1이 들어감
# func1 함수는 deco 함수의 return 함수인 wrapper 함수로 변경
@deco
def func1():
print('code2')
@deco
def func2():
print('code4')
func1()
func2()
함수 위에 @표시와 함께 사용할 수 있다.
데코레이터의 활용으로 timer 데코레이터(결과 값이 나오는 시간체크), 패스워드를 맞춰야 함수의 실행이 가능하도록 하는 데코레이터를 작성해볼 수 있다.
TIL 소감
오늘은 클래스에 대해서 배우면서 생소한 개념이었다. 예전에 C를 배웠을 때는 함수만으로 모든 것을 구현했던 것 같은데, 함수 위의 함수 같은 느낌.. 친숙해지려면 시간이 좀 필요할 것 같다. 클래스를 선언하면서 든 생각은 강사님께서 말씀해주신대로 정말 실제세계를 모델링하는 느낌을 받았다. 특히 이름들을 선언해줄 때 그랬다. 알고리즘만 잘 훈련하면 정말 편리한 언어로 사용될 것 같다.
그리고 AI스쿨답게 상관계수분석방법을 코딩으로 구현하는 것을 보는데 신세계였다. 수학이 코딩이 되는 신기한 일. 재밌다. 근데 어렵다.
열공열공..
'멋사 AI스쿨8기' 카테고리의 다른 글
[멋사AI스쿨8기] WIL : 데이터 수집 기초 (0) | 2023.01.12 |
---|---|
[멋사AI스쿨8기] TIL : 파이썬 문법 5일차 (1) | 2023.01.06 |
[멋사AI스쿨8기] TIL : 파이썬 문법3일차 (0) | 2023.01.04 |
[멋사AI스쿨8기] TIL : 파이썬 문법 2일차 (0) | 2023.01.03 |
[멋사AI스쿨8기] TIL : 파이썬 문법 1일차 (0) | 2023.01.02 |