Class
23 Oct 2019 | Python객체 지향 프로그래밍 (OOP: Object Oriented Programming)
askcompany에서 강의(클래스 / 파이썬 차근차근 시작하기)를 들으며 정리한 내용입니다.
함수는 데이터를 어떤 순서로, 어떤 방법으로 처리할지 구조화한것이지 데이터 자체를 구조화하지 못했습니다. 또한 큰 문제를 해결하기 위해서 큰 문제를 작게 쪼갠 뒤 문제를 해결하는것이 아니라 작은 문제를 해결하는 객체를 만들고 조합하여 큰 문제를 해결하는 bottom-up 방식입니다.
객체와 인스턴스의 차이
OOP의 주요특징
- 캡슐화 : 관련 특성/기능을 하나의 클래스에 결합
- 상속 : 재활용
- 다형성 : 다른 동작을 동일한 함수로 사용할 수 있도록 지원
CLASS
사용자가 정의한 데이터 타입 변수와 함수를 한데 모은것
* tip 함수명은 snake_case, 클래스명은 CamelCase
클래스가 호출이 될 때 클래스 내에 정의해준 __init__함수가 자동 호출되며, 호출시 넘겨진 모든 인자들이 이 함수로 전달됩니다.
클래스 변수와 인스턴스 변수
class Dog:
def __init__(self):
self.tricks = []
def add_tricks(self, hi):
self.tricks.append(hi)
dog1 = Dog()
dog1.add_tricks('roll')
dog2 = Dog()
dog2.add_tricks('dead')
print(dog1.tricks)
print(dog2.tricks)
macui-MacBookPro:Desktop haeyong$ python test.py
['roll', 'dead']
['roll', 'dead']
class Dog:
tricks = []
def add_tricks(self, trick):
self.tricks.append(trick)
dog1 = Dog()
dog1.add_tricks('roll')
dog2 = Dog()
dog2.add_tricks('dead')
print(dog1.tricks)
print(dog2.tricks)
macui-MacBookPro:Desktop haeyong$ python test.py
['roll']
['dead']
두 코드의 차이를 보세요 클래스 변수와 인스턴스 변수의 차이입니다. 실행결과도 다릅니다.
__init__안에 선언된 변수가 인스턴스 변수입니다. 객체, 인스턴스를 생성할 때 호출되는 함수이고 이 함수로 인자가 전달되므로 이 인스턴스 고유의 변수가 됩니다!.
init밖에 선언하면 클레스 자체의 변수가 되기 때문에 어떤 객체를 사용하던 공통적으로 사용되는 변수가 됩니다. 그렇기 때문에 오류가 많이 발생할것같네요…(개인적인 생각)
data hiding, name mangling 데이터 은닉, 이름 장식
파이썬에는 다른 언어에서 지원하는 public, private, protected같은것을 지원하지 않습니다. 이를 대신할 수 있는것이 mangling
class Animal(name):
def __init__(self, name):
self.__name = name
mangling은 self. 옆에 underscore 2개 (__)를 붙여줍니다. 함수 내에서는 이름 그대로 접근해주시면 됩니다. (‘__name’)
animal = Animal('kong-e')
animal.__name
error뜹니다. 접근하려면 animal._Animal__name 이렇게 접근해야합니다. (_클래스명변수명 형태로 접근해주시면 됩니다)