객체지향 프로그래밍
- 여러 독립 객체들의 상호작용(소통) 관점을 가지는 것.
객체
- '속성'과 '행동'으로 이루어진 것.
- 자동차의 바퀴, 핸들, 의자, 엑셀, 브레이크, 엔진 등은 속성이고, 주행, 정지, 좌/우회전은 행동이 된다.
- 속성과 행동을 정의할 수 있다면 객체로 표현할 수 있다.
- 파이썬에서 속성은 변수, 행동은 함수로 표현된다.
추상화(Abstraction)
- 객체 사용자에게 필요 정보만 공개하는것.
- 자동차 내부 동작 원리를 알지 못해도 운전할 수 있음.
- 변수에 값을 할당하거나, 함수를 사용하거나, 클래스를 사용하는것도 추상화
- lst.append("value") 에서 append 내부 동작은 알지 못해도 사용할 수 있음.
- 필요시 내부 로직을 파악할 수 있도록 문서화를 잘 해야놔야함.
캡슐화(Encapsulation)
- 객체 내부에 속성과 행위를 포함하는 것
- 속성과 행위에 대한 정보 은닉의 개념이 포함되어있음.
class Student(object):
def __init__(self, name, age, id, grade):
self._name = name
self._age = age
self._id = id
self.__grade = grade #__는 정보에 바로 접근할 수 없도록 막음.
@property #property decorator : 숨겨진 변수를 반환하게 해줌
def grade(self):
return self.__grade
# 인스턴스 생성
Kim = Student('Kim', 24, 201701234, 4.0)
# 변수 호출
print(Kim._name) # kim
print(Kim._age) # 24
print(Kim._id) # 201701234
print(Kim.__grade) # AttributeError: 'Student' object has no attribute '__grade'
# grade를 활용해서 호출하기
grade1 = Kim.grade
print(grade1) # 4.0
- grade 앞에 언더바(_) 두개를 붙혀서 은닉한다.
- 데코레이터를 활용하면 접근할 수 있다.
- 학생, 회사원 등의 객체는 모두 사람 객체를 기반으로 한다.
- 사람 클래스에 속성과 행동을 정의하고, 이들을 학생, 회사원 객체에서 상속받도록 하여 오류와 불일치를 없앤다.
class Person(object):
def __init__(self, name, age):
self._name = name
self._age = age
def introduce(self):
return f'My name is {self._name}, I am {self._age} years old.'
class Student(Person): # 상속할 때, object 대신에 부모클래스를 적어줘야한다.
def __init__(self, name, age, id, grade):
super().__init__(name, age) #super()를 활용해서 부모클래스의 속성을 가져올 수 있음.
self._id = id
self.__grade = grade
# 인스턴스 생성
Kim = Student('kim',24, 201701234, 4.0)
# 부모클래스로부터 상속받은 함수 사용
print(Kim.introduce()) # My name is kim, I'm 24 years old.
- 상속을 받을 때에는 class 선언 시 object 대신 상속받을 클래스명을 넣어야한다.
- 모든 동물들이 Bark하지만 Bark소리가 다 다르다. 즉 행동은 동일하나, 그 결과가 다른 것을 다형성이라고 한다.
class Animal(object):
def __init__(self, name):
self._name = name
def bark(self): # Abstract method
raise NotImplementedError() # "아직 구현하지 않은 부분입니다"라는 에러입니다.
class Cat(Animal): # 상속 받음
def bark(self):
return "Meow!"
class Dog(Animal): # 상속 받음
def bark(self):
return "Woof!"
animals = [Cat('Mong'), Cat('Kong'), Dog('Choco')]
for animal in animals:
print(animal.bark()) # Meow! Meow! Woof!