Object Oriented Programming
1. 객체지향 프로그래밍
객체
- 세상의 모든 존재(객체)는 그 존재가 가지고 있는 정보와 그 존재가 할 수 있는 행동으로 구분된다.
- 예를 들면 alex라는 사람은 이름이 alex고 나이가 3 이라는 정보로 표현될 수 있으며, 사람이기에 걷거나, 말하거나 생각하는 행동 등을 할 수 있다.
- 로직을 순서대로 작성하는 ‘절차지향’ 프로그래밍과 다르게 객체지향 프로그래밍에서는 정보와 행동을 하나로 묶은 객체 를 중심으로 실제 세계를 모델링하여 표현한다.
절차지향 vs 객체지향
# 절차 지향
1. 고객이 은행에 가서 ATM기에 돈을 넣는다.
2. 고객은 현재 현금을 10,000원 소지하고 있다.
3. ATM기는 고객이 넣은 지폐를 검증한다.
4. ATM기는 만약 지폐가 문제가 없다면 고객 예금 잔고를 10,000원 증가시킨다.
5. 고객은 잔고를 확인한다. (총 잔고가 30,000원이 되었다.)
6. 고객은 잔고에서 20,000원을 인출한다.
# 객체 지향
<객체 1, 고객(사람)>
- 정보
- (1) 총 현금
- (2) 계좌 잔고
- 행동
- (1) 이동하기
- (2) 예금하기
- (3) 잔고 확인하기
- (4) 인출하기
<객체 2, ATM>
- 정보
- (1) 기기 보유 현금
- (2) 고객 금융 정보
- 행동
- (1) 지폐 검사
- (2) 지폐 수납
- (3) 지폐 반환
2. Class 문법
Class
- 속성 (Attribute)
- 객체의 정보, 데이터를 변수로 표현.
- . 으로 연결하여 Class 안의 변수 접근 가능.
- 메서드(Method)
- 객체의 행동을 함수 로 표현.
- Class 안의 함수를 메서드라고 하며 . 으로 연결하여 함수 실행.
- 예시) Elf 종족의 설계도
class Elf():
population = 0 # 인구는 0으로 시작!
ear = "Long" # 모두 귀가 길다는 속성값을 가지고 있음!
def __init__(self, name): # 생성자 메서드
self.name = name
Elf.population += 1
def talk(self): # 인스턴스 메서드
print(f'나는 {self.name}다!')
def arrow(self):
print("==슝==>")
- 클래스 변수 (population, ear) : 클래스의 속성을 정의합니다.
- 생성자 메서드 (init) : 인스턴스가 생성될 때 해당 인스턴스의 속성 등을 정의할 수 있으며 추가 정보는 self 외의 추가 인자로 받아 저장합니다.
- 인스턴스 메서드 : 향후 클래스 호출로 생성될 인스턴스가 할 수 있는 행동을 함수로 표현합니다.
이외에도 여러 매직 메서드(언더바 2개로 시작하는 메서드들)가 존재합니다. (__gt__ , __str__ 등)
Instance
- 클래스가 설계도라면 인스턴스는 정의된 설계도에 따라 찍혀 나오는 결과물(객체)
- 클래스를 호출하여 인스턴스 생성
elf1 = Elf('Legolas') # 인스턴스 생성
print(Elf.population)
elf1.talk()
elf1.arrow()
print(isinstance(elf1, Elf)) # True
# 속성 변경 혹은 추가도 가능합니다.
elf1.ear = 'Short'
elf1.height = 'Tall'
print(elf1.ear, elf1.height)
복습) 리스트를 생성하는 방법.
a = list() # 리스트 클래스의 인스턴스 생성
b = list() # 다른 인스턴스 생성
a.append(4) # 리스트 메서드
3. 상속
- 만약 ‘다크엘프’ 클래스가 필요하고, 엘프의 대부분의 특성을 물려받은 존재가 새롭게 할 수 있는 다른 일들이 있다면? 다음과 같이 상속을 통해 표현할 수 있습니다.
- 클래스가 여러개라면 인자 추가를 통해 다중 상속도 가능합니다.
class DarkElf(Elf):
def __init__(self, name, magic_power):
super().__init__(name) # 생성자의 겹치는 부분은 복사.
self.magic_power = magic_power
def magic(self): # 하위 클래스에 정의된 새로운 메서드
print(f'{self.magic_power}의 힘으로 공격!')
def arrow(self): # 상위 클래스 메서드 오버라이딩
print(f'{self.magic_power}데미지 화살!')
elf1 = DarkElf('Legolas', 80)
elf1.magic()
elf1.talk() # 상위 클래스의 메서드 사용 가능
elf1.arrow()
'Python' 카테고리의 다른 글
API를 활용한 서버 데이터 수집 & 분석 (0) | 2024.04.07 |
---|---|
이중 for문과 이차원 리스트 (1) | 2024.04.07 |
모듈 (0) | 2024.03.31 |
파이썬 메서드와 내장함수 (1) | 2024.03.31 |
함수(Function) (0) | 2024.03.31 |