인스턴스와 클래스 데이터

Python의 객체 지향 프로그래밍

Alex Yarosh

Content Quality Analyst @ DataCamp

OOP 핵심 원칙

 

상속(Inheritance):

  • 기존 코드의 기능 확장

다형성(Polymorphism):

  • 통일된 인터페이스 제공

캡슐화(Encapsulation):

  • 데이터와 메서드의 묶음
Python의 객체 지향 프로그래밍

인스턴스 수준 데이터

class Employee:
    def __init__(self, name, salary):
       self.name = name
       self.salary = salary

emp1 = Employee("Teo Mille", 50000) 
emp2 = Employee("Marta Popov", 65000)
  • name, salary는 인스턴스 속성입니다
  • self는 인스턴스에 바인딩됩니다
Python의 객체 지향 프로그래밍

클래스 수준 데이터

  • 클래스의 모든 인스턴스가 공유하는 데이터
  • class 본문에 클래스 속성을 정의합니다
class MyClass:
    # 클래스 속성 정의
    CLASS_ATTR_NAME = attr_value


  • 클래스 내부의 "전역 변수"
Python의 객체 지향 프로그래밍

클래스 수준 데이터

class Employee:
  # 클래스 속성 정의
  MIN_SALARY = 30000    #<--- no self. 

def __init__(self, name, salary): self.name = name # 클래스 이름으로 클래스 속성 접근 if salary >= Employee.MIN_SALARY: self.salary = salary else: self.salary = Employee.MIN_SALARY
  • MIN_SALARY는 모든 인스턴스가 공유합니다
  • 클래스 속성 정의에는 self를 쓰지 마세요
  • 클래스 속성 값 접근에는 ClassName.ATTR_NAME을 사용하세요
Python의 객체 지향 프로그래밍

클래스 수준 데이터

class Employee:
  # 클래스 속성 정의
  MIN_SALARY = 30000    

def __init__(self, name, salary): self.name = name # 클래스 이름으로 클래스 속성 접근 if salary >= Employee.MIN_SALARY: self.salary = salary else: self.salary = Employee.MIN_SALARY
emp1 = Employee("TBD", 40000)
print(emp1.MIN_SALARY)
30000
emp2 = Employee("TBD", 60000)
print(emp2.MIN_SALARY)
30000
Python의 객체 지향 프로그래밍

왜 클래스 속성을 쓰나요?

클래스와 관련된 전역 상수

 

  • 속성의 최소/최대값
  • 자주 쓰는 값과 상수(예: Circle 클래스의 pi)
  • ...
Python의 객체 지향 프로그래밍

클래스 메서드

  • 메서드는 이미 "공유"됨: 모든 인스턴스가 같은 코드 사용
  • 클래스 메서드는 인스턴스 수준 데이터를 못 씀
class MyClass:

  @classmethod                         # <--- 데코레이터로 클래스 메서드 선언

def my_awesome_method(cls, args...): # <--- cls 인자는 클래스를 가리킴 # 여기서 작업 # 인스턴스 속성은 사용 불가 :(
MyClass.my_awesome_method(args...)
Python의 객체 지향 프로그래밍

대안 생성자

class Employee:
  MIN_SALARY = 30000
  def __init__(self, name, salary=30000):
      self.name = name
      if salary >= Employee.MIN_SALARY:
        self.salary = salary
      else:
        self.salary = Employee.MIN_SALARY
  • __init__()는 하나만 가질 수 있음

  @classmethod
  def from_file(cls, filename):
      with open(filename, "r") as f:
          name = f.readline()
      return cls(name)

  • 클래스 메서드로 객체 생성
  • return으로 객체 반환
  • cls(...)__init__(...) 호출
Python의 객체 지향 프로그래밍

대안 생성자

class Employee:
  MIN_SALARY = 30000
  def __init__(self, name, salary=30000):
      self.name = name
      if salary >= Employee.MIN_SALARY:
        self.salary = salary
      else:
        self.salary = Employee.MIN_SALARY

  @classmethod
  def from_file(cls, filename):
      with open(filename, "r") as f:
          name = f.readline()
      return cls(name)        

직원 이름 한 줄이 있는 텍스트 파일

# Employee()를 직접 호출하지 않고 생성
emp = Employee.from_file("employee_data.txt")
type(emp)
__main__.Employee
Python의 객체 지향 프로그래밍

연습해 봅시다!

Python의 객체 지향 프로그래밍

Preparing Video For Download...