[2주차] class에 관하여 + 객체지향 프로그래밍

Gracie·2024년 4월 11일
0

💡 객체지향 프로그래밍에서 가장 중요한 class의 개념 정리, 이전에!! 객체지향 프로그래밍에 대해 알아보자
📌 Class 관련 정보들은 지속적으로 업데이트 예정 (update 2024.04.11)

객체지향 프로그래밍(Object-Oriented Programming, OOP)란?

  • 현실 세계의 개념을 모델링 하고 이를 개체(object)라는 단위로 표현하여 프로그램을 작성하는 방법론
  • 현실세계의 개념을 나타내는 것이 class(클래스)

객체지향 프로그래밍의 주요 특징

1. 클래스와 객체

class는 특정한 속성(attribute)기능(behavior)을 가지는 객체(object)를 생성하기 위한 탬플릿임
객체(object)는 class의 instance로서, class의 정의된 속성과 기능을 가지고 있음

2. 캡슐화(encapsulation)

데이터(Data)와 그 데이터를 다루는 메서드(methods)들을 하나로 묶어 객체로 만드는 것을 의미함
객체는 데이터에 직접 접근하는 것이 아니라, 메서드를 통해 데이터에 접근하고 조작하기 때문에 데이터의 상태를 보호하고, 응집성을 높이고, 재사용성을 높이는 등의 이점을 얻을 수 있음

3. 상속(inheritance)

이미 존재하는 class로 부터 속성, 기능을 상속받아 새로운 class를 정의할 수 있음
-> 코드의 재사용성을 높이고, 코드의 확장성을 향상시킬 수 있음

4. 다형성(polymorphism)

같은 이름의 메서드나 함수가 서로 다른 형태로 동작하는 것을 의미함,
다형성을 통해 객체들이 동이한 메서드를 호출할 때 각 객체의 특성에 맞게 적절한 동작을 수행할 수 있음


Object and variable

모든 자료형은 class임 -> 파이썬은 모든 요소들이 object(객체)로 되어있음

n = 7
print(type(n))
#출력값: class 'int'
  • Object: a value (or thing) at a memory address with a type
degrees_celsius = 26.0
#value: 26.0
#type: float
#memory address(예시): id1
  • Variable contains the memory adress of the object
    지정된 메모리 주소 안에는 type과 value가 들어있음

Class 정의

class Car:
    def __init__(self, col, length): #속성
        self.color = col
        self.length = length
    def doStop(self): #기능
        print('STOP!!')
    def doStart(self):
        print('START!!')
    def carInfo(self):
        print(f'self.color: {self.color}')
        print(f'self.length: {self.length}')
       
#class 안에 정의되는 method들은 반드시 첫번째 parameter가 'self'여야 함
  • 객체를 생성하기 위해서는 class의 생성자를 호출해야 함
  • 생성자는 보이지 않지만 class안에 들어가 있으며, 생성자 호출 시 자동으로 init method를 호출해옴 (생성자는 class 이름과 동일)
#생성자 호출 시, 매개변수를 넣어주면 객체를 초기화할 수 있음
car1 = Car('red', 200)
car2 = Car('blue', 300)

#car1, car2는 reference 변수라고 하고, 해당 변수를 통해 object 기능에 접근 가능함
car1.carInfo()
car1.doStop()
  • reference variable은 object의 메모리 주소를 저장하고, 이를 이용하여 object를 참조함 (변수와 객체의 메모리 주소는 다름)
car3 = car1
#car3는 car1이 아닌, car1에 저장된 객체 주소가 저장됨

car1.color = 'gray'
car1.len = 350
#car1을 수정하면, car3도 함께 수정됨

print(car1.color)
#출력값r: 'gray'
print(car3.color)
#출력값: 'gray'

주소값이 아닌 객체를 복사하고 싶은 경우: copy method 사용

import copy
car4 = copy.copy(car1)
car1.color = 'blue'
print(car1.color) #출력값: blue
print(car4.color) #출력값: gray

Class interitance(상속)

  • 이미 존재하는 class(superclass)로 부터 attribute과 behavior을 상속받아 새로운 class(subclass)를 정의하는 것
#superclass
class NormalCar:

    def drive(self):
        print('[NormalCar] drive() called!!')
    def back(self):
        print('[NormalCar] back() called!!')

#subclass
class TurboCar(NormalCar):

    def turbo(self):
        print('[TurboCar] turbo() called!!')


myTurboCar = TurboCar()

myTurboCar.turbo()
#출력값: [TurboCar] turbo() called!!
myTurboCar.drive()
#출력값: [NormalCar] drive() called!!
myTurboCar.back()
#출력값: [NormalCar] back() called!!

파이썬의 모든 class, method는 object의 subclass임
object is the most base type

instance(55.2, object) #True
instance('abc', object) #True
instance(str, object) #True
instance(max, object) #True

다중상속

  • 2개 이상의 클래스를 상속할 수 있음 (일반 상속과 방법 동일)
  • 너무 많은 다중 상속은 지양하기 > 동일한 코드가 있는 경우 헷갈림 (원칙적으로는 가장 먼저 상속받은 class에서 가져옴)

Over Riding

하위 클래스에서 상위 클래스의 method를 재정의(override)하는 것

super()

  • 상속된 subclass를 호출할 경우 superclass의 behavior는 바로 override할 수 있지만, attribute 초기화는 할 수 없음
  • 이를 가능하게 해주는 method가 super()
#parents class
class PClass:
    def __init__(self, pNum1, pNum2):
        print('[P_Class] __init__() called!!')
        self.pNum1 = pNum1
        self.pNum2 = pNum2
        
#child class
class CClass(PClass):
    def __init__(self, cNum1, cNum2):
        print('[C_Class] __init__() called!!')
        
        super().__init__(cNum1, cNum2) #super()를 사용하여 상위class를 호출
        #PClass.__init__(self, cNum1, cNum2) > 위의 코드와 같은 동작 실행
        self.cNum1 = cNum1
        self.cNum2 = cNum2

cls = CClass(10, 20)
print(cls.pNum1, cls.cNum1)
#출력값: 10 10

추상클래스

  • 상위 클래스에서 하위 클래스에 method 구현을 강요함
  • 추상클래스는 하위 클래스에서 구현해야하는 추상 method를 하나 이상 가지고 있는 클래스
  • abstract method란 실제 구현 없이, method의 이름만 정의한 것
  • 추상클래스는 abc모듈을 통해서 정의하고 사용할 수 있음

#abc모듈 내 ABC, abstractmethod 가져오기
from abc import ABC, abstractmethod

class Shape(ABC):
    @abstractmethod
    def area(self):
        pass

    @abstractmethod
    def perimeter(self):
        pass

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return 3.14 * self.radius * self.radius

    def perimeter(self):
        return 2 * 3.14 * self.radius
profile
비전공자의 Data Analyst 도전기 🥹✨

0개의 댓글