26.8.19 / Wed

BaO·2026년 8월 19일

TIL

목록 보기
5/33

클래스

클래스 변수 (정적 변수) & 인스턴스 변수

  • 클래스 생성 이후에도 동적으로 클래스 변수를 생성가능하다.
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

    # clz -> Calculator 클래스 객체 참조 변수
    # clz -> 클래스 변수, 다른 클래스 메서드를 접근하기 위한 목적
    @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. 파이썬 대표 예외

  1. IndexError
    • 리스트, 튜플 등 인덱스로 접근하는 객체에서 없는 인덱스로 접근하면 예외 발생
  1. ValueError
    • 특정 자료형으로 변환이 불가하거나 처리가 어려울때 발생 (int, float)
  1. TypeError
    • Ex) 다른 타입끼리 연산을 하는 경우
  1. 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('로깅 처리')

# num = 0 -> 0 넣으면 안댐
# num = 1 -> 10.0
# 단독 예외 처리
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: # Exception은 가장 하단에 except로 정읱
    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('에러 발생')
    # traceback.print_exc()
    # msg = traceback.format_exc()
    # print('msg : ', msg)

all() & any()

  • all() : 모든 요소가 True 일때 - True / 빈 리스트([]) -> True
  • any() : 모든 요소 중 하나만 True 여도 - True
all([True, 1, " "]) # True
all([False, "", False]) # False

any([True, "", False]) # True
any([]) # False

len, sum, round

  • len : 문자열 -> 문자열의 길이 / 리스트, 튜플 -> 요소의 갯수
  • sum : 요소의 합
  • round : 실수를 반올림하여 정수로 변환 : Math.ceil(..) 올림 / Math.floor(..) 내림
num = 10.56
print(round(num, 1)) # 소숫점 1번째 자리까지 올림
print(round(num)) # 정수 첫째 자리로 올림

import math # 수학 함수
print(math.ceil(num)) # 올림
print(math.floor(num)) # 내림

mean( ) & median( )

  • statistics 모듈에 포함된 표준 라이브러리
  • mean( ) : 평균
  • median( ) : 중간값
import statistics

nums = [10, 15, 20, 8, 7, 100000]
print('평균 : ', statistics.mean(nums), '중앙값 : ' , statistics.median(nums))
# 평균 :  16676.666666666668 중앙값 :  12.5

0개의 댓글