[플레이데이터 빅데이터 부트캠프]Python 클래스(2)

절차 지향 프로그래밍

  • 절차적 프로그래밍 언어는 메인 함수의 기준으로 함수를 절차적으로 실행하는 프로그래밍 언어이다.
  • 호출된 함수에 맞춰서 여러개의 데이터들이 복사해서 관리하는 시스템이다.(기능과 데이터의 불일치)

객체 지향 프로그래밍

  • 절차적 프로그래밍의 단점을 극복하기 위해서 만든 프로그래밍 언어이다.
  • 데이터와 기능을 주제별로 따로 만들어 놓고, 필요한 부분을 불러올 수 있다.

예시)

- 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....
  • 클래스 내에 정의횐 함수 : 메소드
    • 표현만 다르고 동작은 똑같습니다.
  • 클래스 내에 정의된 변수
    • 클래스 변수 - 클래스 내에서 정의되는 변수
    • 객체 변수 - 객체 내에서 정의되는 변수

함수와 메소드의 차이

함수 : 내장되어 있거나, 어느 자료형에서나 독자적으로 쓸 수 있다.

메소드 : 특정 자료형에서 물려받은 함수, 해당 객체에서만 사용가능하다.

클래스 내의 메소드 호출

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 정기검사를 받으셔야 합니다.