클래스
클래스 변수 (정적 변수) & 인스턴스 변수
- 클래스 생성 이후에도 동적으로 클래스 변수를 생성가능하다.
class User:
pass
user = User()
user.name = '김철수'
user.age = 20
print(user.name, user.age)
class User :
count = 0
user1 = User()
user2 = User()
print(user1.count())
print(user2.count())
User.count = 100
print(User.count)
@classmethod & @staticmethod
- 객체를 생성하지 않아도 접근할 수 있는 메서드 정의 시에 사용
class Calculator:
count = 0
@classmethod
def add(clz, num1, num2):
clz.count += 1
print('호출 횟수 : ', clz.count)
return num1 + num2
@staticmethod
def minus(num1, num2):
return num1 - num2
Calculator.add(10, 20)
Calculator.minus(20, 10)
예외 처리
1. 구문 오류 (Syntax Error) & 런타임 예외 (Exception)
- 구문 오류 (Syntax Error)
- 파이썬 문법상의 문제
- 인터프리터가 해석 -> 실행(런타임) X
- 런타임 에러 (Exception)
- 문법상에는 문제 X
- 논리적 오류
- 실행 과정 중에서 발생하는 문제
2. 파이썬 대표 예외
- IndexError
- 리스트, 튜플 등 인덱스로 접근하는 객체에서 없는 인덱스로 접근하면 예외 발생

- ValueError
- 특정 자료형으로 변환이 불가하거나 처리가 어려울때 발생 (int, float)

- TypeError
- Ex) 다른 타입끼리 연산을 하는 경우

- ZeroDivisionError
- 0으로 나누었을때 발생

3. try - except - else - finally
- 예외처리 구문
- 모든 예외 클래스는 Exception의 자식 클래스
- 예외를 특정하지 못하는 경우 Exceptiond으로 처리 가능
try :
except:
else :
finally:
try :
num = int(input())
result = 10 / num
print(result)
except:
print('0 넣으면 안댐')
else:
print('정상 처리')
finally:
print('로깅 처리')
try :
num = int(input())
result = 10 / num
print(result)
except ZeroDivisionError:
print('0이 아닌 정수를 입력하세요.')
try :
num = int(input())
result = 10 / num
print(result)
except ZeroDivisionError:
print('0이 아닌 정수를 입력하세요.')
except ValueError:
print('정수만 입력하세요')
try :
num = int(input())
result = 10 / num
print(result)
except (ZeroDivisionError, ValueError):
print('0이 아닌 정수를 입력하세요.')
try :
num = int(input())
result = 10 / num
print(result)
except ZeroDivisionError as e:
print(e)
print('0이 아닌 정수를 입력하세요.')
try :
num = int(input())
result = 10 / num
print(result)
except ZeroDivisionError:
print('0이 아닌 정수를 입력하세요.')
except Exception as e:
print(e)
raise를 활용한 데이터 유효성 검증
raise 예외 클래스('메세지..')
def login(user_id, user_pass):
if user_id != 'user01':
raise ValueError('아이디가 일치하지 않음')
if user_pass != '1234':
raise ValueError('비밀번호가 일치하지 않음')
print('로그인 성공')
try :
login('user02', '1234')
except ValueError as e:
print(e)
print('회원 페이지에서 추가적으로 할 로직')
사용자 정의 예외
- Exception은 모든 예외의 부모클래스
- Exception을 상속 받으면 또는 Exception을 상속 받은 자식 클래스를 상속 받으면 그 클래스도 예외
def login(user_id, user_pass):
if user_id != 'user01':
raise UserIdMismatchError('아이디가 일치하지 않음')
if user_pass != '1234':
raise UserPassMismatchError('비밀번호가 일치하지 않음')
print('로그인 성공')
class UserIdMismatchError:
def __str__(self):
return '아이디가 일치 하지 않습니다.'
class UserPassMismatchError:
def __str__(self):
return '비밀번호가 일치 하지 않습니다.'
def login(userid, user_pass):
if user_id != 'user01':
raise UserIdMismatchError()
if user_pw != '1234':
raise UserPassMismatchError()
print('로그인 성공')
try :
login('user01', '1232')
except (UserIdMismatchError, UserPassMismatchError) as e:
print(e)
8. traceback
- traceback.print_exc() - 에러 스택 콘솔 출력
- traceback.format_exc() - 에러 스택 문자열로 반환
- traceback.print_stack() - 에러 없이 현재 호출 흐름 확인
import traceback
try :
result = 10 / 0
print(result)
except:
print('에러 발생')
all() & any()
- all() : 모든 요소가 True 일때 - True / 빈 리스트([]) -> True
- any() : 모든 요소 중 하나만 True 여도 - True
all([True, 1, " "])
all([False, "", False])
any([True, "", False])
any([])
len, sum, round
- len : 문자열 -> 문자열의 길이 / 리스트, 튜플 -> 요소의 갯수
- sum : 요소의 합
- round : 실수를 반올림하여 정수로 변환 : Math.ceil(..) 올림 / Math.floor(..) 내림
num = 10.56
print(round(num, 1))
print(round(num))
import math
print(math.ceil(num))
print(math.floor(num))
- statistics 모듈에 포함된 표준 라이브러리
- mean( ) : 평균
- median( ) : 중간값
import statistics
nums = [10, 15, 20, 8, 7, 100000]
print('평균 : ', statistics.mean(nums), '중앙값 : ' , statistics.median(nums))