Python

OOP(Object Oriented Programming)

지야소이 2023. 7. 4. 14:02

😸 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의 특징을 확인해보았습니다.