추상 클래스란?
추상 클래스는 설계 목적의 클래스로 객체를 생성할 수 없고, 반드시 하위 클래스에서 구현해야 하는 추상 메서드를 포함해야 한다.
from abc import ABCMeta, abstractmethod
# 추상 클래스 정의
class Friend(metaclass=ABCMeta):
def __init__(self, name):
self.name = name # 동적 멤버 변수 name 추가
@abstractmethod
def hobby(self):
pass # 추상 메서드로, 하위 클래스에서 반드시 구현해야 함
def printName(self):
print('name:', self.name) # 이름 출력 메서드
# 추상 클래스를 상속받는 구체 클래스 Tom
class Tom(Friend):
def __init__(self, name, addr):
super().__init__(name) # 부모 클래스의 생성자를 호출하여 name 초기화
self.addr = addr # 추가적인 동적 멤버 변수 addr
def hobby(self):
print(self.addr + ' 거리를 걸어다님!') # 추상 메서드 hobby를 구현
def printAddr(self):
print('Tom addr:', self.addr) # 주소 출력 메서드
# 추상 클래스를 상속받는 또 다른 구체 클래스 James
class James(Friend):
def __init__(self, name, addr):
super().__init__(name) # 부모 클래스의 생성자를 호출하여 name 초기화
self.addr = addr # 추가적인 동적 멤버 변수 addr
def hobby(self):
print(self.addr + ' 거리를 뛰어다님!') # 추상 메서드 hobby를 구현
def printAddr(self):
print('James addr:', self.addr) # 주소 출력 메서드
# 객체 생성 및 메서드 호출
tom = Tom("톰", "종로")
tom.printName() # name: 톰 출력
tom.printAddr() # Tom addr: 종로 출력
tom.hobby() # 종로 거리를 걸어다님! 출력
print() # 줄 바꿈
james = James("제임스", "강남")
james.printName() # name: 제임스 출력
james.printAddr() # James addr: 강남 출력
james.hobby() # 강남 거리를 뛰어다님! 출력
예외 처리란?
예외 처리란 프로그램 실행 중 발생할 수 있는 오류에 대해 적절한 대응을 하는 것을 말한다. 파이썬에서는 try-except 구문을 사용한다.
# 두 수를 나누는 함수 정의
def divide(a, b):
return a / b # 0으로 나누면 예외 발생
print('프로그램 시작')
try:
# 예외가 발생할 가능성이 있는 코드
c = divide(5, 0) # 0으로 나누기 때문에 ZeroDivisionError 발생
except ZeroDivisionError:
print("두번째 값은 0이면 안됩니다.") # 0으로 나누었을 때 처리
except FileNotFoundError:
print("불러올 파일이 없습니다.") # 파일이 없을 때 처리
except Exception as e:
print("에러가 발생:", e) # 그 외의 모든 예외 처리
finally:
print('에러 유무와 상관없이 무조건 수행됨') # 예외 발생 여부와 상관없이 실행되는 블록
print('프로그램 종료') # 프로그램 종료 메시지 출력
파일 입출력 (File I/O)
Python에서는 파일을 생성, 읽기, 쓰기, 그리고 복합 객체를 파일로 저장하거나 불러올 수 있다. 이 과정에서 with 구문을 사용하면 파일을 자동으로 닫을 수 있다.
import os
try:
# 파일 열기 (쓰기 모드)
with open(os.getcwd() + r'\ftest.txt', mode='w') as f:
f.write('My friend!\n')
f.write('Have a good time!\n')
f.write('hello~\n')
# with 블록 종료 시 자동으로 파일이 닫힙니다.
except Exception as e:
print('파일 처리 에러:', e) # 예외 발생 시 메시지 출력
try:
# 파일 열기 (읽기 모드)
with open(os.getcwd() + r'\ftest.txt', mode='r') as f:
content = f.read() # 파일의 모든 내용 읽기
print(content) # 읽은 내용 출력
except Exception as e:
print('파일 처리 에러:', e) # 예외 발생 시 메시지 출력
import pickle
try:
phones = {'tom': '111-1111', '길동': '222-2333'} # 전화번호 딕셔너리
li = ['마우스', '키보드'] # 장비 리스트
t = (phones, li) # 복합 객체 (튜플)
# pickle을 이용하여 객체를 바이너리 파일로 저장
with open('test.pickle', 'wb') as f:
pickle.dump(t, f) # 복합 객체 저장
# 저장된 바이너리 파일을 읽어오기
with open('test.pickle', 'rb') as f:
a, b = pickle.load(f) # 저장된 객체 복원
print(a)
print(b)
except Exception as e:
print('에러 발생:', e) # 예외 발생 시 메시지 출력