OOP(Object Oriented Programming)
😸 OOP(Object Oriented Programming) 이란?
- 객체 지향 프로그래밍으로 설계 모형을 특정 프로그램 언어로 번역하는 작업
- 각 부분을 조립하여 전체 프로그램을 만드는 기법
👉 객체(Object, instance)
- 서로 연관된 데이터와 그 데이터를 조작하기 위한 함수를 하나의 집합에 모아놓은 것
- 이 때, 집합의 원소가 되는 변수나 함수는 member 또는 attribute라 합니다.
- 객체의 속성인 함수는 method라 합니다.
예시로 사각형의 면적을 구하는 프로그램을 만들어 보겠습니다.
# 객체 지향하지 않고 구현
h= 10 # 가로
v= 20 # 세로
def area(h,v):
return h * v
a= area(h, v)
print(a)
> 200
# 객체 지향 방식으로 구현
class Rectangle(object):
def __init__(self, h, v):
self.h = h
self.v = v
def area(self):
return self.h * self.v
r = Rectangle(10, 20)
a = r.area()
print(a)
> 200
- 여기서 r은 클래스를 통해 만들어진 객체입니다.
👉 클래스(Class)
- 객체들이 공통적으로 갖는 속성(attribute)과 행위(method)를 모아 정의 내린 것
- 위에서 Rectangle은 클래스입니다.
# 가로 1, 세로 1인 사각형
a= Rectangle(1, 1)
# 가로 4, 세로 3인 사각형
b= Rectangle(4,3)
print(a.area())
print(b.area())
> 1
12
👉 생성자(Constructor)
class aaa(object):
def __init__(self, 속성값1, 속성값2):
self.속성이름1 = 속성값1
self.속성이름2 = 속성값2
# 속성값 인수가 필요하지 않다면
pass
- 여기서 class 안에 정의된 __init__이란 함수는 생성자라고 하며 클래스 정의에서 가장 중요한 함수입니다.
- 객체를 생성할 때 함수를 호출하는데 이 때, 실제로는 __init__으로 정의된 생성자 함수가 호출됩니다.
😸 OOP의 4가지 특성
1. 추상화(Abstraction)
- 불필요한 정보는 숨기고 중요한 정보만 표현합니다.
- 기능이 없이 존재만 하는 추상 클래스에서 하위 클래스를 상속받아 다른 기능을 작성해서 사용합니다.
# abc 모듈의 클래스와 메소드를 가지고 온다. (abc : abstract base class)
from abc import *
# 추상 클래스
class Car(metaclass=ABCMeta):
# 추상 메소드
@abstractmethod # 추상 클래스의 메소드에는 @abstractmethod를 선언해줘야 함.
def accelerate(self):
pass # 기능 없음
# 상속받은 클래스
class Avante(Car):
def accelerate(self, power):
self.speed = power * 5
print(f'vroong~ \ncurrent speed is {self.speed}km/h')
# 상속받는 클래스
class M5(Car):
def accelerate(self, power):
self.speed = power * 20
print(f'vang!!! \ncurrent speed is {self.speed}km/h')
a= Avante()
b= M5()
a.accelerate(3)
b.accelerate(3)
> vroong~
current speed is 15km/h
vang!!!
current speed is 60km/h
2. 캡슐화(Encapsulation)
- data와 method를 class로 묶어 method로 접근할 수 있도록 합니다.
- 객체 내부에서 필요로 하는 정보를 은닉합니다.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
person = Person('david', 30)
# Person의 age속성에 따로 기능을 구현하지 않았지만, 클래스의 기능이 역할을 한다.
print(person.age)
> 30
3. 상속성(Inheritance)
- 상위 클래스의 모든 속성을 하위 클래스가 물려받습니다.
- 전체를 모두 상속받는 것이 아니라, 다른 클래스의 일부 기능만 재사용 가능합니다.
class person:
def __init__(self, name):
self.name = name
class Student(Person): # Person 클래스 상속 받음 (name 변수를 파라미터로 재사용)
def study(self):
print(self.name + "studies hard")
# 포함
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def greeting(self):
print(f"안녕하세요, {self.name}입니다" )
class Student(Person):
def __init__(self, name, age, studytime):
Person.__init__(self, name, age) # 완전히 받지 않고 인스턴스화
Person.greeting(self) # 기능 사용
self.time = studytime # Person의 속성이 아닌것도 사용
print(f'하루 공부는 {self.time}시간 정도 합니다.')
stu = Student('david', 30, 12)
> 안녕하세요, david입니다
하루 공부는 12시간 정도 합니다.
4. 다형성(polymorphism)
- 부모클래스로부터 물려받은 속성을 자식클래스가 재정의 가능합니다
- Overiding 가능
class Person:
def greeting(self):
print("안녕!", end='')
class Student(Person):
def greeting(self):
print("안녕하십니까!", end='')
class Teacher(Person):
def greeting(self):
print("안녕 애들아~")
stu = Student()
tea = Teacher()
stu.greeting() # 안녕하십니까!
print()
tea.greeting() # 안녕 애들아~
> 안녕하십니까!
안녕 애들아~
이상으로 python으로 OOP의 특징을 확인해보았습니다.