AI 헬스케어 3기 데이터 분석 코스 Python (5)
파이썬 필수개념
변수(variables)
자료구조(data structures)
제어문(control flow)
반복문(loops)
함수(function)
클래스(classes)
객체지향 프로그래밍
객체지향 프로그래밍(OOP)은 데이터를 어떻게 구조화하는지 정의하고 해당 데이터를 수정할 수 있는 함수를
제공하는 프로그래밍 방식입니다.
프로그램을 실제 세상의 객체처럼 구현하는 방식
데이터와 해당 데이터를 처리하는 코드를 하나로 묶어 관리
예시: 환자라는 객체는 이름, 나이, 병력(데이터)과 진료받기, 처방받기(기능)을 가짐
# 함수형 접근의 한계
def create_patient(name, age, condition):
return {"name": name, "age": age, "condition": condition}
def update_condition(patient, new_condition):
patient["condition"] = new_condition
return patient
def get_patient_info(patient):
return f"환자: {patient['name']}, 상태: {patient['condition']}"
# 데이터와 기능이 분리되어 유지보수가 어려움
patient = create_patient("김환자", 45, "고혈압")
patient = update_condition(patient, "당뇨병")
print(get_patient_info(patient))
환자: 김환자, 상태: 당뇨병
객체지향의 주요 특징
1. 캡슐화 (Encapsulation)
환자의 개인정보와 의료기록을 하나로 묶어 관리하고, 권한이 있는 사람만 접근할 수 있도록 보호
2. 상속 (Inheritance)
일반 직원 → 의사, 간호사로 확장하여 공통 특성은 재사용하고 고유 특성만 추가
3. 다형성 (Polymorphism)
환자마다 다른 치료법이지만 '치료하기'라는 같은 인터페이스 사용
4. 추상화 (Abstraction)
복잡한 의료 과정을 핵심 기능만 추출하여 단순하게 표현
절차지향 vs 객체지향
절차지향은 문제를 순차적인 함수들로 해결하는 방식이고, 객체지향은 관련된 데이터와 기능을 객체로 묶어서 해결하는 방식입니다.
# 절차지향: 기능 중심
def register_patient(name, age):
"""환자를 등록합니다"""
pass
def diagnose_patient(symptoms):
"""증상을 바탕으로 진단합니다"""
pass
def prescribe_medicine(diagnosis):
"""진단 결과에 따라 처방전을 작성합니다"""
pass
data = []
register_patient(data)
## 객체지향: 객체 중심
class Patient:
self.data = []
def register(self):
"""환자 등록을 처리합니다"""
pass
def get_diagnosis(self):
"""환자의 진단 결과를 조회합니다"""
pass
def receive_treatment(self):
"""환자가 치료를 받습니다"""
pass
클래스와 객체
💡 클래스는 데이터와 함수들의 묶음(그룹)입니다.
관련된 데이터와 함수를 하나로 묶은 설계도
하나의 클래스로 여러 객체 생성 가능
파이썬에서는 모든 것이 객체(문자열, 리스트 등도 모두 클래스의 인스턴스)
클래스: 객체를 만들기 위한 설계도 또는 템플릿
객체: 클래스로부터 만들어진 실제 인스턴스
클래스를 사용하는 이유
코드 재사용성 증가
데이터와 기능을 논리적으로 묶어서 관리 용이
대규모 프로젝트에서 코드 관리와 유지보수가 수월
# 환자 클래스 (설계도)
class Patient:
pass
# 환자 객체들 (실제 환자들)
patient1 = Patient() # 김환자
patient2 = Patient() # 이환자
patient3 = Patient() # 박환자
클래스 작성 시 지켜야 할 규칙
클래스명은 PascalCase 사용 (각 단어의 첫 글자 대문자)
클래스 안의 모든 인스턴스 메서드는 첫 번째 인자가 self
# 클래스명: PascalCase
class MedicalRecord: # ✅ 올바른 명명
pass
class medical_record: # ❌ 잘못된 명명
pass
class medicalRecord: # ❌ 잘못된 명명 (camelCase)
pass
클래스 변수 vs 인스턴스 변수
클래스 변수는 모든 인스턴스가 공유하는 변수이고, 인스턴스 변수는 각 객체마다 독립적으로 가지는 변수입니다.
class Hospital:
# 클래스 변수 - 모든 병원이 공유하는 정보
country = "대한민국"
total_hospitals = 0 # 전체 병원 수
def __init__(self, name, location):
# 인스턴스 변수 - 각 병원의 고유 정보
self.name = name
self.location = location
self.patient_count = 0
# 병원이 생성될 때마다 전체 병원 수 증가
Hospital.total_hospitals += 1 # 클래스 변수 수정
# 사용 예시
print(f"병원 생성 전 총 병원 수: {Hospital.total_hospitals}") # 0
# 병원 인스턴스 생성
hospital1 = Hospital("서울대병원", "서울")
hospital2 = Hospital("연세대병원", "서울")
# 클래스 변수는 모든 인스턴스가 공유
print(f"병원 생성 후 총 병원 수: {hospital1.total_hospitals}") # 2
print(f"병원 생성 후 총 병원 수: {hospital2.total_hospitals}") # 2
print(f"병원 생성 후 총 병원 수: {Hospital.total_hospitals}") # 2
print(hospital1.country) # 대한민국
print(hospital2.country) # 대한민국
print(Hospital.country) # 대한민국
# 인스턴스 변수는 각각 독립적
print(hospital1.name) # 서울대병원
print(hospital2.name) # 연세대병원
생성자와 self
keyboard_arrow_down
생성자 (init 메서드)
init 메서드는 객체가 생성될 때 자동으로 호출되는 특별한 메서드입니다.
객체의 초기 상태를 설정하고 인스턴스 변수를 정의하는 역할을 합니다.
class Patient:
def __init__(self, name, age, patient_id):
"""환자 객체를 초기화합니다"""
print(f"환자 {name} 등록 중...")
self.name = name # 환자명
self.age = age # 나이
self.patient_id = patient_id # 환자 ID
self.medical_history = [] # 병력
self.current_status = "대기중" # 현재 상태
print(f"환자 {name} 등록 완료!")
# 인스턴스 생성 시 __init__이 자동 호출됨
patient = Patient("김환자", 45, "P001")
환자 김환자 등록 중...
환자 김환자 등록 완료!
인스턴스 메서드
인스턴스 메서드는 특정 객체가 수행할 수 있는 동작을 정의합니다.
첫 번째 매개변수로 항상 self를 받아 객체의 속성에 접근하고 수정하여 객체가 수행할 수 있는 기능을 제공하는 역할을 합니다.
class Patient:
def __init__(self, name, age, condition):
"""환자 정보를 초기화합니다"""
self.name = name # 환자명
self.age = age # 나이
self.condition = condition # 진단명
# 인스턴스 메서드
def update_condition(self, new_condition):
"""환자의 진단명을 업데이트합니다"""
old_condition = self.condition
self.condition = new_condition
print(f"{self.name} 환자: {old_condition} → {self.condition}")
# 인스턴스 메서드
def get_basic_info(self):
"""환자의 기본 정보를 반환합니다"""
return f"{self.name}({self.age}세) - {self.condition}"
# 환자 인스턴스 생성
patient = Patient("김환자", 45, "고혈압")
# 메서드 호출
print(patient.get_basic_info())
patient.update_condition("당뇨병")
print(patient.get_basic_info())
김환자(45세) - 고혈압
김환자 환자: 고혈압 → 당뇨병
김환자(45세) - 당뇨병
생성자와 self
생성자 (init 메서드)
init 메서드는 객체가 생성될 때 자동으로 호출되는 특별한 메서드입니다.
객체의 초기 상태를 설정하고 인스턴스 변수를 정의하는 역할을 합니다.
생성자 (init 메서드)
init 메서드는 객체가 생성될 때 자동으로 호출되는 특별한 메서드입니다.
객체의 초기 상태를 설정하고 인스턴스 변수를 정의하는 역할을 합니다.
class Patient:
def __init__(self, name, age, patient_id):
"""환자 객체를 초기화합니다"""
print(f"환자 {name} 등록 중...")
self.name = name # 환자명
self.age = age # 나이
self.patient_id = patient_id # 환자 ID
self.medical_history = [] # 병력
self.current_status = "대기중" # 현재 상태
print(f"환자 {name} 등록 완료!")
# 인스턴스 생성 시 __init__이 자동 호출됨
patient = Patient("김환자", 45, "P001")
환자 김환자 등록 중...
환자 김환자 등록 완료!
# 인스턴스 출력시 데이터가 아닌 인스턴스의 주소값 반환
patient
<__main__.Patient at 0x7f8c0dc48d40>
# 인스턴스 변수 확인
print(patient.name)
print(patient.age)
print(patient.current_status)
김환자
45
대기중
self 키워드
self는 현재 객체 자신을 가리키는 대명사 역할을 합니다. 인스턴스의 속성과 메서드에 접근할 때 사용합니다.
클래스 안의 모든 인스턴스 메소드는 자동으로 첫 번째 인자를 self로 받습니다.
class Doctor:
def __init__(self, name, specialty):
"""의사 정보를 초기화합니다"""
self.name = name # 이 객체의 name
self.specialty = specialty # 이 객체의 specialty
self.patient_list = [] # 이 객체의 patient_list
def introduce(self):
"""의사의 자기소개를 합니다"""
# self를 통해 자신의 속성에 접근
return f"안녕하세요, {self.specialty} 전문의 {self.name}입니다."
def add_patient(self, patient_name):
"""환자를 담당 환자 목록에 추가합니다"""
# self를 통해 자신의 리스트에 추가
self.patient_list.append(patient_name)
print(f"{patient_name} 환자가 {self.name} 의사에게 배정되었습니다.")
# 두개의 인스턴스 생성
doctor1 = Doctor("김의사", "내과")
doctor2 = Doctor("이의사", "외과")
# 각각 자신의 정보로 소개
print(doctor1.introduce())
print(doctor2.introduce())
# 각각 자신의 환자 목록에 추가
doctor1.add_patient("환자A")
doctor2.add_patient("환자B")
print(doctor1.patient_list)
print(doctor2.patient_list)
상속 (Inheritance)
상속은 부모 클래스의 속성과 메서드를 자식 클래스가 물려받는 기능입니다.
코드 재사용성을 높이고 계층적 구조로 체계적인 클래스 설계를 가능하게 합니다.
super() 함수
super() 함수는 자식 클래스에서 부모 클래스의 메서드를 호출할 때 사용하는 내장 함수입니다.
이를 통해 부모 클래스의 기능을 유지하면서 새로운 기능을 추가할 수 있습니다.
댓글
댓글 쓰기