8. 객체지향 프로그래밍의 특징 (OOP) : 상추캐다
안녕. 오늘은 객체지향 프로그래밍의 특징 4대장. 상추캐다 에 대해서 작성해 볼겁니다.
상추캐다?
상속, 추상화, 캡슐화, 다형성 이 4가지를 앞 제목을 따서 부르는 거랍니다. 외우기 쉽지 않나용?
1. 상속
상속 하면 무엇이 생각나나요? 부모님 유산 상속받을거야! 바로 그겁니다. 물려 받는거!! 그게 바로 상속이에요.
사진을 봅시다. Dog, Cat 은 모두 Animal의 하위 분류죠? 다시 말하면, Dog, Cat 이란 Class 는 모두 Animal 을 상속받았다! 라고 하는 겁니다.
객체 지향에서는 상속을 표시하는 방법이 참 쉽습니다. 만드려는 Class 의 ()
안에 상속받을 (어버이) Class를 쓰면 돼요.
class Person:
pass
class Dad(Person):
pass
class Baby(Dad):
pass
Dad 라는 class는 Person class를 상속받았다. 이렇게 쓰는 겁니다.
그렇다면 Baby는요? Baby는 Dad를 상속받았습니다.
그렇다면 Baby는 Person의 특징을 그대로 사용할 수 있을까요?
정답은 예! 입니다. 이제 상속. 대충 알겠죠?
Ok… 상속은 부모님의 클래스를 물려받는거! 근데 왜 쓰는데요?
class Person:
def __init__(self, name='사람', age):
self.name = name
self.age = age
def talk(self):
print(f'반갑습니다. {self.name}입니다.')
class Student:
def __init__(self, student_id, name='학생', age):
self.name = name
self.student_id = student_id
self.age = age
class Person과 Student를 비교해 봅시다. name, age 라는 변수가 똑같은데 계속 사용되고 있죠? 코드가 길어지고 비효율적이라고 느껴지지 않나요?
이때, Student 를 Person의 하위 클래스라고 생각해봅시다. 그럼 2줄을 줄일 수 있는 겁니다!
이렇게 똑같은 코드를 줄이고, 기존의 코드를 재활용 하기 위해서! 상속을 사용합니다.
그리고 상속은 바로 이 객체지향의 꽃!! Flower!! 입니다. 아주 중요한 포인트에요.
자, 그러면 부모클래스의 내용을 어떻게 사용할까요?
답은 바로 super()
입니다.
class Person:
def __init__(self, name, age, number, email):
self.name = name
self.age = age
self.number = number
self.email = email
def greeting(self):
print(f'안녕, {self.name}')
class Student(Person):
def __init__(self, name, age, number, email, student_id):
super().__init__(name, age, number, email)
self.student_id = student_id
p1 = Person('홍교수', 200, '0101231234', 'hong@gildong')
s1 = Student('학생', 20, '12312312', 'student@naver.com', '190000')
print(p1.greeting()) # 안녕, 홍교수
print(s1.greeting()) # 안녕, 학생
super()뒤에.상속받을 함수와 인자를 적어서 부모의 클래스를 상속받을 수 있는 거죠.
그리고 아래 print 문에서 볼 수 있듯이, 부모 클래스의 클래스 메서드를 자식 클래스에서도 사용 가능합니다!
부모/자식 관계가 궁금하신가요?
issubclass(자식클래스, 부모클래스)
를 통해서 확인 가능합니다. 왼쪽의 예시 경우, issubclass(Student,Person)
= True 입니다.
혹은 isinstance(인스턴스, 클래스)
로 인스턴스가 클래스의 인스턴스인지 확인 가능해요!
2. 추상화
상속이 조금 길었네요! 쉬어가는 의미로 추상화는 짧게 지나갈게요.
추상화.. 어려워서 저도 이해를 못했어요! 제가 이해한 만큼 작성해볼게요!
예를 들어서 faker 라는 패키지를 불러온다고 생각해 볼게요. (숙제한거.. 기억나죠?)
우리가 터미널에서 pip install faker
를 실행하고,
문서 맨 위에 from faker import Faker
라는 말을 적은 것, 기억하나요?
이 말의 뜻은 faker라는 패키지에서 Faker라는 class를 가져와요! 라는 뜻이에요.
우리는 Faker라는 class의 내부가 어떻게 생겼는지는 잘 모르지만, Faker class를 사용해서 인스턴스를 만들고,
메서드도 이용했었죠.
세부적인 내용은 감추고 필수적인 표현만 보여줘서 사용하는 것. 이게 바로 추상화에요.
3. 캡슐화
4. 다형성
다형성이 영어로 뭐라고 하시는지 아시나요? Polymorphism 이래요.
Poly(다양한) + morphism(형태) = 다양한 형태 그래서 다형성 이라고 해요.
서로 다른 클래스에 속해있는 객체들이 서로 다른 방식으로 응답하는 것, 다형성을 쉽게 설명하면 이렇습니다.
위에 ‘상속’ 에서 자식 클래스는 부모 클래스의 함수를 쓸 수 있다고 했잖아요?
이 때, 자식 클래스에서 상속 받을 메서드를 재정의 할 수 있어요.
이것을 메서드 오버라이딩(method overriding)
쉽게 말해 덮어쓰기 입니다.
예시를 봅시다.
class Person:
def __init__(self, name, age, number, email):
self.name = name
self.age = age
self.number = number
self.email = email
def talk(self):
print(f'안녕, {self.name}')
class Soldier(Person):
def talk(self):
print(f'안녕하십니까. {self.name} 입니다.')
p = Person("김땡땡", 25, 1, "ssafy@ssafy.com")
print(p.talk()) # 안녕, 김땡땡
s = Soldier ("김땡땡", 25, 1, "ssafy@ssafy.com")
print(s.talk()) # 안녕하십니까. 김땡땡 입니다.
- Person을 상속받은 Soldier 라는 Class에서 talk라는 함수를 재 정의했습니다. 이것이 바로 메서드 오버라이딩이에요.
Soldier class
로 만든 인스턴스인 s 에서 talk 라는 함수의 실행결과는 부모 클래스와는 다르게 김땡떙입니다. 라고 출력되는 것을 볼 수 있습니다.
Uploaded by N2T