절차 지향 프로그래밍
- 절차적 프로그래밍 언어는 메인 함수의 기준으로 함수를 절차적으로 실행하는 프로그래밍 언어이다.
- 호출된 함수에 맞춰서 여러개의 데이터들이 복사해서 관리하는 시스템이다.(기능과 데이터의 불일치)
객체 지향 프로그래밍
- 절차적 프로그래밍의 단점을 극복하기 위해서 만든 프로그래밍 언어이다.
- 데이터와 기능을 주제별로 따로 만들어 놓고, 필요한 부분을 불러올 수 있다.
예시)
- TV (객체1)
- 동작(기능) = 메소드, 함수
- 켜다
- 끄다
- 소리를 키우다
- 채널을 돌리다
- 속성 = 데이터
- LED
- 50KG
- 검은색
- 사람 (객체2)
- 먹다
- 보다
- 듣다
- 프로그래밍하다
- 성별
- 몸무게 NKG
- 소파 (객체3)
- 흰색
- 100KG
- 위와 같이 그때그때 상황에 맞게끔 인스턴스와 기능을 찍어내는 방식을 객체지향 프로그래밍이라고 한다.
- 일반적으로 객체 지향 프로그래밍에서는 변수를 하나의 객체로 취급한다.
- 변수, 함수, 클래스, 객체 모두 다 메모리 주소 기준으로 구분되며,
- 달라보이는 객체도 주소가 같으면 같은 객체이다.
- 일반적으로 우리가 배우고 있는 파이썬은 객체 지향 프로그래밍 언어이다.
클래스
- 객체를 담기 위한 도구이다.
- 사용자가 정의하는 새로운 타입이다.
class Person: # 생성자 - Person을 찍어내기 위한 틀
name = ''
age = 0
gender = ''
job = ''
married = False
friends = ''
fav = {'key':'value'}
- 위의 클래스에는 사람에 대한 속성이 들어가 있다.
- int, bool, str, float, list, tuple, range .... -> 파이썬에서 미리 만들어둔 클래스들이다.
실습) Person이란 클래스를 사용하여 '우영우'라는 객체를 만들어보자.
우영우 = Person()
우영우.married = True
우영우.married = [1,2,3,4,5]
우영우.job = '변호사'
- 클래스를 사용하여 이런식으로 객체의 속성을 입력할 수 있다.
- 이와 같이 Person이라는 틀을 사용하여 '우영우'와 다른 객체들도 생성할 수 있다.
- 즉 틀을 그대로 두는 것이다.
클래스의 구조
- 속성과 기능으로 정의될 수 있습니다.
- 클래스 내부에 정의되는 변수 : 클래스의 속성
- 클래스 내부에 정의되는 함수 : 클래스의 기능
- 한 클래스에는 여러개의 속성과 기능을 담을 수 있습니다.
- Person
- 사람이 가지고 있는 특성 : 이름, 나이, 국적, 성별, .....
- 사람이 가지고 있는 기능 : 먹다, 마시다, 자다, 깨다, 일하다, 놀다, ....
- 리스트 라는 클래스:
- 속성: 원소.. [ 1. 1. 1....]
- 기능: append, extend, insert, reverse....
- Person
- 클래스 내에 정의횐 함수 : 메소드
- 표현만 다르고 동작은 똑같습니다.
- 클래스 내에 정의된 변수
- 클래스 변수 - 클래스 내에서 정의되는 변수
- 객체 변수 - 객체 내에서 정의되는 변수
함수와 메소드의 차이
함수 : 내장되어 있거나, 어느 자료형에서나 독자적으로 쓸 수 있다.
메소드 : 특정 자료형에서 물려받은 함수, 해당 객체에서만 사용가능하다.
클래스 내의 메소드 호출
class Person:
name = ''
def introduce():
print(f'안녕하세요 {name}입니다')
def introduce1(): # 지역변수 name을 찾는 문제
name = '여성민'
print(f'안녕하세요 {name}입니다')
Person.introduce()
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-144-2a0633e5df45> in <module>()
----> 1 Person.introduce() # 왜 name이 있는데 안 받아지지?
<ipython-input-142-d1b00cbd4d44> in introduce()
3
4 def introduce():
----> 5 print(f'안녕하세요 {name}입니다')
6
7 def introduce1():
NameError: name 'name' is not defined
Person.introduce1()
안녕하세요 여성민입니다
Person.introduce()는 실행되지 않는다.
왜냐하면 name이란 변수를 클래스 내에서 정의하지 않았기 때문이다.
아래와 같이 '객체 변수'를 선언하면 메소드는 작동한다.
class Person:
def introduce():
name = input("당신의 이름을 입력하세요")
print(f'안녕하세요. {name}입니다.')
Person.introduce()
당신의 이름을 입력하세요여성민
안녕하세요. 여성민입니다.
객체 변수
신짱구라는 Person의 인스턴스를 하나 만들고, 그 인스턴스의 나이, 이름, 유치원명을 담아주자.
신짱구 = Person()
신짱구.age = '6살'
신짱구.name = '신짱구'
신짱구.유치원명 = '떡잎유치원'
위와 같이 특정 각각의 인스턴스에 해당하는 변수를 '객체 변수'라고 한다.
클래스 변수
- 공유 변수라고도 한다.
- 객체와 무관없이 참조 가능한 변수이다.
class Person:
nation = 'Korea' # 클래스변수
wearing_clothes = True
def say_hi():
print('안녕하세요!')
def say_hi_instance(self):
print('안녕하세요!')
self는 객체와 메소드를 이어주는 통로라고 생각하면 이해하기 쉽다.
클래스변수를 객체에서 접근할 때
# 이름도 같이 출력되도록 위의 say_hi_instance()를 수정해주세요.
class Person:
name = ''
nation = 'Korea' # 클래스변수
wearing_clothes = True
def say_hi():
print('안녕하세요!')
def say_hi_instance(self):
print(f'{Person.name} 안녕하세요!') # Person.name - 클래스변수를 객체에서 접근
신짱구 = Person()
신짱구.name = '신짱구'
신짱구.say_hi_instance()
신짱구 안녕하세요!
객체 변수를 사용하여 클래스 안의 함수(메소드)를 호출할 때
class Person:
name = ''
nation = 'Korea' # 클래스변수
wearing_clothes = True
def say_hi():
print('안녕하세요!')
def say_hi_instance(self):
print(f'{self.name} 안녕하세요!') # self.name - 객체변수
신짱구 = Person()
신짱구.name = '신짱구' # 객체변수
신짱구.say_hi_instance() # 객체변수를 메소드(인스턴스함수)에서 호출
실습. DreamCar라는 클래스를 만들어주세요.
- 속성: 차종(str), 배기량(int), 국산차여부(bool), 희망색깔(1,2,3순위, list) 2개의 차량 인스턴스를 다시 만들어주세요
- 기능: 긱 인스턴스는 '정기검사를 받으셔야 합니다'라는 안내메시지가 출력되는 check라는 메소드를 실행할 수 있습니다.
class Dreamcar:
def __init__(self,model,engine,nation,color):
self.model = model
self.engine = engine
self.nation = nation
self.color = color
def check(self):
print(f'{self.model} 정기검사를 받으셔야 합니다.')
def check_nation(self, nation):
if self.nation == nation:
print('국산차군요')
else:
self.nation = False
포드 = Dreamcar('Ford',1500,False,['파랑','검정','빨강'])
기아 = Dreamcar('KIA',1000,True,['검정','노랑','초록'])
포드.check()
기아.check()
]
def check_nation(self, nation):
if self.nation == nation:
print('국산차군요')
else:
self.nation = False
포드 = Dreamcar('Ford',1500,False,['파랑','검정','빨강'])
기아 = Dreamcar('KIA',1000,True,['검정','노랑','초록'])
포드.check()
기아.check()
Ford 정기검사를 받으셔야 합니다.
KIA 정기검사를 받으셔야 합니다.
'플레이데이터 빅데이터 부트캠프 12기 > Python' 카테고리의 다른 글
[플레이데이터 빅데이터 부트캠프]Python 클래스(3) (0) | 2022.11.12 |
---|---|
[플레이데이터 빅데이터 부트캠프]Python 클래스(1) (0) | 2022.10.05 |
[플레이데이터 빅데이터 부트캠프]Python 셋(set) 타입 (0) | 2022.09.27 |
[플레이데이터 빅데이터 부트캠프]Python 익명 함수 vs 어플라이 함수 (0) | 2022.08.03 |
[플레이데이터 빅데이터 부트캠프]Python Open API 만들기(2) (0) | 2022.07.27 |