패키지 관리
패키지는 관련 모듈들을 하나의 폴더에 모아두는 방법입니다. 이 폴더 내에는 반드시 __init__.py 파일이 존재해야 하며, 이를 통해 해당 폴더가 패키지임을 명시한다. 패키지 이름은 폴더 이름이 된다.
패키지 생성 방법:
- 패키지 이름으로 폴더를 생성
- 폴더 안에 __init__.py 파일을 생성 (파이썬 3.3 이상에서는 선택 사항이지만 하위 호환성을 위해 권장)
- 필요한 모듈 파일들을 추가
# 만약 패키지 내에 특정 함수만 필요할 경우
from calcpkg.operation import add, mul
print(add(10, 20))
# 필요한 함수만 임포트하여 다른 패키지와 충돌을 방지
파일 처리
With 구문: with 구문을 사용하면 파일을 자동으로 열고 닫을 수 있다. 파일을 열고 닫는 과정을 자동으로 처리하므로 자원 관리가 용이하다.
with open("경로") as f:
myfile = f.read()
print(myfile)
# 이후 자동으로 파일이 닫힘
객체지향 프로그래밍 (OOP)
객체지향 프로그래밍이란? 객체지향 프로그래밍은 데이터를 객체 단위로 묶어 관리하는 방식이다. 이 방식은 실제 세계의 개념을 코드로 모델링하며, 코드를 더 직관적이고 관리하기 쉽게 만든다.
객체지향의 4가지 핵심 원칙:
- 캡슐화(Encapsulation): 데이터와 메서드를 하나의 단위로 묶어 관리.
- 상속(Inheritance): 기존 클래스의 특성을 새 클래스가 재사용.
- 다형성(Polymorphism): 같은 인터페이스로 다양한 객체를 처리.
- 추상화(Abstraction): 복잡한 시스템을 단순화하여 표현.
파이썬에서 객체지향 파이썬은 "모든 것이 객체"인 순수 객체지향 언어로, 직관적이고 간결한 문법으로 객체지향을 구현할 수 있다.
클래스 예시:
class Person:
species = "인간" # 클래스 변수
# 생성자
def __init__(self, name, age):
self.name = name # 인스턴스 변수
self.age = age
def introduce(self):
return f"안녕하세요, 저는 {self.name}이고 {self.age}살입니다."
# 객체 생성
person1 = Person("김철수", 25)
person2 = Person("이영희", 30)
print(person1.introduce()) # person1의 introduce 메서드 호출
print(person2.name) # person2의 name 접근
상속 예시:
class Student(Person):
def __init__(self, name, age, student_id):
super().__init__(name, age)
self.student_id = student_id
def introduce(self):
return f"{super().introduce()} 학번은 {self.student_id}입니다."
다형성 예시:
class Teacher(Person):
def __init__(self, name, age, subject):
super().__init__(name, age)
self.subject = subject
def introduce(self):
return f"{super().introduce()} {self.subject} 과목을 가르칩니다."
def greet_person(person):
print(person.introduce())
student = Student("박지민", 20, "2023001")
teacher = Teacher("김선생", 35, "수학")
greet_person(student)
greet_person(teacher)
캡슐화와 접근 제어
캡슐화(Encapsulation): 캡슐화는 데이터를 외부에서 직접 접근하지 못하게 하고, 이를 메서드를 통해 간접적으로 조작하는 방식이다. 파이썬에서는 접근 제어자가 없지만, 네이밍 컨벤션으로 이를 구현할 수 있다.
- _변수명: 내부에서만 사용, 권장 사항
- __변수명: 이름 맹글링을 통해 외부 접근을 어렵게 만듦
- 일반 변수명: 공개 변수
예외 처리
예외 처리의 필요성:
- 프로그램 실행 중 오류가 발생하면 프로그램이 중단된다. 예외 처리를 통해 이를 방지하고, 오류 상황에 안전하게 대응할 수 있다.
- 적절한 예외 처리는 사용자 경험을 향상시키고, 디버깅과 로깅을 용이하게 만든다.
예외 처리 기본 구조:
try:
# 예외가 발생할 가능성이 있는 코드
except:
# 예외 발생 시 실행할 코드
else:
# 예외가 발생하지 않았을 때 실행할 코드
finally:
# 예외 발생 여부와 상관없이 항상 실행할 코드
대표적인 예외들:
- ZeroDivisionError: 0으로 나누는 오류
- TypeError: 타입 불일치 오류
- ValueError: 부적절한 값 오류
- IndexError: 인덱스 범위 초과 오류
- KeyError: 존재하지 않는 딕셔너리 키 접근 오류
파이썬 컴프리헨션
컴프리헨션은 기존 시퀀스로부터 새로운 시퀀스를 생성하는 간결한 방법으로, 코드의 가독성을 높이고 성능을 최적화할 수 있다.
리스트 컴프리헨션 예시:
squares = [x**2 for x in range(10)]
print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
딕셔너리 컴프리헨션 예시:
squares_dict = {x: x**2 for x in range(5)}
print(squares_dict) # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
세트 컴프리헨션 예시:
unique_squares = {x**2 for x in range(-5, 5)}
print(unique_squares) # {0, 1, 4, 9, 16, 25}
장점:
- 코드가 간결하고 가독성이 좋음
- 성능이 최적화되어 빠름
단점:
- 복잡한 로직에는 적합하지 않음
- 디버깅이 어려울 수 있음
- 과도하게 사용하면 가독성 저하
객체지향 설계 원칙 (SOLID)
- Single Responsibility: 클래스는 하나의 책임만 가져야 한다.
- Open/Closed: 확장에는 열려 있고 수정에는 닫혀 있어야 한다.
- Liskov Substitution: 자식 클래스는 부모 클래스를 대체할 수 있어야 한다.
- Interface Segregation: 한 클래스는 자신이 사용하는 메서드만 가져야 한다.
- Dependency Inversion: 상위 모듈이 하위 모듈에 의존하면 안 된다.
파이썬 메소드 오버로딩과 오버라이딩
오버로딩은 같은 메서드 이름으로 매개변수의 개수나 타입에 따라 다른 동작을 정의하는 것이고, 오버라이딩은 부모 클래스에서 정의된 메서드를 자식 클래스에서 재정의하는 것이다.
isinstance()
isinstance()는 파이썬에서 객체가 특정 클래스나 클래스의 서브클래스의 인스턴스인지를 확인하는 함수이다. 이 함수는 두 개의 인자를 받는다:
- 객체: 확인하고자 하는 객체.
- 클래스 또는 클래스 튜플: 객체가 이 클래스(들)의 인스턴스인지 확인.
isinstance()는 객체가 주어진 클래스 또는 그 하위 클래스의 인스턴스일 경우 True를 반환하고, 그렇지 않으면 False를 반환한다.
기본 문법:
isinstance(object, classinfo)
- object: 확인하려는 객체.
- classinfo: 클래스나 클래스들의 튜플. 객체가 이 클래스 또는 하위 클래스에 속하는지 확인.
예시:
class Animal:
pass
class Dog(Animal):
pass
dog = Dog()
print(isinstance(dog, Dog)) # True, dog는 Dog 클래스의 인스턴스
print(isinstance(dog, Animal)) # True, dog는 Animal 클래스의 하위 클래스인 Dog의 인스턴스
print(isinstance(dog, object)) # True, 모든 객체는 기본적으로 object의 인스턴스
print(isinstance(dog, str)) # False, dog는 str 클래스의 인스턴스가 아님
코드에서의 사용:
if isinstance(book, Ebook):
print(f"📄 {book.title} {book.author} ({'대출 중' if book.is_borrowed else '대출 가능'}) - {book.file_size}MB")
elif isinstance(book, Book):
print(f" 📕 {book.title} {book.author} ({'대출 중' if book.is_borrowed else '대출 가능'})")
여기서 isinstance(book, Ebook)는 book 객체가 Ebook 클래스의 인스턴스인지 확인하고, 만약 그렇다면 해당 책이 전자책임을 출력한다. 그렇지 않으면 Book 클래스의 인스턴스인지 확인하여 일반 종이책인 경우 출력합니다.
'[kakao x goorm] 생성 AI 응용 서비스 개발자 양성 과정 > 회고록' 카테고리의 다른 글
[kakao x goorm] 선형대수의 기본 개념과 NumPy 활용 (0) | 2025.03.14 |
---|---|
[kakao x goorm] NumPy, Pandas, Matplotlib의 결합을 통한 데이터 분석 및 시각화 (0) | 2025.03.13 |
[kakao x goorm] 파이썬의 모듈과 파일 입출력, Git 활용 (1) | 2025.03.11 |
[kakao x goorm] 집합 (Set)과 사전 (Dictionary) 이해 및 활용 (0) | 2025.03.11 |
[kakao x goorm] 파이썬의 반복문과 컨테이너 자료형 활용 (0) | 2025.03.07 |