[TIL] OOP

hyewon·2022년 1월 20일
0

TIL

목록 보기
50/59

OOP

OOP는 Object Oriented Programming의 약자로 객체 지향 프로그래밍을 뜻한다. 객체 지향이란 실제 세계를 모델링해서 소프트웨어를 개발하는 방법으로 객체 지향 프로그래밍에서는 데이터와 절차를 하나의 덩어리로 묶어서 생각하게 된다.

OOP는 class를 만들고 정보를 속성(attribute)으로, 행동은 메서드(method)로 만들게 된다.

OOP는 절차 지향 프로그래밍보다 속도가 느리고, 설계하는데에 시간이 오래 걸린다는 단점이 있지만, 코드의 재활용성이 높고 디버깅이 편하며 코딩할 때 절차 지향 프로그래밍보다 간편하다는 장점을 갖고 있다.


class와 instance

타코야끼를 만들 때, 한 알의 타코야끼마다 새로운 레시피를 적용해서 만드는게 아닌 하나의 레시피로 여러알의 타코야끼를 만든다. 이때 레시피를 class로, 각각의 타코야끼를 instance(객체)로 볼 수 있다.

class는 사전에 정의해둔 속성과 메서드의 집합이고, 객체가 메모리에 할당되어 생성되는 것을 바로 instance라고 한다.

# class
class Takoyaki:
	def eat(self):
    	print('타코야끼 맛있다')

# instance
takoyaki = Takoyaki()

self

위의 코드에서 def eat(self)를 볼 수 있는데 여기서 self는 instance 자신을 의미한다. python에서 인스턴스 메서드는 호출 시 첫번째 인자로 인스턴스 자신이 전달되도록 설계되었다.

takoyaki.eat() # 타코야끼 맛있다 
tokoyaki.eat('self?') # TypeError

self는 자기자신이 전달되기 때문에 인자를 넣어주지 않아도 정상적으로 작동된다. 만약 'self?' 넣어준다면 TypeError가 발생하게 되며, eat() takes 1 positional argument but 2 were given 라는 에러 메세지가 발생한다. eat 함수는 하나의 인자만 받는데 2개의 인자가 입력되었다는 뜻이다. 이러한 에러를 통해서 인자를 입력하지 않아도 알아서 자기자신이 전달된다는 것을 알 수 있다.



상속 (Inheritance)

클래스의 특징 중 하나는 바로 상속이 가능하다는 점이다. 상위 클래스의 모든 기능(변수, 함수)를 하위 클래스에서 재사용이 가능한 것이 바로 상속이다. 상속을 사용하면 같은 코드를 다시 한번 치지 않아도 되기 때문에 코드의 재사용성이 높아진다는 장점이 있다.

class Person:
  def __init__(self, name):
    self.name = name

  def introduce(self):
    print(f"Hi! my name's {self.name}")

class Employee(Person):
  def __init__(self, name, job):
    super().__init__(name) # super class의 __init__ 메서드 실행
    self.job = job

  def work(self):
    print(f'My job is a {self.job}')

teacher = Employee('John', 'Data Engineer')

teacher.introduce() # Hi! my name's John
teacher.work() # My job is a Data Engineer

하위 클래스에서 상위 클래스의 내용을 사용할 때super() 키워드를 사용하면 상위 클래스의 기능을 가져올 수 있다.

또한, 위의 코드에서는 나와있지 않지만 Method Overriding(메서드 오버라이딩, 메서드 재정의)를 통해서 하위 클래스에서 상위 클래스의 메서드를 재정의할 수도 있다. 오버라이딩을 하게 되면 하위 클래스에서 만든 메서드로 같은 이름의 메서드를 덮어씌운다.

추가적으로, 상속과 비슷한 기능으로 포함(Composition)이 있다. 포함은 A 클래스와 B 클래스가 있을 때 B 클래스에서 A 클래스의 일부 기능만 재사용하는 것을 뜻한다.

# 간단한 포함(Composition) 예제
class Student:
  def __init__(self, name, age):
    self.person = Person(name)
    Person.__init__(self, name)
    self.age = age

  def printInfo(self):
    print(f'name: {self.person.name}\t age: {self.age}')

s = Student('hyewon', 26)
s.printInfo() # name: hyewon	 age: 26

캡슐화

클래스를 정의할 때 내부의 속성과 메서드를 묶어서 하나의 단위를 처리할 수 있다. 이렇게 하나의 단위로 묶어서 클래스를 만드는 것을 캡슐화라고 한다.

또한 위의 사진처럼 protected 혹은 private 변수를 선언해서 외부에서 변수에 직접적으로 접근하는 것을 방지할 수 있다.


추상화 (abstraction)

추상화는 복잡한 내용에서 핵심적인 개념 및 기능을 요약하는 것을 뜻한다. 상위 클래스에서는 빈 껍데기의 메서드만 만들어놓고, 하위 클래스에서 오버라이딩 해서 사용하면 된다.

class Abs():
  def method(self):
    pass
    
class Sub(Abs):
  def method(self):
    print('Method Overriding')

+) 추상화를 사용할 때는 꼭 하위 클래스에서 메서드 오버라이딩을 사용해야한다


다형성

OOP에서 다형성은 계층 구조의 상속 관계에서 상속받은 기능 외에 다른 기능을 추가적으로 제공하고자 할 때 사용한다. 다형성을 사용하게 되면 프로그램의 작성 코드량이 줄어들고 코드의 가독성이 높아진다는 장점이 있다.

profile
우당탕탕 코린이

0개의 댓글